基于FFMPEG的跨平台播放器实现(二)

上一节讲到了在Android平台下采用FFmpeg+surface组合打造播放器的方法,这一节讲一下Windows平台FFmpeg + D3D、Linux平台FFmpeg+SDL的组合方法。

一、FFmpeg + D3D

D3D(Direct3D ):是微软为提高3D游戏在Windows中的显示性能而开发的显示程序接口,它提供了丰富的3D功能库,是游戏广泛采用的标准,开发者都会用到dx9sdk、dx10sdk等不同版本的SDK,可以到微软官网下载。其性能不必多说,把用来开发游戏的SDK用到播放器上应该没什么问题吧!

不过D3D的用法稍微复杂,而且可以参考的文档不太多,只能啃SDK文档了 ,基本流程如图1:

基于FFMPEG的跨平台播放器实现(二)-LMLPHP

图1

二、FFmpeg+SDL

SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。

相比于D3D,SDL的用法则简单许多,不需要自己创建CopySurface线程,按顺序调用接口就行,如图2:

基于FFMPEG的跨平台播放器实现(二)-LMLPHP

图2

三、接口封装

我采用编译宏Ifdef 控制windows、linux的编译,控制D3D、SDL的使用,达到封装细节、跨平台的效果,具体方法如图3:

基于FFMPEG的跨平台播放器实现(二)-LMLPHP

图3

四、运行效果

基于FFMPEG的跨平台播放器实现(二)-LMLPHP

图4

基于FFMPEG的跨平台播放器实现(二)-LMLPHP

图5

五、说明

代码上传到了https://github.com/dongguadan中的playsdk目录 。需要说明的是,时间戳的概念没有体现的工程中,所以帧于帧之间的时间没有控制好,导致画面不流畅,后面会改进。另外关于SDL、D3D的一些使用细节,还需要再深入地研究一下。

05-11 12:50
查看更多