《音视频开发进阶指南》是我第一次了解到音视频开发内在的小细节,书中很多还难以理解的内容,不过循序渐进不要慌嘛,慢慢进入这个充满魅力的音视频开发的世界。
压缩编码格式
音频
音频裸数据PCM(Pulse Code Modulation)脉冲编码调制。压缩编码的原理实际上是压缩掉亢余信号,亢余信号是指不能被人耳感到的信号,包含人耳听觉范围之外的音频信号以及被掩蔽掉的音频信号等。几种常用的压缩编码格式:
① WAV编码
WAV编码的一种实现就是在PCM数据格式前面加上44字节。
WAV编码完全没有压缩的实现方式导致该形式音质非常好,占用大量内存导致只适用于多媒体的开发中间文件、保存音乐和音效素材。
② MP3编码
MP3编码具有不错的压缩率,适用于高比特率下对兼容性有要求的音乐。
③ AAC编码
AAC是新一代的音频有损压缩技术,通过一些附加的编码技术(比如PS、SBR等),衍生出了LC-AAC、HE-AAC、HE=AAC v2三种主要的编码格式。
AAC编码
适用于128kbit/s以下的音频编码,多用于视频中的音频轨编码。
④ Ogg编码
在各种码率下都有比较优秀的表现,尤其是在中低码率场景下。Ogg有着非常出色的算法,可以用更小的码率达到更好的音质,128kbit/s的Ogg比192kbit/s甚至更高码率的MP3还要出色。但是无论是软件上还是硬件上受支持情况都不是很好。
Ogg编码
视频
ISO标准 Motion JPEG即MPEG
MPEG算法适用于动态视频的压缩算法,除了对单幅图像进行编码外,还利用图像序列中的相关原则去除亢余,这样可以大大提高视频的压缩比。
ITU-T制定标准
H.261、H.262、H.263一系列视频编码标准。
两者又联合制定了H.264,又称为MPEG-4 Part10等。
视频裸数据表示中为什么要使用YUV而不是RGB?
对于视频帧的裸数据表示,更多使用的是YUV数据格式的表示,主要是应用于优化彩色视频信号的传输,以及向后兼容老式黑白电视,而使用YUY格式而不是RGB格式的主要原因是:
- RGB格式不利于压缩(每个像素都有三个小像素,而且必须同时传输)
- 眼睛对于亮和暗的分辨率要比对颜色的分辨率更精细,所以在视频数据的存储中,没有必要存储所有的颜色值。Y留给黑白信号(被称为“亮度”),UV用于色度的描述。
FFMpeg
FFMpeg简介
FF: Fast Forward
Mpeg: 视频编码标准MPEG
FFMpeg是一套可以用来记录、处理数字音频、视频,并将其转换为流的开源框架。
FFMpeg编译
FFmpeg编码库加入FDK-AAC、LAME、X264的静态库和头文件:
LAME
源代码: https://sourceforge.net/projects/lame/files/lame/
sh脚本: https://github.com/kewlbear/lame-ios-build
X264
源代码: https://www.videolan.org/developers/x264.html
sh脚本: https://github.com/kewlbear/x264-ios
FDK-AAC
源代码: https://github.com/mstorsjo/fdk-aac
sh脚本: https://github.com/kewlbear/fdk-aac-build-script-for-iOS
编译sh脚本的方式:
sudo sh (sh脚本名).sh
在编译前确认脚本的路径配置正确,不然会提示"无法找到其中一个文件":
FFmpeg 命令行
- ffprobe:查看媒体文件格式的工具
ffprobe (文件名).mp3
① ffprobe 和 Apple clang verison介绍
② configuration设置的配置
③ 具体信息
-
Metadata 元数据
-
Duration 时长 , start 开始时间 ,bitrate 比特率
-
stream #0: 音频流 采样率 立体音 fltp(float,4bit,planner平铺格式)这路流的比特率为 320kb/s
-
stream #1: 视频流 编码格式为mjpeg,每帧的数据表示是yuvj420p 宽高 363 * 363
-
ffplay: 媒体文件播放器
ffplay Modern_family.mp4 -loop 10 //重复播放 10遍
选择播放流
ffplay Modern_family.mp4 -ast 1 //播放视频中的第一路音频流,如果没有第一路音频流,则会静音
选择音画同步的对齐方式
ffplay Modern_family.mp4 -sync audio //指定以音频为基准进行音画同步(默认方式)
注意: 使用 外部时钟作为基准时,会导致在一些快进或后退操作时出现音画不同步的问题。
播放PCM裸音频数据
ffplay (文件名).pcm -f s16le -channels 2 -ar 44100
在播放PCM时没有设置-f(格式)、-channels(声道数)、-ar(采样率)等,是无法进行正确播放的,且会报错:
.pcm: Invalid data form when processing input
- ffmpeg: 媒体文件转换工具
实现音视频轨分离
ffmpeg -i (文件名).mp4 -vn -acodec copy output.m4a
-i fmt:指定输入文件名 -vn:取消视频的输出 -acodec copy: 音频强制使用codec编解码方式)
ffmpeg -i (文件名).mp4 -an -vcodec copy output.mp4
-an:取消音频的输出 -acodec copy: 视频强制使用codec编解码方式)
裁剪一段视频的时长
ffmpeg -i (文件名).mp4 -ss 46.0 -codec copy -t 1127 output.mp4
-ss 46.0(或 00:00:46.0) -t 1127: 从46秒开始裁剪1127秒的时间
图片处理
① 转换成gif图片格式
ffmpeg -i (文件名).mp4 -vf scale=200:-1 -t 4 -r 10 image.gif
-vf scale=100:-1 :按照分辨比例不动宽度改为200,并且只处理前4秒(-t),按照10的帧率(-r)
② 生成一张图片
ffmpeg -i frame_%d.jpeg -r 5 output.gif
音频处理
① 将音频a.mp3 MP3转换为WAV
ffmpeg -i (文件名).mp3 -acodec pcm_s16le output.wav
使用原mp3文件的声道数(-ac) 和 采样数(-ar)
② 将音频a.wav的音频降低
ffmpeg -i (文件名).wav -af ‘volume=0.5’ output.wav
③将音频a.wav作为背景音添加到视频的音频轨b中:
ffmpeg -i (文件名a).wav -i (文件名b).m4a -filter_complex amix=inputs=2:duration=shortest output.wav
将(a).wav 和 (b).m4a文件进行合并,按照时间长度较短的音频文件的时间长度作为最终输出output.wav的时间长度
视频处理
① 淡入淡出效果
ffmpeg -i (文件名).wav -filter_complex afade=t=in:ss=0:d=2 output.wav
afade=t=in: / afade=t=out: 效果处理
遍历整个视频帧逐帧处理:
逐帧处理
网友评论