本文章是阅读《音视频开发进阶指南基于android与ios平台的实践》一书的学习笔记。


目录:

  1. FFmpeg 的介绍
  2. FFmpeg Android 编译库
  3. FFmpeg 的结构
  4. FFmpeg 命令行工具的使用

1. FFmpeg 的介绍

http://ffmpeg.org

若要讲解音视频的开发,首先不得不提开源框架 FFmpeg。该开源框架为音视频开发者们提供了非常大的帮助,其也是全世界的音视频开发工程师都应该掌握的工具。

FFmpeg 是一套可以用来记录、处理数字音频、视频,并将其转换为流的开源框架,提供了录制、转换以及流化音视频的完整解决方案

它的可移植性或者说跨平台特性非常强大,可以用在 Linux 服务器、PC (包括 Windows、Mac OS X 等)、移动端设备 (Android、iOS 等移动设备) 等平台。

名称中的 mpeg 来自视频编码标准 MPEG,而前缀 FF 是 Fast Forward 的首字母缩写。本章会从编译开始讲解,然后介绍命令行工具的使用,接着会介绍 FFmpeg 在代码层面提供给开发者的 API,最后会从源码的角度分析一下整个 FFmpeg 框架。

2. FFmpeg Android 编译库

FFmpeg github 上已经有现成编译好的 android 库:https://github.com/xufuji456/FFmpegAndroid,简介如下:

android 端基于 FFmpeg 库的使用,添加编译 ffmpeg、shine、mp3lame、x264 源码的参考脚本,目前音视频相关处理:

  • 音频剪切、拼接
  • 音频混音
  • 音频转码
  • 音视频合成
  • 音频抽取
  • 音频解码播放
  • 音频编码
  • 视频抽取
  • 视频剪切
  • 视频转码
  • 视频截图
  • 视频降噪
  • 视频抽帧
  • 视频转 GIF 动图
  • 视频添加水印
  • 视频画面拼接
  • 视频反序倒播
  • 视频画中画
  • 图片合成视频
  • 视频解码播放
  • 本地直播推流
  • 实时直播推流
  • 音视频解码播放
  • FFmpeg 的 AVFilter 滤镜
  • 使用 mp3lame 库进行 mp3 转码
  • 视频拖动实时预览
  • moov 往前移动
  • ffprobe 检测多媒体格式
  • IjkPlayer 的 RTSP 超低延时直播

3. FFmpeg 的结构

默认的编译会生成 4 个可执行文件和 8 个静态库。可执行文件包括用于转码、推流、Dump 媒体文件的 ffmpeg、用于播放媒体文件的ffplay、用于获取媒体文件信息的 ffprobe,以及作为简单流媒体服务器的 ffserver。8 个静态库其实就是 FFmpeg 的 8 个模块,具体包括如下内容:

  • AVUtil:核心工具库,该模块是最基础的模块之一,下面的许多其他模块都会依赖该库做一些基本的音视频处理操作。
  • AVFormat:文件格式和协议库,该模块是最重要的模块之一,封装了 Protocol 层和 Demuxer、Muxer 层,使得协议和格式对于开发者来说是透明的。
  • AVCodec:编解码库,该模块也是最重要的模块之一,封装了 Codec 层,但是有一些 Codec 是具备自己的 License 的,FFmpeg 是不会默认添加像 libx264、FDK-AAC、lame 等库的,但是 FFmpeg 就像一个平台一样,可以将其他的第三方的 Codec 以插件的方式添加进来,然后为开发者提供统一的接口。
  • AVFilter:音视频滤镜库,该模块提供了包括音频特效和视频特效的处理,在使用 FFmpeg 的 API 进行编解码的过程中,直接使用该模块为音视频数据做特效处理是非常方便同时也非常高效的一种方式。
  • AVDevice:输入输出设备库,比如,需要编译出播放声音或者视频的工具 ffplay,就需要确保该模块是打开的,同时也需要 libSDL的预先编译,因为该设备模块播放声音与播放视频使用的都是 libSDL 库。
  • SwrRessample:该模块可用于音频重采样,可以对数字音频进行声道数、数据格式、采样率等多种基本信息的转换。
  • SWScale:该模块是将图像进行格式转换的模块,比如,可以将 YUV 的数据转换为 RGB 的数据。
  • PostProc:该模块可用于进行后期处理,当我们使用 AVFilter 的时候需要打开该模块的开关,因为 Filter中 会使用到该模块的一些基础函数。

如何为 FFmpeg 平台引入第三方编解码库呢?下面就以最常用的 LAME、X264、FDK-AAC 进行举例。前面的章节中已经介绍了这三个库在 Android 和 iOS 平台上的交叉编译,现在就假设已经交叉编译出了 LAME、X264、FDK-AAC 的静态库与头文件,并且在 FFmpeg 的源码目录下建立了 external-libs 目录,还在其中建立了 LAME、X264、FDK-AAC 三个目录,每个目录中的结构都包含了 include 和 lib两个目录,并且将编译出来的头文件和静态库文件分别都放到了这两个目录下面。

现在修改编译脚本如下:

新增 X264 编码器需要新增以下脚本:

--enable-muxer=h264 \
--enable-encoder=libx264 \
--enable-libx264 \
--extra-cflags=”-Iexternal-libs/x264/include” \
--extra-ldflags=”-Lexternal-libs/x264/lib” \

新增 LAME 编码器需要新增以下脚本:

--enable-muxer=mp3 \
--enable-encoder=libmp3lame \
--enable-libmp3lame \
--extra-cflags=”-Iexternal-libs/lame/include” \
--extra-ldflags=”-Lexternal-libs/lame/lib” \

新增FDK-AAC编码器需要新增以下脚本:

--enable-encoder=libfdk_aac \
--enable-libfdk_aac \
--extra-cflags=”-Iexternal-libs/fdk-aac/include” \
--extra-ldflags=”-Lexternal-libs/fdk-aac/lib” \

可以按照自己的应用场景,把需要编译进来的第三方库以修改脚本文件的方式进行编译,然后以命令行模式或者以API调用的方式进行使用。

4. FFmpeg 命令行工具的使用

FFmpeg 中有 ffmpeg、ffprobe、ffplay以及 ffserver 等命令行工具,这边将重点介绍 ffmpeg、ffprobe 与 ffplay 这三个命令行工具,而ffserver 则是作为简单的流媒体服务器存在的,与客户端开发关系不大。

  • ffmpeg 是进行媒体文件转码的命令行工具;
  • ffprobe 是用于查看媒体文件头信息的工具;
  • ffplay 则是用于播放媒体文件的工具。

4.1 ffprobe

先来测试一个音频文件:

ffprobe /Users/kuangzhongwen/Desktop/my\ documents/kuang\ Music/繁星-阿文.mp3

输出:

# 时长 03:51.80,开始播放时间为 0,比特率是 128 kb/s
Duration: 00:03:51.80, start: 0.000000, bitrate: 128 kb/s# 第一个流是音频流,编码格式是 mp3,采样率为 44100,声道是立体声,采样表示格式是 fltp,路流比特了是 128 kb/s
Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 128 kb/s

再来测试一个视频文件:

ffprobe /Users/kuangzhongwen/Desktop/my\ documents/视频/女生节.mpg 

输出:

 # 时长,开始播放时间,比特率Duration: 00:04:47.48, start: 0.220000, bitrate: 8381 kb/sStream #0:0[0x1bf]: Data: dvd_nav_packet# stream,视频流,格式为 mpeg2video,每一帧的数据表示为 yuv420P,分辨率为 720x576,fps 为 25Stream #0:1[0x1e0]: Video: mpeg2video (Main), yuv420p(tv, top first), 720x576 [SAR 64:45 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc# stream 音频流,格式为 pcm_dvd,采样率为 48000 Hz,2 个声道,音频流比特率为 1536 kb/sStream #0:2[0xa0]: Audio: pcm_dvd, 48000 Hz, 2 channels, s16, 1536 kb/s

格式化输出:

ffprobe -show_format /Users/kuangzhongwen/Desktop/my\ documents/视频/女生节.mpg

输出:

[FORMAT]
filename=/Users/kuangzhongwen/Desktop/my documents/视频/女生节.mpg
nb_streams=3
nb_programs=0
format_name=mpeg
format_long_name=MPEG-PS (MPEG-2 Program Stream)
start_time=0.220000
duration=287.480000
size=301199360
bit_rate=8381782
probe_score=26
[/FORMAT]

JSON 格式输出:

ffprobe -print_format json -show_streams /Users/kuangzhongwen/Desktop/my\ documents/视频/女生节.mpg

输出:

{
Input #0, mpeg, from '/Users/kuangzhongwen/Desktop/my documents/视频/女生节.mpg':Duration: 00:04:47.48, start: 0.220000, bitrate: 8381 kb/sStream #0:0[0x1bf]: Data: dvd_nav_packetStream #0:1[0x1e0]: Video: mpeg2video (Main), yuv420p(tv, top first), 720x576 [SAR 64:45 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbcStream #0:2[0xa0]: Audio: pcm_dvd, 48000 Hz, 2 channels, s16, 1536 kb/s
Unsupported codec with id 100357 for input stream 0"streams": [{"index": 0,"codec_name": "dvd_nav_packet","codec_long_name": "DVD Nav packet","codec_type": "data","codec_tag_string": "[0][0][0][0]","codec_tag": "0x0000","id": "0x1bf","r_frame_rate": "0/0","avg_frame_rate": "0/0","time_base": "1/90000","start_pts": 19800,"start_time": "0.220000","disposition": {"default": 0,"dub": 0,"original": 0,"comment": 0,"lyrics": 0,"karaoke": 0,"forced": 0,"hearing_impaired": 0,"visual_impaired": 0,"clean_effects": 0,"attached_pic": 0,"timed_thumbnails": 0}},{"index": 1,"codec_name": "mpeg2video","codec_long_name": "MPEG-2 video","profile": "Main","codec_type": "video","codec_time_base": "1/25","codec_tag_string": "[0][0][0][0]","codec_tag": "0x0000","width": 720,"height": 576,"coded_width": 0,"coded_height": 0,"has_b_frames": 1,"sample_aspect_ratio": "64:45","display_aspect_ratio": "16:9","pix_fmt": "yuv420p","level": 8,"color_range": "tv","chroma_location": "left","field_order": "tt","refs": 1,"id": "0x1e0","r_frame_rate": "25/1","avg_frame_rate": "25/1","time_base": "1/90000","start_pts": 19800,"start_time": "0.220000","duration_ts": 25873200,"duration": "287.480000","disposition": {"default": 0,"dub": 0,"original": 0,"comment": 0,"lyrics": 0,"karaoke": 0,"forced": 0,"hearing_impaired": 0,"visual_impaired": 0,"clean_effects": 0,"attached_pic": 0,"timed_thumbnails": 0}},{"index": 2,"codec_name": "pcm_dvd","codec_long_name": "PCM signed 20|24-bit big-endian","codec_type": "audio","codec_time_base": "1/48000","codec_tag_string": "[0][0][0][0]","codec_tag": "0x0000","sample_fmt": "s16","sample_rate": "48000","channels": 2,"bits_per_sample": 0,"id": "0xa0","r_frame_rate": "0/0","avg_frame_rate": "0/0","time_base": "1/90000","start_pts": 19800,"start_time": "0.220000","duration_ts": 25873091,"duration": "287.478789","bit_rate": "1536000","bits_per_raw_sample": "16","disposition": {"default": 0,"dub": 0,"original": 0,"comment": 0,"lyrics": 0,"karaoke": 0,"forced": 0,"hearing_impaired": 0,"visual_impaired": 0,"clean_effects": 0,"attached_pic": 0,"timed_thumbnails": 0}}]
}

显示帧信息的命令如下:

ffprobe -show_frames sample.mp4

查看包信息的命令如下:

ffprobe -show_packets sample.mp4

4.2 ffplay

ffplay 是以 FFmpeg 框架为基础,外加渲染音视频的库 libSDL 来构建的媒体文件播放器。它所依赖的 libSDL 是1.2版本的,所以在安装ffplay 之前也要安装对应版本的 libSDL 作为其依赖的组件。之后使用 ffplay 就非常简单了,比如我们要播放一个音频文件。

ffplay /Users/kuangzhongwen/Desktop/my\ documents/kuang\ Music/繁星-阿文.mp3

或者视频文件:

ffplay /Users/kuangzhongwen/Desktop/my\ documents/视频/女生节.mpg

会打开 ffmpeg 自带的播放器播放。

业界内开源的 ijkPlayer 其实就是基于 ffplay 进行改造的播放器,当然其做了硬件解码以及很多兼容性的工作。ijkPlayer 是一款非常优秀的播放器,作为开发者的我们需要很多优秀的开源项目。

4.3 ffmpeg

ffmpeg 其实是这三个命令行工具里最强大的一个工具,如果说 ffprobe 是用于探测媒体文件的格式以及详细信息,ffplay 是一个播放媒体文件的工具,那么 ffmpeg 就是强大的媒体文件转换工具。它可以转换任何格式的媒体文件,并且还可以用自己的 AudioFilter 以及VideoFilter 进行处理和编辑,总之一句话,有了它,进行离线处理视频时可以做任何你想做的事情了。

音视频篇 - FFmpeg 的介绍和使用相关推荐

  1. 音视频开发-ffmpeg介绍-系列一

    目录 一.简介 FFmpeg框架的基本组成包含: 二. FFmpeg框架梳理音视频的流程​编辑 基本概念: 三.ffmpeg.ffplay.ffprobe区别 4.1 ffmpeg是用于转码的应用程序 ...

  2. 音视频篇 - 音视频基础概念

    本文章是阅读<音视频开发进阶指南基于android与ios平台的实践>一书的学习笔记. 目录: 什么是声音 声波的三要素 数字音频 音频编码 图像的物理现象 YUV 视频编码 视频编码的相 ...

  3. 【音视频】FFmpeg

    FFmpeg 学习 FFmpeg FFmpeg简介 FFmpeg的基本组成 FFmpeg的可执行文件 ffmpeg 常用命令 FFmpeg转码 MP4格式 MP4概述 音视频文件音视频流抽取 H.26 ...

  4. 音视频之——FFmpeg教程(二)——Windows10下搭建nginx-rtmp流媒体服务器

    前言 前一篇我们知道了如何配置FFmpeg开发环境,接下来,就开始简单的推流吧.说到推流前,我们要知道常用的几个直播推流协议. 直播推流协议 在搭建服务之前先了解下目前主流的几个直播协议: RTMP: ...

  5. 音视频开发-FFmpeg详解

    音视频开发是个非常复杂的,庞大的开发话题,初涉其中,先看一下结合 OEIP(开源项目) 新增例子. 可以打开flv,mp4类型文件,以及rtmp协议音视频数据,声音的播放使用SDL. 把采集的麦/声卡 ...

  6. 【音视频】直播CDN介绍

    0x1 前言 以下内容是从一个运维的角度看待问题,主要借鉴了某某云和某站的直播架构总结的经验,还加入了一些自己的思考,希望能在CDN这条道路上走得更远. 0x2 直播CDN介绍 一个直播业务,大致分为 ...

  7. 音视频即时通讯的介绍与前景

    音视频即时通讯是目前最为时尚.流行的通讯方式.可以实现一对一.一对多.多对多的通讯.而各种各样的即时通讯软件也层出不穷:服务提供商越来越丰富的通讯服务功能.随着社会的发展与网络技术的进步,音视频即时通 ...

  8. 音视频同步-ffmpeg

    音视频同步肯定是需要使用时间戳进行同步的,音频和视频的时间戳进行对比,哪个小就写入哪个包,基本上可以实现音视频同步. 但是这个时间戳从哪里来呢? 使用rtp头中携带的时间戳是最正确的方法,因为音视频流 ...

  9. php音视频同步,FFMPEG转码音视频不同步情况总结

    [导读]使用FFMPEG转码一年半的时间,遇到了各种情况的音视频不同步,下面我们就来根据问题出现的原因,对所遇到的音视频不同步做一个分类. 使用FFMPEG转码一年半的时间,遇到了各种情况的音视频不同 ...

最新文章

  1. JDK8安装及设置环境变量
  2. lux系统服务器安装后多大,服务器环境搭建
  3. c语言树莓派音乐播放器,使用web端来控制我的树莓派播放音乐
  4. 计算机图形学E7——OpenGL 交互式三角形裁剪直线
  5. python获取表单数据的代码_使用flask和python从html表单获取表单数据
  6. deprecations - 极不赞成的写法
  7. 战地一的服务器在哪个文件夹,战地1怎么加入服务器 战地1加入服务器方法
  8. java swing窗口放置屏幕中央问题思考
  9. int、String、char、Array之间的转换,这一篇够了!!!
  10. 机器学习常用十大算法
  11. 使用opencv转化图片格式
  12. 20 年前,亚马逊就推出了大数据杀熟算法
  13. Uva--10098 (next_permutation)
  14. 深度摄像头:一:深度了解深度摄像头
  15. 中国移动基于 Kubernetes 的物联网边缘计算应用实践
  16. Kubernetes入门一:介绍及环境准备
  17. 数据挖掘课程小结——1)数据预处理
  18. 极验滑块验证码破解与研究(二):缺口图片还原
  19. 讲座有感——科技论文写作要素
  20. RTImageAssets-自动生成iOS 不同分辨率的插件,verygood

热门文章

  1. 圣诞礼物c语言代码大全,圣诞节到咯,教大家用C语言画个圣诞树
  2. b站路飞学城python课梨视频项目代码
  3. 北大AI公开课第五课--深度学习处理器by寒武纪陈云霁
  4. android语音记账,爱彼语记语音计算器记账记事本
  5. TDW计算引擎解析——Scheduler
  6. Altium Designer系列:问题之无法打开pcb文件
  7. Idea中文件图标发生变化,导致文件显示出现异常
  8. Android绘制地图
  9. 移动直播之网红主播怎样将直播内容推到斗鱼直播平台的方案
  10. RoboCup智能机器人足球教程(二)