从 ffmpeg sdl教程 我们可以看到,使用的方法是ffmpeg解码,转成YUV格式的视频帧,然后再使用sdl的yuv覆盖的模式进行渲染。虽然 yuv对每个像素的占用内存较少,且sdl的的输出快速,但是如果要集成到其他UI上就有点麻烦了。
SDL仅仅就是通过传递参数SDL_WINDOWID给SDL_putenv函数(如下所示),以此重定向视频的渲染输出.中间sdl所做的细节完全看不到,想扩展也不易。据goolge查到,此代码也不能工作在mac系统上.还有一个问题是,假设Widget A上面有子Widget,那么如果你直接用此方法把输出放到Widget A上,那么将造成Widget A 的子Widget疯狂的闪烁。 既然如此还用SDL渲染干嘛。
SDL_putenv("SDL_WINDOWID=0x00111E18");
据实践知道,可以直接从ffmpeg转换出rgb 格式的视频帧,然后生成QImage,再交由Widget的painEvent进行绘制,那将灵活好多。如果我们中间需要做一些视频帧的变换处理,比如缩放,翻转,加水印之类也变得不再是难事,qt本身就有提供这些功能,何乐不为呢。