ffmpeg入门到实战-ffmpeg是怎么转码的?
2024-08-29 03:57:21
阅读目录
视频是怎么被播放的?
我们知道,当下大多数播放器都是基于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)写入输出文件。
任何复杂的命令,都必须经过上面这样的转码过程,底层代码你可以不看,但是整个过程必须了解。
最新文章
- linux vi(vim)常用命令汇总
- LeetCode 349. Intersection of Two Arrays
- Form表单提交的简要方式
- XMPP系列2:如何掌握XMPP协议
- uGUI练习(三) KeyBoard Navigation
- C语言——内存分配
- mysql show variables系统变量详解
- ios 自己定义导航栏和切割线
- C语言中的数据类型
- android-带进度条的系统通知栏消息
- Docker跨主机网络——overlay
- [Apio2009][bzoj1179]Atm
- 查看Python安装路径
- js操作css样式,null和undefined的区别?
- easyui-datebox 点击事件
- 阶段01Java基础day13常见对象02
- 开机进入boot menu和application menu,无法开机
- 【Markdown】Markdown相关问题
- 谈谈对html5的了解
- Selenide 阶段性总结介绍(UI自动化测试工具)
热门文章
- Codeforces Beta Round #73(Div2)
- 普里姆算法(Prim)邻接矩阵法
- mysql知识点归纳-锁(死锁)
- Jmeter(四十五) - 从入门到精通高级篇 - Jmeter之网页爬虫-上篇(详解教程)
- linux最大文件打开数和swap限制
- 013.Ansible Playbook include
- 云计算OpenStack核心组件---keystone身份认证服务(5)
- python基础之pip、.pyc、三元运算、进制、一切皆对象、可变与不可变类型
- AD中如何解决 同一局域网下证书冲突问题
- window系统安装mysql