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. Jmeter(十一) - 从入门到精通 - JMeter逻辑控制器 - 下篇(详解教程)

    1.简介 Jmeter官网对逻辑控制器的解释是:“Logic Controllers determine the order in which Samplers are processed.”. 意思 ...

  2. 一文带你了解Redis持久化完整版本

    本文讲解知识点 持久化的简介 RDB AOF RDB与AOF的区别 持久化应用场景 对于持久化这个功能点,其实很简单没有那么复杂 演示环境 centos7.0 redis4.0 redis存放目录:/ ...

  3. JS新界面关闭原界面刷新的多种形式

    ------------恢复内容开始------------ 1.新界面为当前界面弹出的形式: 第一步:首先原界面的原生JS事件需要放到 (function () {  ......  })(); 中 ...

  4. 状压DP 从TSP问题开始入门哦

      一开始学状压DP难以理解,后来从TSP开始,终于入门了nice!!!! 旅行商问题 :    给定n个城市和两两相互的距离 ,求一条路径经过所有城市,并且路径达到最下仅限于; 朴树想法: 做n个城 ...

  5. Git安装及配置SSH-Key

    下载Git 打开 https://git-scm.com/downloads 选择windows, 下载并安装. 配置全局用户名及邮箱 配置用户名 git config --global user.n ...

  6. JavaScript基础避免使用eval()(006)

    许多人认为eval()方法是邪恶(evil)的.这个方法可以把任意字符串当成Javascript代码来执行.我们应该尽可能的不用eval()方法.比如,可以使用方括号来得到对象属性的值: // ant ...

  7. IOC和DI的概念,以及Spring框架的介绍

    对于Java开发者来说,Spring肯定是一个避不开的技术.所以准备系统的学下Spring框架. 我给自己设计的学习路线是这样的:首先阅读下Spring的官方文档(注意Spring官网上有很多项目,S ...

  8. HTTP 协议详解(二)

    前面一篇已经说过了 HTTP 的基本特性,HTTP 的发展史,前情回顾.这一篇就更详细的 HTTP 协议使用过程一些参数配置,缓存,Cookie设置相关的细节做一些梳理. 数据类型与编码 在 TCP/ ...

  9. Centos 下 Jenkins2.6 + Git + Maven Shell一件部署与备份

    使用Jenkins2.6 集成Maven与Git插件做持续集成,同时编写Shell脚本备份与发布(需要稍微知道点Linux/毕竟基于Centos PS:本人Linux也是菜鸡) - 下载Jenkins ...

  10. Redis系列(十):数据结构Set源码解析和SADD、SINTER、SDIFF、SUNION、SPOP命令

    1.介绍 Hash是以K->V形式存储,而Set则是K存储,空间节省了很多 Redis中Set是String类型的无序集合:集合成员是唯一的. 这就意味着集合中不能出现重复的数据.可根据应用场景 ...