zoukankan      html  css  js  c++  java
  • ffmpeg入门到实战-ffmpeg是怎么转码的?

    阅读目录

    视频是怎么被播放的?

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

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

    image

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

    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,又是怎么处理的呢?

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

    image

    具体描述如下

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

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

  • 相关阅读:
    Windows server 2016 解决“无法完成域加入,原因是试图加入的域的SID与本计算机的SID相同。”
    Windows Server 2016 辅助域控制器搭建
    Windows Server 2016 主域控制器搭建
    Net Framework 4.7.2 覆盖 Net Framework 4.5 解决办法
    SQL SERVER 2012更改默认的端口号为1772
    Windows下彻底卸载删除SQL Serever2012
    在Windows Server2016中安装SQL Server2016
    SQL Server 创建索引
    C#控制台或应用程序中两个多个Main()方法的设置
    Icon cache rebuilding with Delphi(Delphi 清除Windows 图标缓存源代码)
  • 原文地址:https://www.cnblogs.com/wwolf/p/14943069.html
Copyright © 2011-2022 走看看