c++ - QtM মাল্টিমিডিয়া ব্যবহার করে একটি কাস্টম এভিআই ডেটা স্ট্রিম খেলছে




ffmpeg qtmultimedia (2)

আমি বুঝতে পারি আপনার কাছে বেশ কাস্টমাইজড বর্গ কাঠামো রয়েছে তবে সম্ভবত আপনি কোনও কোডিং নবাগতের কাছ থেকে কিছু পরামর্শ ব্যবহার করতে পারেন। আমি মনে করি আপনার কাস্টম ক্লাসগুলির সাথে আরও কিছু বেসিক বিদ্যমান ডেটা ধরণের ব্যবহার করা উচিত।

এর জন্য সমাধান: কিউমিডিয়াপ্লেয়ারের সাথে ডেটা স্ট্রিমের সময় সিঙ্ক্রোনাইজ করা:
কিছু টাইমার থ্রেড ( Thread এবং timer সংমিশ্রণ) ব্যবহার করে দেখুন। স্ট্রিম সূচকটি মাইভিডিও অডিও স্ট্রিমের যাই হোক না কেন (সূচকে ভেরিয়েবল হিসাবে সময় ব্যবহার করে) এবং "মাইকাস্টোম্রেডার" (সূচকে পরিবর্তনশীল হিসাবে সময়ের সাথে প্যাকেটের একটি অ্যারে ব্যবহার করে) এটি বডি হিসাবে ব্যবহার করুন। শরীরে এমন কিছু যুক্তি যুক্ত করুন যা কিউমিডিয়াপ্লেয়ারে অবস্থিত (@ পরিমাপ: সময়) মাধ্যমে চক্র করে। এটি থেকে আপনি একই সাথে উভয়ের এক্সিকিউশন কোডের মাধ্যমে পার্স করতে পারেন। সময় বাড়ার সাথে সাথে কিউমিডিয়া প্লেয়ারে অবস্থান এবং আপনার স্ট্রিমের সূচি আরও বাড়তে পারে।

আপনার কাস্টম স্ট্রিমে যদি কোনও সূচক বা অবস্থান না থাকে তবে আমি আপনাকে সুপারিশ করছি একটি তৈরি করুন।

আমার কাছে একটি কাস্টম এভিআই ফাইলটি খেলতে হবে যাতে ক্লাসিক ভিডিও স্ট্রিম, একটি অডিও স্ট্রিম তবে একটি কাস্টম ডেটা স্ট্রিম রয়েছে

কাস্টম স্ট্রিমে এমন ডেটা রয়েছে যা কিছু কাস্টম উইজেট দ্বারা দৃশ্যমান হয়; এই উইজেটগুলির জন্য কেবল প্রতিটি কাস্টম ফ্রেম যথাযথ সময়ে বাফারে লেখা উচিত।

আমাদের অ্যাপ্লিকেশন কিউটি ভিত্তিক, এবং ইতিমধ্যে QMediaPlayer QVideoWidget ভিডিওগুলি খেলতে QMediaPlayer / QVideoWidget ব্যবহার করে, তবে অতিরিক্ত কাস্টম স্ট্রিম জিনিসগুলিকে আরও জটিল করে তোলে, কারণ QMediaPlayer কেবল ভিডিও / অডিও খেলেন এবং অন্য সব কিছু উপেক্ষা করে।

আমি সম্পূর্ণ qt-multimedia পুনরায় উদ্ভাবন করা এড়াতে চাই, তবে উপলব্ধ কিউটি ক্লাসগুলির মধ্যে কীভাবে সেরা করা যায় তা সম্পর্কে আমি নিশ্চিত নই।

আমার ধারণা এখন পর্যন্ত:

  1. একটি কাস্টম মিডিয়া প্লেয়ার শ্রেণি লিখুন যা ffmpeg ব্যবহার করে ভিডিওকে ডেমোকড করে এবং সময় QAudioOutput , সময় প্রয়োগ করে, অডিও QAudioOutput জন্য QAudioOutput ব্যবহার করে, ভিডিওতে প্লে করার জন্য QVideoFrame এর একটি স্ট্রিম তৈরি করে এবং ভিজ্যুয়ালাইজেশনের জন্য কিছু বাফারে কাস্টম ডেটা লিখুন।

    সমস্যা : ভিডিও ফ্রেমগুলি পুনরুদ্ধার / রূপান্তর করতে কোডটি এড়াতে, আমি QVideoWidget পুনরায় ব্যবহার করতে চাই, তবে এটি কেবল "আসল" QMediaPlayer সাথে কাজ করে বলে মনে হচ্ছে।

  2. এভি স্ট্রিম সহ ইনপুট ফাইল এবং ফিড QMediaPlayer ffmpeg (সম্ভবত কিউটি ব্যাকএন্ডে ডিকোডিং রেখে) দিয়ে QIODevice করুন, ইনপুট ফাইল থেকে কেবল ভিডিও / অডিও স্ট্রিমগুলি পুনরুদ্ধার করতে একটি QIODevice এবং ডেটা স্ট্রিম পুনরুদ্ধার করার জন্য অন্য একটি রয়েছে। QMediaPlayer সাথে ভিডিও / অডিও খেলুন।

                  +-------+                          
                  | QFile |                          
                  +---^---+                          
                      |                              
                   inherits                          
                      |                              
            +--------------------+
            |    MyAviDemuxer    |
            |                    |
            |  holds a queue of  |
            |  demuxed packets   |
            +--------------------+
            |                    |
      readDataPacket      readVideoPacket
            |                    |
    +-------v--------+  +--------v-----------+            +-----------+
    | MyCustomReader |  | MyVideoAudioStream +--inherits--> QIODevice |
    +----------------+  +--------+-----------+            +-----------+
                                 |       
                              setMedia                  
                                 |                  
                         +-------v-------+           
                         | QMediaPlayer  |           
                         +---------------+           

    সমস্যা : QMediaPlayer সাথে ডেটা স্ট্রিমের সময়কে সিঙ্ক্রোনাইজ করুন, শিরোনাম শিরোনামগুলি এবং মেটাডেটা সঠিকভাবে হ্যান্ডেল করুন।

আমি বিকল্প 1 এর দিকে কিছুটা ঝোঁক, কেবল কারণ এটি আমাকে আরও নিয়ন্ত্রণ দেয়, তবে আমি ভাবছি যে আমি কোনও সহজ সমাধান (এমনকি উইন্ডোজ-কেবল) মিস করেছি কিনা wond


দেখে মনে হচ্ছে Qt প্রকৃতপক্ষে ডেটা স্ট্রিমের ধারণাকে কিছুটা ডিগ্রীতে সমর্থন করে - http://doc.qt.io/qt-5/qmediastreamscontrol.html#details বিবরণগুলি দেখায় যে এটি একটি Qmediastreamscontrol এর জন্য নির্বাচিত ধরণের স্ট্রিমগুলির মধ্যে রয়েছে।

http://doc.qt.io/qt-5/qmediaserviceproviderplugin.html সহ অন্যান্য ডক্স প্রস্তাব দেয় যে আপনি একটি QMediaServiceProviderPlugin তৈরি করতে পারেন যা ভিডিও এবং অডিও QMediaControl ইন্টারফেস প্রয়োগ করতে পারে (সম্ভবত কোনও বিদ্যমান মিডিয়া পরিষেবা সরবরাহকারীর সাবক্ল্যাসিং করে), আপনার নিজের তৈরিও করতে পারে আপনার কাঁচা ডেটা পরিচালনা করতে একটি নিয়ন্ত্রণ তৈরি করতে QMediaControl ইন্টারফেস সাবক্লাস।

আশা করি এইভাবে বাস্তবায়নের ফলে আপনি স্ট্রিমগুলি বিভক্তকরণ, শিরোনামগুলি পরিচালনা করতে এবং একই জাতীয় কার্যকারিতার জন্য বিদ্যমান সুবিধা ব্যবহার করতে পারবেন।

দুর্ভাগ্যক্রমে কিউমিডিয়া সার্ভিস তৈরির সুনির্দিষ্ট বিষয়গুলি মনে হয় "এই ডকুমেন্টেশনের আওতার বাইরে এবং সম্পর্কিত মেইলিং তালিকাগুলিতে বা আইআরসি চ্যানেলগুলিতে সহায়তা নেওয়া উচিত।" ( http://doc.qt.io/qt-5/qmediaservice.html#details )। উত্সটি ( http://code.qt.io/cgit/qt/qtmultimedia.git/tree/src/multimedia / http://code.qt.io/cgit/qt/qtmultimedia.git/tree/src/multimedia / http://code.qt.io/cgit/qt/qtmultimedia.git/tree/src/multimedia / http://code.qt.io/cgit/qt/qtmultimedia.git/tree/src/multimedia ) এর কিছুটা ব্যবহার করতে পারে, তবে এটি ছাড়াও সম্ভবত, উত্সটি http://code.qt.io/cgit/qt/qtmultimedia.git/tree/src/plugins /সিজিট / কিকিট / কেটমલ્ટিমেডিয়া.git/tree/src/ http://code.qt.io/cgit/qt/qtmultimedia.git/tree/src/plugins , এতে ডিরেক্টসশো / জিস্ট্রিমার / কোরআডিয়ো প্লাগইন অন্তর্ভুক্ত রয়েছে।

যাই হোক না কেন আমি সাবক্লাস করার চেষ্টা করব এবং যতটা সম্ভব সম্ভব পুনরায় প্রয়োগ করব







qtmultimedia