- 命令行 大體樣式
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
有道翻譯的 以后仔細回看
2.描述
ffmpeg是一個非常快的視頻和音頻轉換器,也可以從一個實時音頻/視頻源抓取。它還可以轉換之間的任意采樣率和調整大小的視頻在飛行與高品質多相濾波器。
ffmpeg讀取由-i選項指定的任意數量的輸入“文件”(可以是常規文件、管道、網絡流、抓取設備等),并寫入由普通輸出url指定的任意數量的輸出“文件”。在命令行中發現的任何不能解釋為選項的內容都被認為是輸出url。
原則上,每個輸入或輸出url可以包含任意數量的不同類型的流(視頻/音頻/字幕/附件/數據)。允許的流的數量和/或類型可能受到容器格式的限制。選擇哪個輸入流將自動進入哪個輸出流,或者使用-map選項(請參閱流選擇章節)。
要引用選項中的輸入文件,必須使用它們的索引(基于0)。例如,第一個輸入文件是0,第二個是1,等等。類似地,文件中的流也由它們的索引引用。2:3是指第三個輸入文件中的第四個流。還請參閱流說明符一章。
通常,選項應用于下一個指定的文件。因此,順序很重要,您可以在命令行上多次使用相同的選項。然后,將每個事件應用到下一個輸入或輸出文件。這個規則的例外是全局選項(例如冗長級別),應該首先指定它。
不要混合輸入和輸出文件-首先指定所有輸入文件,然后指定所有輸出文件。也不要混合屬于不同文件的選項。所有選項只適用于下一個輸入或輸出文件,并在文件之間重置。
To set the video bitrate of the output file to 64 kbit/s:
將輸出文件的視頻比特率設置為64 kbit/s:
ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi
To force the frame rate of the output file to 24 fps:
強制輸出文件幀率為24幀/秒:
ffmpeg -i input.avi -r 24 output.avi
To force the frame rate of the input file (valid for raw formats only) to 1 fps and the frame rate of the output file to 24 fps:
強制輸入文件的幀速率(只適用于原始格式)為1幀,輸出文件的幀速率為24幀:
ffmpeg -r 1 -i input.m2v -r 24 output.avi
???只適用于原始格式 不理解???
對于原始輸入文件,可能需要format選項。
3.詳細描述
ffmpeg中每個輸出的轉碼過程如下圖所示:
_______ ______________
| | | |
| input | demuxer | encoded data | decoder
| file | ---------> | packets | -----+
|_______| |______________| |v_________| || decoded || frames ||_________|________ ______________ |
| | | | |
| output | <-------- | encoded data | <----+
| file | muxer | packets | encoder
|________| |______________|
???decoded frames 這里不明白???
ffmpeg調用libavformat庫(包含demuxers)來讀取輸入文件并從其中獲取包含編碼數據的包。當有多個輸入文件時,ffmpeg試圖通過跟蹤任何活動輸入流上的最低時間戳來保持它們的同步。
???最低時間戳 什么概念 是不是最后的????
然后將經過編碼的包傳遞給解碼器(除非為流選擇streamcopy,否則請參閱進一步的描述)。解碼器產生未壓縮的幀(原始視頻/PCM音頻/…),可以通過過濾進一步處理(參見下一節)。過濾后,幀被傳遞給編碼器,編碼器對幀進行編碼并輸出編碼后的數據包。最后,它們被傳遞給muxer, muxer將經過編碼的包寫入輸出文件。
3.1過濾
在編碼之前,ffmpeg可以使用libavfilter庫中的過濾器處理原始音頻和視頻幀。幾個鏈接過濾器形成一個過濾器圖。ffmpeg區分了兩種過濾圖:簡單過濾圖和復雜過濾圖。
3.1.1 簡單過濾器圖
簡單的過濾器圖是那些只有一個輸入和輸出的過濾器,它們都屬于同一類型。在上圖中,只要在解碼和編碼之間插入一個額外的步驟,就可以表示為:
| | | |
| decoded | | encoded data |
| frames |\ _ | packets |
|_________| \ /||______________|\ __________ /simple _\|| | / encoderfiltergraph | filtered |/| frames ||__________|
簡單的過濾器圖配置為每流過濾器選項per-stream -filter option (分別為視頻和音頻配置-vf和-af別名)。一個簡單的視頻過濾圖可以像這樣:
_______ _____________ _______ ________
| | | | | | | |
| input | ---> | deinterlace | ---> | scale | ---> | output |
|_______| |_____________| |_______| |________|
注意,有些過濾器改變幀屬性,但不改變幀內容。例如,上面例子中的fps過濾器會改變幀數,但不會觸及幀內容。另一個例子是setpts過濾器,它只設置時間戳,并以其他方式不變地傳遞幀。
3.1.2 復雜過濾器圖
復雜的過濾圖不能簡單地描述為應用于一個流的線性處理鏈。例如,當圖形有多個輸入和/或輸出時,或者當輸出流類型與輸入不同時,就會出現這種情況。它們可以用下圖表示:
_________
| |
| input 0 |\ __________
|_________| \ | |\ _________ /| output 0 |\ | | / |__________|_________ \| complex | /
| | | |/
| input 1 |---->| filter |\
|_________| | | \ __________/| graph | \ | |/ | | \| output 1 |_________ / |_________| |__________|
| | /
| input 2 |/
|_________|
復雜過濾器圖配置為-filter_complex選項。注意,這個選項是全局的,因為復雜的過濾器圖本質上不能與單個流或文件明確關聯。
-lavfi選項相當于-filter_complex。
復雜過濾圖的一個簡單示例是overlay filter,它有兩個視頻輸入和一個視頻輸出,其中一個視頻覆蓋在另一個之上。它的音頻對應項是amix過濾器。
3.2 Stream copy
流復制是通過向-codec選項提供復制參數來選擇的模式。它使ffmpeg省略了指定流的解碼和編碼步驟,因此它只進行解復用和muxing。它對于更改容器格式或修改容器級元數據非常有用。在這種情況下,上面的圖表將簡化為:
_______ ______________ ________
| | | | | |
| input | demuxer | encoded data | muxer | output |
| file | ---------> | packets | -------> | file |
|_______| |______________| |________|
由于沒有解碼或編碼,它是非常快的,沒有質量損失。然而,由于許多因素,它可能在某些情況下不起作用。應用過濾器顯然也是不可能的,因為過濾器處理未壓縮的數據。
4. Stream selection
ffmpeg為手動控制每個輸出文件中的流選擇提供了-map選項。用戶可以跳過映射,并讓ffmpeg執行如下所述的自動流選擇。可以使用-vn / -an / -sn / -dn選項分別跳過視頻、音頻、字幕和數據流的包含,無論是手動映射還是自動選擇,但那些流是復雜過濾圖的輸出。
4.1 描述
下面的子部分描述了在流選擇中涉及的各種規則。下面的示例將展示如何在實踐中應用這些規則。
雖然已經盡了一切努力來準確地反映程序的行為,但是FFmpeg還在不斷地開發中,而且代碼可能在編寫本文時就已經更改了。
4.1.1 Automatic stream selection
在沒有特定輸出文件的任何映射選項的情況下,ffmpeg檢查輸出格式,以檢查可以包含哪種類型的流,即視頻、音頻和/或字幕。對于每個可接受的流類型,ffmpeg將在所有輸入中選擇一個可用的流。
它將根據以下標準選擇該流:
對于視頻,它是分辨率最高的流,
對于音頻,它是擁有最多頻道的流,
對于字幕,這是第一個字幕流,但有一個警告。輸出格式的默認字幕編碼器可以是基于文本的,也可以是基于圖像的,并且只選擇相同類型的字幕流。
在相同類型速率的多個流相同的情況下,選擇索引最低的流。
數據或附件流不會自動選擇,只能使用-map包含。
4.1.2 Manual stream selection
當使用-map時,該輸出文件中只包含用戶映射的流,下面描述的filtergraph輸出可能有一個例外。
4.1.3 Complex filtergraphs