音視頻開發第一步

《音視頻開發進階指南》是我第一次了解到音視頻開發內在的小細節,書中很多還難以理解的內容,不過循序漸進不要慌嘛,慢慢進入這個充滿魅力的音視頻開發的世界。

壓縮編碼格式

音頻
音頻裸數據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: 效果處理

遍歷整個視頻幀逐幀處理:


逐幀處理

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 前言: 記載資料多為網絡搜集,侵刪。 根據最近接觸的整機項目做了一些整機音頻相關基礎知識的總結,如有不足或表述問題...
    Gawain_Knowknow閱讀 8,280評論 0 4
  • ### YUV顏色空間 視頻是由一幀一幀的數據連接而成,而一幀視頻數據其實就是一張圖片。 yuv是一種圖片儲存格式...
    天使君閱讀 3,372評論 0 4
  • 什么是 PCM 格式 聲音從模擬信號轉化為數字信號的技術,經過采樣、量化、編碼三個過程將模擬信號數字化。 采樣顧名...
    揚州慢_閱讀 12,504評論 1 19
  • 概述 本片文章主要介紹音頻基礎,在做音頻開發之前首先必須要對音頻的相關概念了解。以下是具體內容概述: 常見的音頻格...
    iosmedia閱讀 2,727評論 0 1
  • 前言 本篇開始講解在Android平臺上進行的音頻編輯開發,首先需要對音頻相關概念有基礎的認識。所以本篇要講解以下...
    Ihesong閱讀 7,845評論 2 18