如何使用FFmpeg將AVI轉換為MP4(有損轉換和無損轉換)

語言: CN / TW / HK

翻譯、編輯:Alex

技術審校:劉歧

本文來自OTTVerse,作者為Krishna Rao Vijayanagar。

圖片

▲掃描圖中二維碼瞭解音視訊技術大會更多資訊▲

Easy-Tech#021#

在本篇文章中,我們將學習如何使用FFmpeg把視訊從AVI格式轉換為MP4格式(在重新/不重新編碼AVI檔案的情況下)。作為紅利,我們還將學習FFmpeg在Ubuntu、Mac和Windows上的安裝,並使用FFmpeg將AVI無損轉換為MP4。

視訊愛好者在網上最常問的問題就是:“如何將AVI轉換為MP4?”儘管問題似乎很唬人,但使用FFmpeg將AVI轉換為MP4卻非常簡單明瞭。

很多人也許不知道,FFmpeg是世界上最重要、最流行的視訊處理和壓縮庫之一。很多最高效的商業編碼器都有采用FFmpeg,還有一些專案,比如Handbrake、VLC播放器等軟體都獲得了FFmpeg的支援。

在本文中,讓我們一起來學習格式轉換處理,並對Codecs、Formats有一個基本的瞭解,然後再來看下格式轉換過程中是否需要重新編碼視訊。

廢話少說,上命令

好,如果你現在很著急將AV1轉換為MP4,那麼只要執行下面這行FFmpeg命令,這個方法對大部分用例都有效。

ffmpeg -i input_filename.avi -c:v copy -c:a copy -y output_filename.mp4

在該命令列中,你提供了:

  • AVI視訊作為輸入

  • 明確輸出MP4的檔名

  • 讓FFmpeg直接將視訊和音訊(命令為:-c:v copy -c:a copy)從AVI容器格式複製到MP4容器格式。

注意: 我假設你手上已經有了想要轉換格式的AVI檔案。如果沒有,你可以通過在網上搜索“avi video samples”獲取,或者在這裡下載(這是我在FFmpeg系列文章中將用到的):http://file-examples-com.github.io/uploads/2018/04/file_example_AVI_1280_1_5MG.avi

什麼是Codecs和Formats?

你需要知道的最重要的事就是Formats和Codecs之間的區別。

簡單來說,

  • 編解碼器(Codecs) 獲取原始音訊和視訊後進行壓縮,壓縮到一個合理的空間大小。這種壓縮是在考慮音訊和視訊質量的前提下完成的。更多關於視訊壓縮的介紹,請閱讀:視訊編碼完全指南

  • 音訊和視訊壓縮過程的輸出被打包進一個被稱為 容器(Formats) 的格式中,而開啟容器以及讀取音訊和視訊的方式也有明確的規則和指南。容器有不同的格式,如 MP4、AVI、WebM、MKV等。

當FFmpeg轉換格式時發生了什麼?

當你將AVI檔案交給FFmpeg並告訴它生成一個不帶任何引數的MP4檔案,它將解複用輸入檔案,提取原始視訊進行重新編碼,然後將它放入MP4容器格式中,最後返還給你輸出檔案。

這裡需要注意的關鍵點是:除非你告知FFmpeg不要重新編碼,否則它將重新編碼內容。 無論如何一定要記住這一點!重新編碼是預設設定。

這也是在文章開頭我們指示FFmpeg只複製音訊和視訊的原因。

現在讓我們嘗試使用FFmpeg通過重新編碼將AVI檔案轉換為MP4。

在此之前,我們先來檢查一下AVI檔案,研究一下其中的引數如何?要研究引數,我們可以使用ffprobe ,它是FFmpeg工程中的一個工具,對於分析視訊檔案來說非常有用。

請執行下面的命令:

ffprobe -i file_example_AVI_1280_1_5MG.avi

然後你得到:

Input #0, avi, from 'file_example_AVI_1280_1_5MG.avi': Metadata: encoder : Lavf57.19.100 Duration: 00:00:30.61, start: 0.000000, bitrate: 387 kb/s Stream #0:0: Video: h264 (High) (H264 / 0x34363248), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 234 kb/s, 30 fps, 30 tbr, 30 tbn, 60 tbc Stream #0:1: Audio: aac (LC) ([255][0][0][0] / 0x00FF), 48000 Hz, stereo, fltp, 139 kb/s

上面的程式碼清楚地顯示了兩個媒體流——視訊 #0:0 和音訊 #0:1。視訊解析度是1280x720、30fps,視訊編碼方式為High Profile的H.264/AVC,其位元速率為234 kbps。音訊使用aac ,其位元速率為139 kbps,取樣率為48 KHz。

現在,讓我們使用FFmpeg將AVI視訊轉換為MP4,但是我們要使用VP9而非H.264/AVC。下面是實現轉換的命令列:

ffmpeg -i file_example_AVI_1280_1_5MG.avi -c:a copy -c:v vp9 -b:v 100K outputVP9.mp4

這裡,你用FFmpeg:

  • 使用-c:a copy 引數原樣複製音訊(不重新編碼音訊)。

  • 使用VP9編碼,位元速率設定為100kbps(-c:v vp9 -b:v 100K )。

  • 輸出名為outputVP9.mp4的MP4檔案。

下面的程式碼就是執行上述命令時控制檯的輸出:

Input #0, avi, from 'file_example_AVI_1280_1_5MG.avi': Metadata: encoder : Lavf57.19.100 Duration: 00:00:30.61, start: 0.000000, bitrate: 387 kb/s Stream #0:0: Video: h264 (High) (H264 / 0x34363248), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 234 kb/s, 30 fps, 30 tbr, 30 tbn, 60 tbc Stream #0:1: Audio: aac (LC) ([255][0][0][0] / 0x00FF), 48000 Hz, stereo, fltp, 139 kb/s Stream mapping: Stream #0:0 -> #0:0 (h264 (native) -> vp9 (libvpx-vp9)) Stream #0:1 -> #0:1 (copy) Press [q] to stop, [?] for help [libvpx-vp9 @ 0x7f8fcb00f600] v1.8.2 Output #0, mp4, to 'outputVP9.mp4': Metadata: encoder : Lavf58.45.100 Stream #0:0: Video: vp9 (libvpx-vp9) (vp09 / 0x39307076), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=-1--1, 100 kb/s, 30 fps, 15360 tbn, 30 tbc Metadata: encoder : Lavc58.91.100 libvpx-vp9 Side data: cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 139 kb/s frame= 903 fps=1.2 q=0.0 Lsize= 959kB time=00:00:30.54 bitrate= 257.2kbits/s dup=2 drop=0 speed=0.0414x video:421kB audio:521kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.800530%

如果你認真讀取控制檯輸出,你就能發現FFmpeg使用了libvpx-vp9重新編碼了視訊流,位元速率是100kbps。

像以往一樣,你可以通過ffprobe確認之前FFmpeg成功地輸出了MP4,並且使用的視訊編碼是VP9。

ffprobe -i outputVP9.mp4

控制檯輸出可以確認:使用VP9編碼,位元速率為114 kbps(接近100kbps)。

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'outputVP9.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2mp41 encoder : Lavf58.45.100 Duration: 00:00:30.57, start: 0.000000, bitrate: 257 kb/s Stream #0:0(und): Video: vp9 (Profile 0) (vp09 / 0x39307076), yuv420p(tv, progressive), 1280x720, 114 kb/s, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 15360 tbn, 15360 tbc (default) Metadata: handler_name : VideoHandler Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 137 kb/s (default) Metadata: handler_name : SoundHandler

major-brand是isom,它告訴我們該檔案符合ISO/IEC基礎媒體格式(ISO/IEC 14496-12 – MPEG-4 Part 12),即MP4。

轉換過程中重新編碼是好是壞?

這要看你是想直接複製視訊並只改變容器格式(從AVI轉換為MP4)還是確實想要重新編碼視訊並更改視訊質量、大小等。

如果我不重新編碼(從AVI到MP4的無損轉換)會發生什麼?

這種情況下,你要做的非常簡單!直接執行下面的命令列就可以了。

ffmpeg -i input_filename.avi -c:v copy -c:a copy -y output_filename.mp4

你向FFmpeg 傳遞的資訊如下:

  • AVI視訊是輸入檔案

  • 確定輸出的MP4的檔名

  • 告知FFmpeg直接將視訊和音訊(命令為:-c:v copy -c:a copy )從AVI容器格式轉到MP4容器格式。

順便說下,上面的操作在我的Mac上只花了0.3秒。這是因為FFmpeg只是複製AVI檔案中的視訊和音訊,並未重新編碼,並將它們放入MP4容器。

因為視訊並沒有重新編碼,所以你可以認為這種從AVI到MP4的轉換是無損轉換。然而,如果我是你,我會在距離我三米之內的視訊壓縮工程師面前謹慎使用無損視訊壓縮這個詞。要是你這麼做了,請一定給他買杯咖啡或者阿司匹林壓壓驚 🙂

就到這裡了,現在你已經瞭解瞭如何使用FFmpeg將AVI轉換為MP4。很容易,對不對?

紅利:FFmpeg安裝指南

1、如何在Windows上安裝FFmpeg?

如果你不是程式設計師,且無法使用編碼工具,那麼在Windows上編譯和安裝FFmpeg對你來說將是一個複雜的過程。無論如何,你都可以前往_OTTVerse’s FFmpeg builds_ (http://ottverse.com/ffmpeg-builds/)下載已編譯的.exeFFmpeg檔案使用。我建議你下載靜態版本(除非你正計劃使用FFmpeg開發軟體並需要共享庫)。

2、如何在MacOS安裝FFmpeg?

在Mac上,你可以使用brew指令安裝FFmpeg,brew是Mac系統中一個非常好用的包管理器。下面是在Mac上安裝FFmpeg的命令列(在Cataline v 10.15.5上測試和使用):

brew install ffmpeg

3、如何在Ubuntu上安裝FFmpeg?

在Ubuntu上,你可以通過多種方式安裝 FFmpeg:使用apt包管理器或從原始碼編譯。如果你想要通過apt快速安裝FFmpeg,可以使用下面的命令列:

sudo apt install ffmpeg

如果你想從原始碼編譯FFmpeg,可以使用 FFmpeg 官方安裝指南中提到的步驟:http://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu;

或者你也可以參考我寫的這篇文章:http://ottverse.com/vmaf-ffmpeg-ubuntu-compilation-installation-usage-guide/,我已經描述了FFmpeg安裝過程(包括缺少步驟)。

致謝:

本文已獲得作者Krishna Rao Vijayanagar授權翻譯和釋出,特此感謝。

原文連結:

http://ottverse.com/ffmpeg-convert-avi-to-mp4-lossless/

延伸閱讀:

一文簡述FFmpeg

使用FFmpeg新增、刪除、替換和提取視訊中的音訊

FFmpeg 5.0 正式釋出


圖片