关于ffmpeg:ffmpeg入门到实战ffmpeg是怎么转码的

47次阅读

共计 1529 个字符,预计需要花费 4 分钟才能阅读完成。

转发自白狼栈:查看原文

浏览目录

  • 视频是怎么被播放的?
  • ffmpeg 命令的格局
  • ffmpeg 转码输入的过程

视频是怎么被播放的?

咱们晓得,当下大多数播放器都是基于 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)写入输入文件。

任何简单的命令,都必须通过下面这样的转码过程,底层代码你能够不看,然而整个过程必须理解。

正文完
 0