ffplay源码编译

ffplay是ffmpeg源码中一个自带的开源播放器组件,支持本地视频文件的播放以及在线流媒体播放,很多商业播放器都是基于ffplay定制而来的。ffplay中的代码充分利用了ffmpeg中的函数库,因此,想学习ffmpeg的使用,或基于ffplay实现一个自己的播放器,ffplay都是一个很好的切入点。

FFplay: FFplay is a very simple and portable media player using the FFmpeg libraries and the SDL library. It is mostly used as a testbed for the various FFmpeg APIs.

公众号:断点实验室 音视频开发系列文章
ffmpeg源码编译环境搭建
ffplay源码编译
ffmpeg播放器实现详解 - 框架搭建
ffmpeg播放器实现详解 - 视频显示
ffmpeg播放器实现详解 - 音频播放
ffmpeg播放器实现详解 - 创建线程

ffplay依赖库准备

ffplay编译主要依赖sdl2环境(针对ffmpeg 3.x版本),未安装sdl2的情况下,不会自动生成关于ffplay的编译选项。

SDL(Simple DirectMedia Layer)是一个跨平台的多媒体和游戏开发包,提供2D,音频,事件驱动,多线程和定时器等服务,它使用C语言写成,提供了多种控制图像、声音、输出的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。

SDL: Simple DirectMedia Layer is a cross-platform development library designed to provide low level access to audio, keyboard, mouse, joystick, and graphics hardware via OpenGL and Direct3D. It is used by video playback software, emulators, and popular games including Valve's award winning catalog and many Humble Bundle games.

可以通过下面两个命令安装sdl2组件,dev后缀表示安装路径下会包含头文件及动态库等在开发环境下需要的文件

sudo apt-get install libsdl2-2.0
sudo apt-get install libsdl2-dev

也可以从下面的地址下载sdl2源码包编译安装,这种方法更适合在嵌入式环境下使用

http://www.libsdl.org/download-2.0.php

sdl2库编译

下载完成后解压进入sdl2源码目录,可通过下面的配置方法生成Makefile文件

./configure --prefix=/usr/local/3rdparty/sdl2

生成Makefile文件后,输入make命令即可开始编译过程,编译完成后,执行make install命令进行安装

make 
sudo make install

安装完成后,会在configure指定的目录下找到sdl2的目录,由于sdl2以库文件的方式提供支持,因此在sdl2/bin目录下没有对应的可执行文件。

sdl2环境变量配置

sdl2编译完成后,还需要让系统能够找到对应的安装位置。打开/etc/profile配置文件,在该文件底部添加sdl2的环境变量

#SDL2 ENVIRONMENT
export C_INCLUDE_PATH=/usr/local/3rdparty/sdl2/include/SDL2:$C_INCLUDE_PATH
export LD_LIBRARY_PATH=/usr/local/3rdparty/sdl2/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/usr/local/3rdparty/sdl2/lib/pkgconfig:$PKG_CONFIG_PATH

ffplay configure配置

在ffmpeg的编译配置项中,添加sdl2的配置项,重新生成对应的Makefile文件。此外,configure脚本会通过环境变量自动查询是否已安装sdl2组件,因此按照之前ffmpeg的configure配置方法,直接重新生成Makefile文件应该也可以,这样就不必添加sdl2配置项了,大家可以试试。

./configure --prefix=/usr/local/3rdparty/ffmpeg --enable-shared --enable-yasm --enable-libx264 --enable-gpl --enable-pthreads --enable-sdl --extra-cflags=-I/usr/local/3rdparty/x264/include --extra-ldflags=-L/usr/local/3rdparty/x264/lib

生成Makefile文件后,打开ffmpeg源码目录下的config.mak文件,搜索CONFIG_FFPLAY关键字,可以看到ffplay对应的编译选项已由之前的[!CONFIG_FFPLAY=yes]变成了[CONFIG_FFPLAY=yes],前面的叹号已经去掉了

ffplay编译

重新生成Makefile后输入make命令即可开始编译过程,编译完成后,执行make install命令进行安装

make 
sudo make install

在ffmpeg的安装路径ffmpeg/bin下,即可看到ffplay的可执行文件,输入ffplay -version,可以打印出ffplay的版本号。

ffplay -version
ffplay version 3.2.4 Copyright (c) 2003-2017 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 20160609
configuration: --prefix=/usr/local/3rdparty/ffmpeg --enable-shared --enable-yasm --enable-libx264 --enable-gpl --enable-pthreads --enable-sdl --extra-cflags=-I/usr/local/3rdparty/x264/include --extra-ldflags=-L/usr/local/3rdparty/x264/lib
libavutil      55. 34.101 / 55. 34.101
libavcodec     57. 64.101 / 57. 64.101
libavformat    57. 56.101 / 57. 56.101
libavdevice    57.  1.100 / 57.  1.100
libavfilter     6. 65.100 /  6. 65.100
libswscale      4.  2.100 /  4.  2.100
libswresample   2.  3.100 /  2.  3.100
libpostproc    54.  1.100 / 54.  1.100

在ffmpeg的源码路径下,可以通过ldd命令查询ffplay依赖的所有组件,其中显示了sdl2依赖库的安装位置,若其中的某些依赖项显示[Not Found]无法找到,则需要对照前文确定是否有依赖项尚未配置环境变量

ldd ffplay
    linux-vdso.so.1 =>  (0x00007ffd3c3a3000)
    libavdevice.so.57 => /usr/local/3rdparty/ffmpeg/lib/libavdevice.so.57 (0x00007fbe2e539000)
    libavfilter.so.6 => /usr/local/3rdparty/ffmpeg/lib/libavfilter.so.6 (0x00007fbe2e10a000)
    libavformat.so.57 => /usr/local/3rdparty/ffmpeg/lib/libavformat.so.57 (0x00007fbe2dcea000)
    libavcodec.so.57 => /usr/local/3rdparty/ffmpeg/lib/libavcodec.so.57 (0x00007fbe2c7b6000)
    libpostproc.so.54 => /usr/local/3rdparty/ffmpeg/lib/libpostproc.so.54 (0x00007fbe2c59a000)
    libswresample.so.2 => /usr/local/3rdparty/ffmpeg/lib/libswresample.so.2 (0x00007fbe2c37e000)
    libswscale.so.4 => /usr/local/3rdparty/ffmpeg/lib/libswscale.so.4 (0x00007fbe2c0f6000)
    libavutil.so.55 => /usr/local/3rdparty/ffmpeg/lib/libavutil.so.55 (0x00007fbe2be7c000)
    libSDL2-2.0.so.0 => /usr/local/3rdparty/sdl2/lib/libSDL2-2.0.so.0 (0x00007fbe2bb49000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fbe2b840000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fbe2b623000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbe2b259000)
    libXv.so.1 => /usr/lib/x86_64-linux-gnu/libXv.so.1 (0x00007fbe2b054000)
    libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007fbe2ad1a000)
    libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007fbe2ab08000)
    libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007fbe2a8e6000)
    libxcb-shm.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-shm.so.0 (0x00007fbe2a6e2000)
    libxcb-xfixes.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-xfixes.so.0 (0x00007fbe2a4da000)
    libxcb-shape.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-shape.so.0 (0x00007fbe2a2d6000)
    libasound.so.2 => /usr/lib/x86_64-linux-gnu/libasound.so.2 (0x00007fbe29fd6000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fbe29dbc000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fbe29bb8000)
    libx264.so.148 => /usr/local/3rdparty/x264/lib/libx264.so.148 (0x00007fbe29812000)
    liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007fbe295f0000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fbe293e8000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fbe2e751000)
    libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007fbe291e4000)
    libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007fbe28fde000)

ffplay使用

ffplay支持本地视频文件的播放以及在线流媒体播放,输入ffplay url命令即可打开指定的媒体流,这里我们以湖南卫视 & CCTV1 的直播源为例

ffplay rtmp://58.200.131.2:1935/livetv/hunantv
ffplay http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8

播放画面截图

Screenshot_2.png

ffplay播放中可能出现的问题

sdl找不到音频设备
SDL_OpenAudio no such audio device

在stackoverflow找到了对应的解决办法,可参考如下链接
https://stackoverflow.com/questions/10465202/initializing-sdl-mixer-gives-error-no-available-audio-device

sudo apt-get install libasound2-dev
sudo apt-get install libpulse-dev

然后重新配置生成SDL及ffplay的Makefile文件并编译安装

sdl无法初始化
Could not initialize SDL, no available video device

解决办法如下,可参考如下链接
https://askubuntu.com/questions/443053/could-not-initialize-sdl-no-available-video-device-dont-move
https://stackoverflow.com/questions/38869963/i-cannot-use-sdl2-on-centos-maybe-i-install-it-failed-errorno-available-vide/38877897#38877897

sudo apt-get install libx11-dev
sudo apt-get install xorg-dev

然后重新配置生成SDL及ffplay的Makefile文件并编译安装


// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
// 公众号:断点实验室
// 扫描二维码,关注更多优质原创,内容包括:音视频开发、图像处理、网络、
// Linux,Windows、Android、嵌入式开发等

qr.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348