我需要播放包含经典视频流、音频流和自定义数据流的自定义 AVI 文件。
自定义流包含由一些自定义小部件可视化的数据;这些小部件只需要在适当的时间将每个自定义帧写入缓冲区。
我们的应用程序基于 Qt,并且已经使用QMediaPlayer
/QVideoWidget
来播放传统视频,但是额外的自定义流使事情变得更加复杂,因为 AFAIKQMediaPlayer
只播放视频/音频而忽略了其他所有内容。
我想避免对整个qt-multimedia
.
到目前为止,我的想法是:
编写一个自定义媒体播放器类,使用 对视频进行解复用和解码
ffmpeg
,实现计时,QAudioOutput
用于播放音频,生成QVideoFrame
要在视频上播放的 s 流,并将自定义数据写入某个缓冲区以进行可视化。问题:为了避免编写代码来重新缩放/转换视频帧,我想重用
QVideoWidget
,但它似乎只适用于“真实”QMediaPlayer
。解复用输入文件并
QMediaPlayer
与 AV 流一起馈送。 将输入解复用ffmpeg
(可能将解码留给 Qt 后端),让一个QIODevice
仅从输入文件中检索视频/音频流,另一个用于检索数据流。用 播放视频/音频QMediaPlayer
。+-------+ | QFile | +---^---+ | inherits | +--------------------+ | MyAviDemuxer | | | | holds a queue of | | demuxed packets | +--------------------+ | | readDataPacket readVideoPacket | | +-------v--------+ +--------v-----------+ +-----------+ | MyCustomReader | | MyVideoAudioStream +--inherits--> QIODevice | +----------------+ +--------+-----------+ +-----------+ | setMedia | +-------v-------+ | QMediaPlayer | +---------------+
问题:同步数据流的时间,
QMediaPlayer
正确处理标头和元数据。
我稍微倾向于选项 1,只是因为它给了我更多的控制权,但我想知道我是否错过了一个更简单的解决方案(甚至仅限 Windows)。