使用QtMultimedia播放自定义的AVI数据stream

我需要播放一个自定义的AVI文件,其中包含一个经典的videostream,一个audiostream, 但也是一个自定义的数据stream

自定义stream包含一些自定义小部件可视化的数据; 这些小部件只需要在适当的时候将每个自定义帧写入缓冲区。

我们的应用程序基于Qt,已经使用QMediaPlayer / QVideoWidget来播放传统video,但额外的自定义stream使事情变得更加复杂,因为AFAIK QMediaPlayer只播放video/audio而忽略其他所有内容。

我想避免重新创build整个qt-multimedia ,但是我不确定如何从可用的Qt类中获得最好的效果。


我到目前为止的想法是:

  1. 编写一个自定义媒体播放器类,使用ffmpeg对video进行解复用和解码,实现定时,使用QAudioOutput播放audio,生成一串QVideoFrame在video上播放,并将自定义数据写入某个缓冲区进行可视化。

    问题 :为了避免编写代码来重新缩放/转换video帧,我想重复使用QVideoWidget ,但它似乎只适用于“真正的” QMediaPlayer

  2. 将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的子类和重新实现