【读书会第13期】FFMPEG的一些学习

举报
黄生 发表于 2022/07/10 17:30:40 2022/07/10
【摘要】 参加了华为云 · 云享读书会 第13期 《FFmpeg从入门到精通》,学到了一些知识,记录一下。同样的音视频技术,应用的场景却不太一样。在线视频。就是把自己硬盘上的电影啊连续剧搬到网上,也不用找种子什么的下载了。当然也应该不存在版权问题了。比如爱奇艺、优酷、腾讯视频等互动直播。比如斗鱼、虎牙、带货直播等。这些我不怎么用。短视频。比如斗鱼、快手。这个我经常刷。远程办公、远程会议等。比如腾讯会...

参加了华为云 · 云享读书会 第13期 《FFmpeg从入门到精通》,学到了一些知识,记录一下。同样的音视频技术,应用的场景却不太一样。

  1. 在线视频。就是把自己硬盘上的电影啊连续剧搬到网上,也不用找种子什么的下载了。当然也应该不存在版权问题了。比如爱奇艺、优酷、腾讯视频等
  2. 互动直播。比如斗鱼、虎牙、带货直播等。这些我不怎么用。
  3. 短视频。比如斗鱼、快手。这个我经常刷。
  4. 远程办公、远程会议等。比如腾讯会议。

个人感觉互动直播、和短视频是有互相交叉的,比如抖音里也有直播。
对于音视频的计算机的处理,我就想到了1997年Intel发布的Pentium MMX,加入了Multimedia Extension指令集。那是很久以前的过去的事情了。

图片中的颜色分量也叫做通道,三个颜色通道组合成一副彩色图片。而黑白图片是没有颜色通道的,他只有亮度,如果类比的话也可以把它叫做亮度通道,一个像素的亮度可以用8bit,也可以用10bit来表示,叫做位深。

人眼对亮度敏感,而对色彩不太敏感。所以我们习惯看黑白照片,但是完全无法忍受看一个单颜色通道的照片,比如红色通道的照片。像这样,你能忍吗?

image.png

彩色的表达方式,形成了不同的颜色空间。Rgb就适合显示而不适合于处理,我猜yuv是适合处理的。RGB颜色空间:
image.png

什么叫做不适合于处理的呢?比如压缩的处理,rgb是三种独立并且无主次的颜色分量,是不好做压缩技术处理的。

而YUV颜色空间,一般说的是Y’CrCb。采样格式灵活,4:2:0是常用并且够用的。
Cr和Cb是表示颜色的,具体代表什么含义不太清楚。
image.png

压缩的前提是存在冗余,冗余有空间的、时间的、编码的、视觉上的。打个比方,下午你发了一下午的呆,这段时间和空间就是被冗余掉了,人的生命是有限的,从这个角度看应该减少冗余,这样生命的价值会比较高。

在H.264编码过程中,每一帧的H图像都被分割为一个或多个条带(slice)进行编码。每个条带包含多个宏块(Macroblock,MB),宏块是H.264中的基本编码单元,其包含一个16像素×16像的亮度像块和两个8像×8像素的色度像素块,以及其他宏块头信息。
H.264的条带具有不同的类型,其中最常用的有I条带、P条带和B条带。各有什么特点和含义,就不说了,比较枯燥。H.265比较新,普及度也没有264高,也不说。

音频技术处理声音信号,声音信号是一种机械波,和电磁波有显著的不同,机械波是只有运动才会产生的。

声波中,振幅代表能量,频率代表音调,通常物体震动的频率与物体的长度、粗细、密度和厚度成反比,比如长的发音板比短的发音板发出的声音频率要低。
我们听到的声音大多是多种频率的声音复合而成,其中强度最大的频率分量由声源主体振动产生,称为“基因”,声源其他部分的振动同样产生频率不同、强度稍低的声音分量,称为“泛音”。声音的音色主要由泛音的特性决定。

几乎所有的声音信号都是由多个不同频率的信号复合而成的,而根据奈奎斯特采样定理,信号的采样频率必须超过最高频率分量的2倍以上,否则将出现频率混叠现象,产生采样失真。因为人耳可听声的频率范围约为20Hz-20kHz,所以在实践中常用的采样频率为44.1kHz,而如果只考虑人类语音的话,采样频率可以更低。
采样点采用一定的位深进行量化,显然位深越大,结果就可以更近似原来的样子。
采样和量化后,为便于传输,再使用PCM(脉冲编码调制 Pulse Code Modulation)进行二进制形式编码。

看一下MP3的格式:
image.png

MP3文件保存的是对PCM音频采样数据进行压缩编码之后的码流数据,而采样值在MP3文件中以“帧 Frame”的形式保存。每帧中采样值的数量根据使用编码算法的不同而不同,MPEG-1 Audio标准的Layer2和Layer3规定每帧保存1152个采样值。对于采样率为44.1kHz的MP3音频,每帧的持续时间为:
1152/44100*1000 = 26ms

相对于PCM,MP3提供了12倍的压缩率,而音质效果普通人耳无法区分。
image.png

其算法中,因为MP3是给人听的,所以引入了心理声学模型作为编码的核心模块之一。人对声音的感知十分复杂,例如,在安静的环境中我们可以清楚地听到夏日的午后蝉鸣,然而在机器轰鸣的厂房内则几乎听不到其他声音。人对声音的感知并非完全取决于声音的频率和强度等特性,而是可以根据音源和环境动态适应,此现象即人的听觉掩蔽效应。

封装格式 。为了解决多路音视频流的同步问題,基本流在经过处理后会复用到一个文件或数据流中,该文件包含了视频码流数据、音频码流数据和音视频同步信息,以及可能包含的字幕流数据,分集信息和元数据(如发行商,语言、演员信息)等。在复用后的文件中,信息的组织形式即为文件容器格式(File Container Format),又称作文件封装格式。文件封装格式除用少量的数据说明媒体信息的编码标准和基本参数外,不包含音视频数据在编码过程中的细节信息,其主要作用是组织容器中不同的基本流的保存和播放,以保证播放过程的同步。常用的有FLV,MPEG-TS(transport stream),MP4等。

如何高效的在网络上传输音视频流,就涉及到流媒体协议,流媒体协议也是在现有网络协议基础上进行制定的,常见的有 RTMP(real-time messaging protocol。Macromedia开发的)和HLS (HTTP Live Streaming。苹果提出的)。
RTMP 传输层采用TCP协议,需要在浏览器端安装flash插件进行播放,所以随着浏览器支持的减弱,其在网页端的市场也在减弱。
HLS的劣势是较高的传输延迟。如果你看到m3u8这样的TS文件分片的索引文件,就知道是用的HLS。

在使用ffmpeg改变封装格式的时候,默认会很慢,比如从Mp4转为avi。原因是这2种格式的默认编码是不一样的,MP4是H.264+AAC,而AVI是mpeg-4+MP3,这样就有视频音频的重新解码编码的过程,很耗时耗费资源。
而使用 -codec copy 选项,就快多了,因为不会重新编码。
比如这个昇腾代码拆解的直播,里面有一段宣传片段,可以这样提取:

ffmpeg -i ascend.mp4 -ss 3374 -t 196 -c copy out.mp4

从56分14秒开始,即3374秒,截取3分16秒,即196秒的片段。
截取出来的片段可以在这里观看https://www.bilibili.com/video/BV1Bf4y1d778/

音频音量的检测:

[root@ecs-d589 ~]# ffmpeg -i out.aac -af volumedetect -f null -
[aac @ 0x1066700] Estimating duration from bitrate, this may be inaccurate
Input #0, aac, from 'out.aac':
  Duration: 00:03:46.00, bitrate: 91 kb/s
  Stream #0:0: Audio: aac (LC), 48000 Hz, stereo, fltp, 91 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (aac (native) -> pcm_s16le (native))
Press [q] to stop, [?] for help
Output #0, null, to 'pipe:':
  Metadata:
    encoder         : Lavf58.76.100
  Stream #0:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
    Metadata:
      encoder         : Lavc58.134.100 pcm_s16le
size=N/A time=00:03:15.98 bitrate=N/A speed= 863x
video:0kB audio:36752kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
[Parsed_volumedetect_0 @ 0x108f700] n_samples: 18817024
[Parsed_volumedetect_0 @ 0x108f700] mean_volume: -12.8 dB
[Parsed_volumedetect_0 @ 0x108f700] **max_volume**: 0.0 dB
[Parsed_volumedetect_0 @ 0x108f700] histogram_0db: 920
[Parsed_volumedetect_0 @ 0x108f700] histogram_1db: 24767

将文件里的音量调整为原来的一半:

ffmpeg -i out.aac -af volume=0.5 o1.aac

将文件里的音量+5dB:

ffmpeg -i out.aac -af "volume = 5dB" -y o2.aac
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。