使用QtMultimedia播放自定义的AVI数据stream
我需要播放一个自定义的AVI文件,其中包含一个经典的videostream,一个audiostream, 但也是一个自定义的数据stream 。
自定义stream包含一些自定义小部件可视化的数据; 这些小部件只需要在适当的时候将每个自定义帧写入缓冲区。
我们的应用程序基于Qt,已经使用QMediaPlayer
/ QVideoWidget
来播放传统video,但额外的自定义stream使事情变得更加复杂,因为AFAIK QMediaPlayer
只播放video/audio而忽略其他所有内容。
我想避免重新创build整个qt-multimedia
,但是我不确定如何从可用的Qt类中获得最好的效果。
我到目前为止的想法是:
-
编写一个自定义媒体播放器类,使用
ffmpeg
对video进行解复用和解码,实现定时,使用QAudioOutput
播放audio,生成一串QVideoFrame
在video上播放,并将自定义数据写入某个缓冲区进行可视化。问题 :为了避免编写代码来重新缩放/转换video帧,我想重复使用
QVideoWidget
,但它似乎只适用于“真正的”QMediaPlayer
。 -
将input文件解复用并将
QMediaPlayer
与AVstream一起馈QMediaPlayer
。 将input与ffmpeg
解复用(可能将解码保留到Qt后端),有一个QIODevice
只从input文件中检索video/audiostream,而另一个则检索数据stream。 用QMediaPlayer
播放video/audio。+-------+ | QFile | +---^---+ | inherits | +--------------------+ | MyAviDemuxer | | | | holds a queue of | | demuxed packets | +--------------------+ | | readDataPacket readVideoPacket | | +-------v--------+ +--------v-----------+ +-----------+ | MyCustomReader | | MyVideoAudioStream +--inherits--> QIODevice | +----------------+ +--------+-----------+ +-----------+ | setMedia | +-------v-------+ | QMediaPlayer | +---------------+
问题是 :与
QMediaPlayer
同步数据stream的时间,正确处理标题和元数据。
我略微倾向于选项1,只是因为它给了我更多的控制权,但是我想知道是否我错过了一个更简单的解决scheme(即使是Windows)。
我知道你有相当定制的类结构,但也许你可以使用一些编码新手的build议。 我想你应该使用一些更基本的现有数据types与您的自定义类。
解决scheme:使用QMediaPlayer同步数据stream的时间:
尝试使用一些计时器线程( 线程和计时器的组合)。 使一个使用任何stream索引是MyVideoAudioStream(使用时间作为索引中的variables)和“Mycustomreader”(使用时间作为索引中的variables的数组包)作为它的主体。 在QMediaPlayer中添加一些循环遍历位置(@param:time)的逻辑。 由此可以同时parsing两者的执行代码。 随着时间的增加,QMediaPlayer中的位置和你的stream的索引会增加。
如果您的自定义stream中没有索引或位置,我强烈build议您创build一个。
看起来Qt实际上已经在一定程度上支持数据stream的概念 – http://doc.qt.io/qt-5/qmediastreamscontrol.html#details显示它是qmediastreamscontrol中可select的streamtypes之一。;
其他文档,包括http://doc.qt.io/qt-5/qmediaserviceproviderplugin.htmlbuild议您可以创build一个;QMediaServiceProviderPlugin
实现video和audioQMediaControl接口(可能通过inheritance现有的媒体服务提供商),也可以创build自己的QMediaControl
接口的子类创build一个控制来处理你的原始数据。
希望以这种方式实现将允许您使用现有的设施来拆分stream,处理标题和类似的function。
不幸的是,构buildQMediaService的细节似乎“超出了本文档的范围,并且需要在相关邮件列表或IRC频道上寻求支持”。 ( 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/plugins ,其中包括directshow / gstreamer / coreaudio插件。
无论如何,我会尝试尽可能less的子类和重新实现