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