共计 1529 个字符,预计需要花费 4 分钟才能阅读完成。
转发自白狼栈:查看原文
浏览目录
- 视频是怎么被播放的?
- ffmpeg 命令的格局
- ffmpeg 转码输入的过程
视频是怎么被播放的?
咱们晓得,当下大多数播放器都是基于 ffmpeg 二次开发的。你有没有想过,你用播放器关上一个视频的时候,是怎么看到的画面,怎么听到的声音?
咱们用这张图简略描绘出视频被播放的流程。
上面略微解释下图中的含意。
- 解封装:播放器将输出的封装格局(mp4、mkv)的数据拆散,产生音频流和视频流两局部,留神此时这两局部数据还只是压缩的数据,相似分流,前面咱们也会介绍如何从视频文件中抽离出音频和视频。
- 下一步就是解码操作了,咱们说解码就是将视频、音频压缩的编码数据,解码成为非压缩的视频、音频原始数据。这里将音频解码为 pcm 格局的数据,将视频解码为 yuv 格局的数据。
- 音视频同步播放:把解封装和解码别离拿到的视频信息和音视频数据,发送给显卡和声卡即可播放。
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,又是怎么解决的呢?
咱们用上面这个图来示意转码输入的过程。
具体形容如下
- ffmpeg 调用一个蕴含解复用器 demuxer 的 libavformat 库,从输出文件中读取蕴含编码的数据包
- 而后将编码的数据包传递给解码器 (decoder)(流复制操作疏忽该步骤)
- 解码器(decoder)产生未压缩的帧(即原始帧)能够进一步被滤镜解决
- 接下来,被滤镜解决的原始数据被传递给编码器(encoder)
- 编码器对传递过去的数据进行编码并输入编码数据包
- 最初,这些数据被复用器(muxer)写入输入文件。
任何简单的命令,都必须通过下面这样的转码过程,底层代码你能够不看,然而整个过程必须理解。
正文完