ffmpeg入门教程
本文将会持续更新,敬请关注
视频播放器原理
———————————————— 版权声明
视音频技术主要包含以下几点:封装技术,视频压缩编码技术以及音频压缩编码技术。如果考虑到网络传输的话,还包括流媒体协议技术。
视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤:解协议,解封装,解码视音频,视音频同步。如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。他们的过程如图所示。
在这里插入图片描述解协议的作用
就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如HTTP,RTMP,或是MMS等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。
解封装的作用
就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。
解码的作用
就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。
视音频同步的作用
就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。
命令行详解可参考ffmpeg入门教程或者参考官网文档
实例来源于《FFmpeg从入门到精通》
声道
声道(Sound Channel) 是指声音在录制或播放时在不同空间位置采集或回放的相互独立的音频信号,所以声道数也就是声音录制时的音源数量或回放时相应的扬声器数量。
声卡所支持的声道数是衡量声卡档次的重要指标之一,从单声道到最新的环绕立体声。
双声道合并单声道
在这里插入图片描述图片来源于《FFmpeg从入门到精通》
ffmpeg -y -i C:\Users\Administrator\Desktop\video.aac -ac 1 C:\Users\Administrator\Desktop\video_filtered.aac
输出如下:
Input #0, aac, from 'C:\Users\Administrator\Desktop\video.aac':
Duration: 00:00:07.08, bitrate: 127 kb/s
Stream #0:0: Audio: aac (LC), 44100 Hz, stereo, fltp, 127 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
Output #0, adts, to 'C:\Users\Administrator\Desktop\video_filtered.aac':
Metadata:
encoder : Lavf58.33.100
Stream #0:0: Audio: aac (LC), 44100 Hz, mono, fltp, 69 kb/s
Metadata:
encoder : Lavc58.59.100 aac
size= 47kB time=00:00:06.94 bitrate= 55.6kbits/s speed= 131x
video:0kB audio:45kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 4.554030%
[aac @ 0000000c31c37e40] Qavg: 19424.391
双声道合并成单声道后,听起来感觉没什么区别,音质当然有所下降
双声道提取多单声道
在这里插入图片描述图片来源于《FFmpeg从入门到精通》
ffmpeg -y -i C:\Users\Administrator\Desktop\video.aac -map_channel 0.0.0 left.aac -map_channel 0.0.1 right.aac
输出如下
Input #0, aac, from 'C:\Users\Administrator\Desktop\video.aac':
Duration: 00:00:07.08, bitrate: 127 kb/s
Stream #0:0: Audio: aac (LC), 44100 Hz, stereo, fltp, 127 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (aac (native) -> aac (native))
Stream #0:0 -> #1:0 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
-map_channel is forwarded to lavfi similarly to -af pan=0x4|c0=c0.
[pan @ 0000004950a04cc0] Pure channel mapping detected: 0
Output #0, adts, to 'left.aac':
Metadata:
encoder : Lavf58.33.100
Stream #0:0: Audio: aac (LC), 44100 Hz, mono, fltp, 69 kb/s
Metadata:
encoder : Lavc58.59.100 aac
-map_channel is forwarded to lavfi similarly to -af pan=0x4|c0=c1.
[pan @ 0000004952814ec0] Pure channel mapping detected: 1
Output #1, adts, to 'right.aac':
Metadata:
encoder : Lavf58.33.100
Stream #1:0: Audio: aac (LC), 44100 Hz, mono, fltp, 69 kb/s
Metadata:
encoder : Lavc58.59.100 aac
size= 46kB time=00:00:06.94 bitrate= 54.2kbits/s speed= 81x
video:0kB audio:90kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
双声道转双音频流
在这里插入图片描述图片来源于《FFmpeg从入门到精通》
ffmpeg -y -i C:\Users\Administrator\Desktop\video.aac -filter_complex channelsplit=channel_layout=stereo
C:\Users\Administrator\Desktop\video.mka
输出如下:
Input #0, aac, from 'C:\Users\Administrator\Desktop\video.aac':
Duration: 00:00:07.08, bitrate: 127 kb/s
Stream #0:0: Audio: aac (LC), 44100 Hz, stereo, fltp, 127 kb/s
Stream mapping:
Stream #0:0 (aac) -> channelsplit
channelsplit:FL -> Stream #0:0 (libvorbis)
channelsplit:FR -> Stream #0:1 (libvorbis)
Press [q] to stop, [?] for help
Output #0, matroska, to 'C:\Users\Administrator\Desktop\video.mka':
Metadata:
encoder : Lavf58.33.100
Stream #0:0: Audio: vorbis (libvorbis) (oV[0][0] / 0x566F), 44100 Hz, 1 channels (FL), fltp
Metadata:
encoder : Lavc58.59.100 libvorbis
Stream #0:1: Audio: vorbis (libvorbis) (oV[0][0] / 0x566F), 44100 Hz, 1 channels (FR), fltp
Metadata:
encoder : Lavc58.59.100 libvorbis
size= 91kB time=00:00:06.93 bitrate= 107.2kbits/s speed=62.6x
video:0kB audio:79kB subtitle:0kB other streams:0kB global headers:6kB muxing overhead: 14.446838%
单声道转双声道
在这里插入图片描述图片来源于《FFmpeg从入门到精通》
ffmpeg -y -i C:\Users\Administrator\Desktop\right.aac -ac 2 C:\Users\Administrator\Desktop\video.mka
输出如下:
Input #0, aac, from 'C:\Users\Administrator\Desktop\right.aac':
Duration: 00:00:05.24, bitrate: 74 kb/s
Stream #0:0: Audio: aac (LC), 44100 Hz, mono, fltp, 74 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (aac (native) -> vorbis (libvorbis))
Press [q] to stop, [?] for help
Output #0, matroska, to 'C:\Users\Administrator\Desktop\video.mka':
Metadata:
encoder : Lavf58.33.100
Stream #0:0: Audio: vorbis (libvorbis) (oV[0][0] / 0x566F), 44100 Hz, stereo, fltp
Metadata:
encoder : Lavc58.59.100 libvorbis
size= 51kB time=00:00:06.95 bitrate= 60.6kbits/s speed=68.7x
video:0kB audio:45kB subtitle:0kB other streams:0kB global headers:4kB muxing overhead: 14.680476%
2个音频源合并为双声道
在这里插入图片描述ffmpeg -y -i C:\Users\Administrator\Desktop\left.aac -i C:\Users\Administrator\Desktop\right.aac
-filter_complex "[0:a][1:a]amerge=inputs=2[aout]" -map "[aout]" C:\Users\Administrator\Desktop\video.mka
输出如下:
Input #1, aac, from 'C:\Users\Administrator\Desktop\right.aac':
Duration: 00:00:05.24, bitrate: 74 kb/s
Stream #1:0: Audio: aac (LC), 44100 Hz, mono, fltp, 74 kb/s
Stream mapping:
Stream #0:0 (aac) -> amerge:in0
Stream #1:0 (aac) -> amerge:in1
amerge -> Stream #0:0 (libvorbis)
Press [q] to stop, [?] for help
[Parsed_amerge_0 @ 000000d1e787afc0] No channel layout for input 1
[Parsed_amerge_0 @ 000000d1e787afc0] Input channel layouts overlap: output layout will be determined by the number of distinct input channels
Output #0, matroska, to 'C:\Users\Administrator\Desktop\video.mka':
Metadata:
encoder : Lavf58.33.100
Stream #0:0: Audio: vorbis (libvorbis) (oV[0][0] / 0x566F), 44100 Hz, stereo, fltp (default)
Metadata:
encoder : Lavc58.59.100 libvorbis
size= 73kB time=00:00:06.95 bitrate= 86.4kbits/s speed=61.2x
video:0kB audio:67kB subtitle:0kB other streams:0kB global headers:4kB muxing overhead: 9.862594%
5.1声道
尽管双声道立体声的音质和声场效果大大好于单声道,但在家庭影院应用方面,它的局限性也暴露了出来。双声道立体声系统只能再现一个二维平面的空间感,即整个声场是平平地摆在我们面前,并不能让我们有置身其中的现场感。当然,由于在音乐会现场,观众原本就是坐在台下的,而乐队演奏人员则位于舞台之上,立体声所能再现的这种简单的声场方位感与现场音乐会的方位感是基本符合的,因而它仍能满足欣赏需求。但是,在欣赏影片时,整体声场全方位的三维空间感无疑可以给观众一种鲜活的,置身于其中的临场感,因此,多声道技术也开始发展起来。
5.1声道是指中央声道,前置左、右声道,后置左、右环绕声道,及所谓的0.1声道重低音声道。一套系统总共可连接6个喇叭。5.1声道已广泛运用于各类传统影院和家庭影院中,一些比较知名的声音录制压缩格式,譬如杜比AC-3(Dolby Digital)、DTS等都是以5.1声音系统为技术蓝本的,其中“0.1”声道,则是一个专门设计的超低音声道,这一声道可以产生频响范围20~120Hz的超低音。
千万不要以为5.1已经是环绕立体声的顶峰了,更强大的7.1系统已经出现了。它在5.1的基础上又增加了中左和中右两个发音点,以求达到更加完美的境界。由于成本比较高,没有广泛普及。
在这里插入图片描述图片来源于《FFmpeg从入门到精通》
多个音频合并为多声道
ffmpeg -y
-i C:\Users\cy\Desktop\left.aac
-i C:\Users\cy\Desktop\left.aac
-i C:\Users\cy\Desktop\left.aac
-i C:\Users\cy\Desktop\left.aac
-i C:\Users\cy\Desktop\left.aac
-i C:\Users\cy\Desktop\left.aac
-filter_complex "[0:a][1:a][2:a][3:a][4:a][5:a]amerge=inputs=6[aout]" -map "[aout]"
C:\Users\cy\Desktop\a5.1.aac
输出如下:
[aac @ 000001aea22d1940] Estimating duration from bitrate, this may be inaccurate
Input #0, aac, from 'C:\Users\cy\Desktop\left.aac':
Duration: 00:00:04.94, bitrate: 76 kb/s
Stream #0:0: Audio: aac (LC), 44100 Hz, mono, fltp, 76 kb/s
[aac @ 000001aea2306440] Estimating duration from bitrate, this may be inaccurate
Input #1, aac, from 'C:\Users\cy\Desktop\left.aac':
Duration: 00:00:04.94, bitrate: 76 kb/s
Stream #1:0: Audio: aac (LC), 44100 Hz, mono, fltp, 76 kb/s
[aac @ 000001aea22f8140] Estimating duration from bitrate, this may be inaccurate
Input #2, aac, from 'C:\Users\cy\Desktop\left.aac':
Duration: 00:00:04.94, bitrate: 76 kb/s
Stream #2:0: Audio: aac (LC), 44100 Hz, mono, fltp, 76 kb/s
[aac @ 000001aea40a9300] Estimating duration from bitrate, this may be inaccurate
Input #3, aac, from 'C:\Users\cy\Desktop\left.aac':
Duration: 00:00:04.94, bitrate: 76 kb/s
Stream #3:0: Audio: aac (LC), 44100 Hz, mono, fltp, 76 kb/s
[aac @ 000001aea40bc1c0] Estimating duration from bitrate, this may be inaccurate
Input #4, aac, from 'C:\Users\cy\Desktop\left.aac':
Duration: 00:00:04.94, bitrate: 76 kb/s
Stream #4:0: Audio: aac (LC), 44100 Hz, mono, fltp, 76 kb/s
[aac @ 000001aea22d9e40] Estimating duration from bitrate, this may be inaccurate
Input #5, aac, from 'C:\Users\cy\Desktop\left.aac':
Duration: 00:00:04.94, bitrate: 76 kb/s
Stream #5:0: Audio: aac (LC), 44100 Hz, mono, fltp, 76 kb/s
Stream mapping:
Stream #0:0 (aac) -> amerge:in0
Stream #1:0 (aac) -> amerge:in1
Stream #2:0 (aac) -> amerge:in2
Stream #3:0 (aac) -> amerge:in3
Stream #4:0 (aac) -> amerge:in4
Stream #5:0 (aac) -> amerge:in5
amerge -> Stream #0:0 (aac)
Press [q] to stop, [?] for help
[Parsed_amerge_0 @ 000001aea45c4f00] No channel layout for input 1
[Parsed_amerge_0 @ 000001aea45c4f00] Input channel layouts overlap: output layout will be determined by the number of distinct input channels
Output #0, adts, to 'C:\Users\cy\Desktop\a5.1.aac':
Metadata:
encoder : Lavf58.33.100
Stream #0:0: Audio: aac (LC), 44100 Hz, 5.1, fltp, 341 kb/s (default)
Metadata:
encoder : Lavc58.59.100 aac
size= 222kB time=00:00:06.96 bitrate= 261.4kbits/s speed=16.2x
video:0kB audio:220kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.934240%
[aac @ 000001aea40d5f40] Qavg: 19602.068
绘制音频波形
单声道波形图
ffmpeg -y -i C:\Users\Administrator\Desktop\video.aac -filter_complex "showwavespic=s=1920x1080"
-frames:v 1 C:\Users\Administrator\Desktop\wave.png
在这里插入图片描述
5.1声道的波形图
ffmpeg -y -i C:\Users\Administrator\Desktop\a5.1.aac -filter_complex "showwavespic=s=1920x1080:split_channels=1"
-frames:v 1 C:\Users\Administrator\Desktop\a5.1.png
在这里插入图片描述
atempo音频倍速处理
半速处理:
ffmpeg -y -i C:\Users\Administrator\Desktop\video.aac -filter_complex "atempo=tempo=0.5"
-acodec aac C:\Users\Administrator\Desktop\videotempo.aac
输出如下:
Input #0, aac, from 'C:\Users\Administrator\Desktop\video.aac':
Duration: 00:00:07.08, bitrate: 127 kb/s
Stream #0:0: Audio: aac (LC), 44100 Hz, stereo, fltp, 127 kb/s
Stream mapping:
Stream #0:0 (aac) -> atempo
atempo -> Stream #0:0 (aac)
Press [q] to stop, [?] for help
Output #0, adts, to 'C:\Users\Administrator\Desktop\videotempo.aac':
Metadata:
encoder : Lavf58.33.100
Stream #0:0: Audio: aac (LC), 44100 Hz, stereo, fltp, 128 kb/s
Metadata:
encoder : Lavc58.59.100 aac
size= 162kB time=00:00:13.83 bitrate= 96.1kbits/s speed=1.76x
video:0kB audio:158kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 2.577307%
2倍速处理:
ffmpeg -y -i C:\Users\Administrator\Desktop\video.aac -filter_complex "atempo=tempo=2"
-acodec aac C:\Users\Administrator\Desktop\videotempo.aac
输出如下:
Input #0, aac, from 'C:\Users\Administrator\Desktop\video.aac':
Duration: 00:00:07.08, bitrate: 127 kb/s
Stream #0:0: Audio: aac (LC), 44100 Hz, stereo, fltp, 127 kb/s
Stream mapping:
Stream #0:0 (aac) -> atempo
atempo -> Stream #0:0 (aac)
Press [q] to stop, [?] for help
Output #0, adts, to 'C:\Users\Administrator\Desktop\videotempo.aac':
Metadata:
encoder : Lavf58.33.100
Stream #0:0: Audio: aac (LC), 44100 Hz, stereo, fltp, 128 kb/s
Metadata:
encoder : Lavc58.59.100 aac
size= 40kB time=00:00:03.45 bitrate= 95.8kbits/s speed=0.784x
video:0kB audio:39kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 2.601521%
本文将会持续更新,敬请关注
欢迎分享、转载、联系、指正、批评、撕逼
微信公众号
这里写图片描述
QQ群
这里写图片描述