《音視頻開發進階指南》是我第一次了解到音視頻開發內在的小細節,書中很多還難以理解的內容,不過循序漸進不要慌嘛,慢慢進入這個充滿魅力的音視頻開發的世界。
壓縮編碼格式
音頻
音頻裸數據PCM(Pulse Code Modulation)脈沖編碼調制。壓縮編碼的原理實際上是壓縮掉亢余信號,亢余信號是指不能被人耳感到的信號,包含人耳聽覺范圍之外的音頻信號以及被掩蔽掉的音頻信號等。幾種常用的壓縮編碼格式:
① WAV編碼
WAV編碼的一種實現就是在PCM數據格式前面加上44字節。
完全沒有壓縮的實現方式導致該形式音質非常好,占用大量內存導致只適用于多媒體的開發中間文件、保存音樂和音效素材。
② MP3編碼
具有不錯的壓縮率,適用于高比特率下對兼容性有要求的音樂。
③ AAC編碼
AAC是新一代的音頻有損壓縮技術,通過一些附加的編碼技術(比如PS、SBR等),衍生出了LC-AAC、HE-AAC、HE=AAC v2三種主要的編碼格式。
適用于128kbit/s以下的音頻編碼,多用于視頻中的音頻軌編碼。
④ Ogg編碼
在各種碼率下都有比較優秀的表現,尤其是在中低碼率場景下。Ogg有著非常出色的算法,可以用更小的碼率達到更好的音質,128kbit/s的Ogg比192kbit/s甚至更高碼率的MP3還要出色。但是無論是軟件上還是硬件上受支持情況都不是很好。
視頻
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: 效果處理
遍歷整個視頻幀逐幀處理: