[记录]如何让ffmpeg从SDL1.*转到SDL2.*上?

有这篇记录文章的起因,源于自己想写一个跨平台的播放器,花了几天时间,了解SDL1版本的API和SDL2的API,在尽量保持了ffplay原有逻辑的前提下把原先使用SDL1的地方用SDL2的API改写了,不过还目前还只是“简单的改写”,以后有时间就尽量按照SDL2来重写ffplay。

其实从以前就一直有在找资料,跨平台的播放器,就暂定是使用ffmpeg作为解编码库(这个库非常强大),对于音视频显示有[cocos2dx,SDL等](作为游戏引擎的大部分应该可以用来做音视频显示,我最终优先选择了SDL)。

要用ffmpeg,那么需要先搞出她的链接库,单纯编译这个ffmpeg非常简单,如果要想加入其他的编解码支持,就需要好好地花时间了(还好以前有把加入其他库的内容记录下来,这里少花了好多时间);为了搞出ffplay,需要安装SDL,在我非常快速地装完SDL2后发现,原来目前的ffmpeg还只是支持SDL1的,一狠心,我改了吧~

移植的大致步骤为:

1、修改configure文件

首先应该修改configure文件(为什么?因为修改源码时我们需要编译调试,而编译调试之前就需要configure一下),这里的修改主要有两个,一个是把旧版本(SDL1)用的sdl-config改成新版本(SDL2)的sdl2-config;另一个是原先对sdl1版本的判断改到对sdl2的判断上,这里除了修改对版本号的判断以外,还需要把对SDL_Linked_Version的函数判断改掉(SDL2已没有该函数);

2、修改c源码文件

如果要能调试ffmpeg,需要在configure时加入以下选项:--enable-debug --disable-asm --disable-stripping --disable-optimizations;
ffmpeg中有两个文件使用了SDL,一个是advices库里的sdl.c,一个就是ffplay.c了;sdl.c中主要就是把surface改到texture上,需要改的地方比较少;而ffplay.c需要改的地方很多,但是主要也是把surface改到texture上,并把原先记录数据的surface改成用AVPicture来记录即可。

 

注:目前只是可以完成编译且可以播放视频文件,但修改得还比较“浅”,但代码又多,所以暂时不发源码。

 

经过以上的修改之后,就可以重新configure(这时就不需要第二步的configure选项了),并编译出依赖SDL2的ffmpeg了。

 

 

另外,编译完成在使用ffplay的时候我试过出现以下错误提示:

Could not initialize SDL - No available video device
(Did you set the DISPLAY variable?)

经过查找资料,说重新安装对应系统的视频相关的开发库即可,比如我的是linux系统,安装x11相关开发库即可,我装了libx11-dev,xorg-dev等,因为我用的是静态链接,所以需要重新编译sdl2,再编译ffmpeg(ffplay)即可解决问题。

 

这里是一些修改过程可能会需要的资料:
SDL1 --- SDL_Overlay 结构描述文档

SDL2 --- 头文件

SDL 1.2 to 2.0 Migration Guide

FFMpeg中apiexample.c例子分析——编码分析

» 本文链接地址:https://www.xidige.com/684

打开支付宝扫一扫,即可进行扫码打赏哦

扫码支持
扫码打赏,你说多少就多少

标签:

分享到:

扫一扫 在手机阅读、分享本文

上一篇: 下一篇:
评论区2人评论791人参与
  1. 黃世凱 2015年1月19日 下午4:31  回复

    請問有新的ffmpeg+sdl2的源碼可以發表了嗎?亟切需要 感謝

    • xidige 2015年1月28日 下午4:31  

      之前更新过ffmpeg,覆盖掉了,不好意思啦。其实sdl官网有提供从sdl1过渡到sdl2的文档,就是文章后面提供的连接《SDL 1.2 to 2.0 Migration Guide》。你只要参考一下这个,就可以修改了

电子邮件地址不会被公开。 必填项已用*标注

*

loading

赞助商广告