阅读目录

视频是怎么被播放的?

我们知道,当下大多数播放器都是基于ffmpeg二次开发的。你有没有想过,你用播放器打开一个视频的时候,是怎么看到的画面,怎么听到的声音?

我们用这张图简单描绘出视频被播放的流程。

下面稍微解释下图中的含义。

  1. 解封装:播放器将输入的封装格式(mp4、mkv)的数据分离,产生音频流和视频流两部分,注意此时这两部分数据还只是压缩的数据,类似分流,后面我们也会介绍如何从视频文件中抽离出音频和视频。
  2. 下一步就是解码操作了,我们说解码就是将视频、音频压缩的编码数据,解码成为非压缩的视频、音频原始数据。这里将音频解码为pcm格式的数据,将视频解码为yuv格式的数据。
  3. 音视频同步播放:把解封装和解码分别拿到的视频信息和音视频数据,发送给显卡和声卡即可播放。

ffmpeg命令的格式

我们在音视频基础概念一文中介绍转码的时候,抛出过一条转码的命令,如下

ffmpeg -i input.flv output.mp4

对于ffmpeg命令的基本格式,参考ffmpeg官网

ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

翻译过来就是

ffmpeg [全局选项] {[输入文件选项] -i 输入文件} ... {[输出文件选项] 输出文件} ...

... 表示一条命令可能会有多个输入和多个输出。

比如我们可以通过输入多个文件转码后输出多个文件

ffmpeg -i input1 -i input2 \
-acodec … -vcodec … output1 \
-acodec … -vcodec … output2 \
-acodec … -vcodec … output3

据不完全统计,ffmpeg命令的选项数量就有小几万,所以不仅要多掌握学习技巧,更多的是多积累经验,靠死记硬背是完全行不通的。

那么多的选项,体现在一条命令上,一个基本的通用规则就是:

输入文件选项只作用于它后面的第一个输入文件,自然,输出文件选项也只作用于它后面的第一个输出文件。所以是有顺序要求的。

全局选项倒是可以随便写,比如有个全局选项 -y,询问我们是否要覆盖输出,下面两种写法都可以

ffmpeg -y -i input.flv output.mp4
ffmpeg -i input.flv -y output.mp4

但是,如果命令很长很长(比如我们前面给的音视频案例,一条命令甚至都有几百个字符),类似这种全局选项,最好写在输入文件前面或者输出文件前面。

另外,千万不要先写输出文件,再写输入文件,至少应该写完输入文件,再写输出文件,比如下面这样就是不好的写法

ffmpeg output.mp4 -i input.flv

良好的习惯才是好的开始。

ffmpeg转码输出的过程

ffmpeg -i input.flv output.mp4

还是上面这条简单的转码命令,对于类似这样的一条命令,对于ffmpeg,又是怎么处理的呢?

我们用下面这个图来表示转码输出的过程。

具体描述如下

  1. ffmpeg 调用一个包含解复用器demuxer的libavformat库,从输入文件中读取包含编码的数据包
  2. 然后将编码的数据包传递给解码器(decoder)(流复制操作忽略该步骤)
  3. 解码器(decoder)产生未压缩的帧(即原始帧)可以进一步被滤镜处理
  4. 接下来,被滤镜处理的原始数据被传递给编码器(encoder)
  5. 编码器对传递过来的数据进行编码并输出编码数据包
  6. 最后,这些数据被复用器(muxer)写入输出文件。

任何复杂的命令,都必须经过上面这样的转码过程,底层代码你可以不看,但是整个过程必须了解。

最新文章

  1. linux vi(vim)常用命令汇总
  2. LeetCode 349. Intersection of Two Arrays
  3. Form表单提交的简要方式
  4. XMPP系列2:如何掌握XMPP协议
  5. uGUI练习(三) KeyBoard Navigation
  6. C语言——内存分配
  7. mysql show variables系统变量详解
  8. ios 自己定义导航栏和切割线
  9. C语言中的数据类型
  10. android-带进度条的系统通知栏消息
  11. Docker跨主机网络——overlay
  12. [Apio2009][bzoj1179]Atm
  13. 查看Python安装路径
  14. js操作css样式,null和undefined的区别?
  15. easyui-datebox 点击事件
  16. 阶段01Java基础day13常见对象02
  17. 开机进入boot menu和application menu,无法开机
  18. 【Markdown】Markdown相关问题
  19. 谈谈对html5的了解
  20. Selenide 阶段性总结介绍(UI自动化测试工具)

热门文章

  1. Codeforces Beta Round #73(Div2)
  2. 普里姆算法(Prim)邻接矩阵法
  3. mysql知识点归纳-锁(死锁)
  4. Jmeter(四十五) - 从入门到精通高级篇 - Jmeter之网页爬虫-上篇(详解教程)
  5. linux最大文件打开数和swap限制
  6. 013.Ansible Playbook include
  7. 云计算OpenStack核心组件---keystone身份认证服务(5)
  8. python基础之pip、.pyc、三元运算、进制、一切皆对象、可变与不可变类型
  9. AD中如何解决 同一局域网下证书冲突问题
  10. window系统安装mysql