ffmpeg architecture(上)
ffmpeg architecture(上)
· 視頻-您看到的是什么!
· 如果您有一系列圖像序列,并以給定的頻率(例如每秒24張圖像)進行更改,則會產(chǎn)生運動的錯覺。總之,這是視頻背后的基本概念:一系列以給定速率運行的圖片/幀。
音頻-您在聽什么!
盡管靜音的視頻可以表達各種感覺,但是添加聲音可以為體驗帶來更多樂趣。
聲音是指壓力波通過空氣或任何其他傳輸介質(zhì)(例如氣體,液體或固體)傳播的振動。
在數(shù)字音頻系統(tǒng)中,麥克風將聲音轉(zhuǎn)換為模擬電信號,然后通常使用脈沖編碼調(diào)制(PCM)的模數(shù)轉(zhuǎn)換器(ADC)將模擬信號轉(zhuǎn)換為數(shù)字信號。
編解碼器-縮小數(shù)據(jù)
CODEC是一種壓縮或解壓縮數(shù)字音頻/視頻的電子電路或軟件。它將原始(未壓縮的)數(shù)字音頻/視頻轉(zhuǎn)換為壓縮格式,反之亦然。 https://zh.wikipedia.org/wiki/Video_codec
但是,如果我們選擇將數(shù)百萬個圖像打包到一個文件中并稱為電影,那么最終可能會得到一個巨大的文件。讓我們做一下數(shù)學:
假設(shè)我們正在創(chuàng)建一個分辨率為1080 x 1920(高度x寬度)的視頻,并且我們將花費3 bytes每個像素(屏幕上的最小點)來編碼顏色(或24位顏色,這將為我們提供16,777,216種不同的顏色),視頻的播放時間24 frames per second很30 minutes長。
toppf = 1080 * 1920 // total_of_pixels_per_frame
cpp = 3 // cost_per_pixel
tis = 30 * 60 // time_in_seconds
fps = 24 //
frames_per_second
required_storage = tis * fps * toppf * cpp
該視頻大約需要250.28GB存儲或1.11Gbps帶寬!這就是為什么我們需要使用CODEC的原因。
容器-音頻和視頻的舒適場所
容器或包裝器格式是圖元文件格式,其規(guī)范描述了計算機文件中數(shù)據(jù)和元數(shù)據(jù)的不同元素如何共存。https://zh.wikipedia.org/wiki/Digital_container_format
甲包含所有流單個文件(主要是音頻和視頻),它也提供了同步和一般的元數(shù)據(jù),例如標題,分辨率等
通常,我們可以通過查看文件的擴展名來推斷文件的格式:例如,a video.webm可能是使用container的視頻webm。
FFmpeg-命令行
完整的跨平臺解決方案,用于記錄,轉(zhuǎn)換和流傳輸音頻和視頻。
要使用多媒體,我們可以使用稱為FFmpeg的AMAZING工具/庫。您已經(jīng)有可能直接或間接知道/使用它(是否使用Chrome?)。
它有一個名為的命令行程序ffmpeg,這是一個非常簡單但功能強大的二進制文件。例如,您可以通過輸入以下命令從轉(zhuǎn)換mp4為容器avi:
$ ffmpeg -i input.mp4 output.avi
我們只是在這里進行了重新混合,它正在從一個容器轉(zhuǎn)換為另一個容器。從技術(shù)上講,FFmpeg也可以進行轉(zhuǎn)碼,但我們稍后再討論。
FFmpeg命令行工具101
FFmpeg確實有一個文檔,可以很好地解釋其工作原理。
簡而言之,FFmpeg命令行程序期望以下參數(shù)格式執(zhí)行其操作ffmpeg {1} {2} -i {3} {4} {5},其中:
-
全局選項
-
輸入文件選項
-
輸入網(wǎng)址
-
輸出文件選項
-
輸出網(wǎng)址
第2、3、4和5部分可以根據(jù)需要任意設(shè)置。實際上,更容易理解此參數(shù)格式:
#警告:此文件約為300MB$ wget -O bunny_1080p_60fps.mp4 http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_60fps_normal.mp4 $ ffmpeg -y \ #全局選項 -c:a libfdk_aac -c:v libx264 \ #輸入選項 -i bunny_1080p_60fps.mp4 \ #輸入URL -c:v libvpx-vp9 -c:a libvorbis \ #輸出選項 bunny_1080p_60fps_vp9.webm #輸出網(wǎng)址
此命令獲取mp4包含兩個流(使用aacCODEC 編碼的音頻和使用h264CODEC 編碼的視頻)的輸入文件,并將其轉(zhuǎn)換為webm,同時更改其音頻和視頻CODEC。
我們可以簡化上面的命令,但是請注意FFmpeg將采用或猜測您的默認值。例如,當您只鍵入使用ffmpeg -i input.avi output.mp4哪種音頻/視頻編解碼器來生成output.mp4?
Werner Robitza編寫了有關(guān)使用FFmpeg進行編碼和編輯的必讀/執(zhí)行教程。
常見的視頻操作
在處理音頻/視頻時,我們通常會對媒體執(zhí)行一系列任務(wù)。
轉(zhuǎn)碼
什么?將其中一個流(音頻或視頻)從一個編解碼器轉(zhuǎn)換為另一個的行為。
為什么?有時某些設(shè)備(電視,智能手機,控制臺等)不支持X,但Y和更新的CODEC提供更好的壓縮率。
怎么樣?將H264(AVC)視頻轉(zhuǎn)換為H265(HEVC)。
$ ffmpeg -i bunny_1080p_60fps.mp4 -c:v libx265 \bunny_1080p_60fps_h265.mp4
什么?從一種格式(容器)轉(zhuǎn)換為另一種格式的行為。
為什么?有時某些設(shè)備(電視,智能手機,控制臺等)不支持X,但支持Y,有時更新的容器提供現(xiàn)代必需的功能。
怎么樣?將轉(zhuǎn)換mp4為webm。
$ ffmpeg -i bunny_1080p_60fps.mp4 -c復(fù)制\ #只是對ffmpeg說,跳過編碼 bunny_1080p_60fps.webm
轉(zhuǎn)換中
什么?更改比特率或產(chǎn)生其他再現(xiàn)的行為。
為什么?人們會嘗試2G使用功能較弱的智能手機在(邊緣)連接中觀看視頻,或者在fiber其4K電視上通過Internet連接觀看視頻,因此,您應(yīng)該為同一視頻提供不止一個比特率的不同版本。
怎么樣?產(chǎn)生比特率在3856K和2000K之間的演繹。
$ ffmpeg -i bunny_1080p_60fps.mp4 -最小964K-最大3856K -bufsize 2000K \bunny_1080p_60fps_transrating_964_3856.mp4
通常,我們將使用帶有轉(zhuǎn)換的轉(zhuǎn)換。Werner Robitza寫了另一篇有關(guān)FFmpeg速率控制的必讀/執(zhí)行的系列文章。
轉(zhuǎn)換中
什么?從一種分辨率轉(zhuǎn)換為另一種分辨率的行為。如前所述,轉(zhuǎn)換通常與轉(zhuǎn)換一起使用。
為什么?原因與移轉(zhuǎn)大致相同。
怎么樣?將轉(zhuǎn)換1080p為480p分辨率。
$ ffmpeg -i bunny_1080p_60fps.mp4 -vf scale = 480:-1 \bunny_1080p_60fps_transsizing_480.mp4
紅利回合:自適應(yīng)流
什么?產(chǎn)生多種分辨率(比特率)并將媒體拆分為多個部分并通過http服務(wù)的行為。為什么?為了提供可以在低端智能手機或4K電視上觀看的靈活媒體,它還易于擴展和部署,但會增加延遲。
怎么樣?使用DASH創(chuàng)建自適應(yīng)WebM。
#個視頻流$ ffmpeg -i bunny_1080p_60fps.mp4 -c:v libvpx-vp9 -s 160x90 -b:v 250k -keyint_min 150 -g 150 -an -f webm -dash 1 video_160x90_250k.webm $ ffmpeg -i bunny_1080p_60fps.mp4 -c:v libvpx-vp9 -s 320x180 -b:v 500k -keyint_min 150 -g 150 -an -f webm -dash 1 video_320x180_500k.webm $ ffmpeg -i bunny_1080p_60fps.mp4 -c:v libvpx-vp9 -s 640x360 -b:v 750k -keyint_min 150 -g 150 -an -f webm -dash 1 video_640x360_750k.webm $ ffmpeg -i bunny_1080p_60fps.mp4 -c:v libvpx-vp9 -s 640x360 -b:v 1000k -keyint_min 150 -g 150 -an -f webm -dash 1 video_640x360_1000k.webm $ ffmpeg -i bunny_1080p_60fps.mp4 -c:v libvpx-vp9 -s 1280x720 -b:v 1500k -keyint_min 150 -g 150 -an -f webm -dash 1 video_1280x720_1500k.webm #音頻流$ ffmpeg -i bunny_1080p_60fps.mp4 -c:a libvorbis -b:a 128k -vn -f webm -dash 1 audio_128k.webm #的DASH清單$ ffmpeg \ -f webm_dash_manifest -i video_160x90_250k.webm \ -f webm_dash_manifest -i video_320x180_500k.webm \ -f webm_dash_manifest -i video_640x360_750k.webm \ -f webm_dash_manifest -i video_640x360_1000k.webm \ -f webm_dash_manifest -i video_1280x720_500k.webm \ -f webm_dash_manifest -i audio_128k.webm \ -c復(fù)制-map 0 -map 1 -map 2 -map 3 -map 4 -map 5 \ -f webm_dash_manifest \ -adaptation_sets “ id = 0,streams = 0,1,2,3,4 id = 1,streams = 5 ” \ manifest.mpd
PS:我從指令中竊取了此示例,以使用DASH播放Adaptive WebM
超越
有許多和許多其他用途的FFmpeg的。我將它與iMovie結(jié)合使用,可以為YouTube制作/編輯一些視頻,您當然可以專業(yè)地使用它。
總結(jié)
以上是生活随笔為你收集整理的ffmpeg architecture(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 降低数值精度以提高深度学习性能
- 下一篇: ffmpeg architecture(