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.

ffplay依赖库准备

ffmpeg源码编译见 [公众号:断点实验室] 的前述文章 ffmpeg源码编译环境搭建

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

播放画面截图

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、嵌入式开发等

ffplay源码编译的更多相关文章

  1. ffmpeg/ffplay源码剖析笔记<转>

    转载:http://www.cnblogs.com/azraelly/ http://www.cnblogs.com/azraelly/archive/2013/01/18/2865858.html ...

  2. Android 5.0源码编译问题

    如果是自己通过repo和git直接从google官网上download的源码,请忽略这个问题,但是由于google在国内被限制登录,通过这一种方法不是每个人都能download下来源码,通常的做法就是 ...

  3. Android stdio Apktool源码编译

    Android Apktool源码编译 标签(空格分隔): Android Apktool 源码编译 需求 习惯NetBeans调试smali需要用Apktool反编译apk,需要用-d的参数才能生成 ...

  4. SSH/SSL 源码编译安装简易操作说明

    环境:CentOS 6.7 安全加固需求,由于某盟扫描系统主机有SSL系列漏洞,客户要求必须修复: 解决方案:将SSH/SSL升级到最新版本,删除SSL旧版本(实测不删除旧版本某盟扫描无法通过). 当 ...

  5. Hadoop源码编译过程

    一.           为什么要编译Hadoop源码 Hadoop是使用Java语言开发的,但是有一些需求和操作并不适合使用java,所以就引入了本地库(Native Libraries)的概念,通 ...

  6. World Wind .NET源码编译问题处理

    World  Wind  .NET源码编译问题处理 下载了World_Wind_1.4.0_Source源码(http://worldwindcentral.com/wiki/NASA_World_W ...

  7. 源码编译安装 MySQL 5.5.x 实践

    1.安装cmakeMySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具.因此,我们首先要在系统中源码编译安装cmake工具. # wget ht ...

  8. Linux 安装node.js ---- 源码编译的方式

    一 : 普通用户: 安装前准备环境: 1.检查Linux 版本 命令: cat /etc/redhat-release 2.检查 gcc.gcc-c++ 是否安装过 命令: rpm -q gcc rp ...

  9. 烂泥:mysql5.5数据库cmake源码编译安装

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 以前也写过一篇有关mysql5.0源码编译的文章,该文章为<烂泥:mysql5.0数据库源码编译安装>.但是MySQL自5.5版本以后,就开 ...

随机推荐

  1. 解决adb检测不到夜神模拟器

    1.安装夜神模拟器 2.安装adb(安装教程——我的网盘(无邪appium环境安装.word)) 3.在D:\android-sdk_r24.4.1-windows\android-sdk-windo ...

  2. 三文搞懂学会Docker容器技术(下)

    接着上面一篇:三文搞懂学会Docker容器技术(上) 三文搞懂学会Docker容器技术(中) 7,Docker容器目录挂载 7.1 简介 容器目录挂载: 我们可以在创建容器的时候,将宿主机的目录与容器 ...

  3. 微信小程序navigator带参数跳转及接收参数内容

    // index.wxml <navigator class='looks-view' wx:for="{{imgUrlNew}}" wx:key="index&q ...

  4. 解决start.spring.io无法访问的情况

    将start.spring.io替换成下列网址 http://start.jetbrains.org.cn/ 或者----> 连接手机热点 因为绝大多数无法访问都是因为网络问题

  5. Springboot--元注解及自定义注解(表单验证)

    本文简单说明一下元注解,然后对元注解中的@Retention做深入的讨论,在文章最后使用元注解写一个自定义注解来结尾. 一.结论: @Target:注解的作用目标 @Target(ElementTyp ...

  6. java中的四种访问权限是?

    1.私有权限(private) private可以修饰数据成员,构造方法,方法成员,不能修饰类(此处指外部类,不考虑内部类).被private修饰的成员,只能在定义它们的类中使用,在其他类中不能调用. ...

  7. win10提示“无法设置移动热点 请打开WLAN”的解决方法

    一位用户在使用Win10创意者操作系统过程中,遇到了无法开启移动热点的情况,开关呈灰色状态,而且提示:无法设置移动热点 请打开WLAN,该如何解决呢?该用户表示Wlan一直开着呀,感觉非常奇怪.接下来 ...

  8. 集合类List底层数据结构总结

    数组: 1. 不安全 ArrayList 2. 安全 Vector链表LinkedList不安全 3.2.1 ArrayList 1. 适合随机查找和遍历,不适合删除和增加 2. 大小不足时,需要将已 ...

  9. Netty 源码解析(八): 回到 Channel 的 register 操作

    原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 今天是猿灯塔“365篇原创计划”第八篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源 ...

  10. TensorFlow中的显存管理器——BFC Allocator

    背景 作者:DeepLearningStack,阿里巴巴算法工程师,开源TensorFlow Contributor] 使用GPU训练时,一次训练任务无论是模型参数还是中间结果都需要占用大量显存.为了 ...