1. 程式人生 > >黃聰:FFmpeg 使用指南

黃聰:FFmpeg 使用指南

留下 時間 下一個 pseudo rdquo tle 全局 什麽 實時

1. ffmpeg 是什麽?

ffmpeg(命令行工具) 是一個快速的音視頻轉換工具。

2. ffmpeg 的使用方式

命令行: ffmpeg [全局選項] {[輸入文件選項] -i ‘輸入文件’} ... {[輸出文件選項] ‘輸出文件’} ...

3. ffmpeg 可使用的選項

3.1 通用選項

ff* 工具的通用選項是共享的。(FFplayFFprobe)

‘-L’	顯示 license
‘-h, -?, -help, --help [arg]’ 打印幫助信息;可以指定一個參數 arg ,如果不指定,只打印基本選項
	可選的 arg 選項:
	‘long’	除基本選項外,還將打印高級選項
	‘full’	打印一個完整的選項列表,包含 encoders, decoders, demuxers, muxers, filters 等的共享以及私有選項
	‘decoder=decoder_name’	打印名稱為 “decoder_name” 的解碼器的詳細信息
	‘encoder=encoder_name’	打印名稱為 “encoder_name” 的編碼器的詳細信息
	‘demuxer=demuxer_name’	打印名稱為 “demuxer_name” 的 demuxer 的詳細信息
	‘muxer=muxer_name’		打印名稱為 “muxer_name” 的 muxer 的詳細信息
	‘filter=filter_name’	  打印名稱為 “filter_name” 的過濾器的詳細信息
			
‘-version’	 顯示版本信息
‘-formats’	 顯示有效的格式
‘-codecs’	  顯示 libavcodec 已知的所有編解碼器
‘-decoders’	顯示有效的解碼器
‘-encoders’	顯示有效的編碼器
‘-bsfs’		顯示有效的比特流過濾器
‘-protocols’   顯示有效的協議
‘-filters’	 顯示 libavfilter 有效的過濾器
‘-pix_fmts’	顯示有效的像素格式 
‘-sample_fmts’ 顯示有效的采樣格式
‘-layouts’	 顯示通道名稱以及標準通道布局
‘-colors’	  顯示認可的顏色名稱
‘-hide_banner’ 禁止打印歡迎語;也就是禁止默認會顯示的版權信息、編譯選項以及庫版本信息等
3.2 一些主要選項
‘-f fmt (input/output)’ 
	強制輸入或輸出文件格式。通常,輸入文件的格式是自動檢測的,
	輸出文件的格式是通過文件擴展名來進行猜測的,所有該選項大
	多數時候不需要。
‘-i filename (input)’ 
	輸入文件名
‘-y (global)’ 
	覆蓋輸出文件而不詢問
‘-n (global)’ 
	不覆蓋輸出文件,如果一個給定的輸出文件已經存在,則立即
	退出
‘-c[:stream_specifier] codec (input/output,per-stream)’
‘-codec[:stream_specifier] codec (input/output,per-stream)’
	為一個或多個流選擇一個編碼器(當使用在一個輸出文件之前時)
	或者一個解碼器(當使用在一個輸入文件之前時)。codec 是一個
	編碼器/解碼器名稱或者一個特定值“copy”(只適用輸出)。
‘-t duration (output)’ 
	當到達 duration 時,停止寫輸出。
	duration 可以是一個數字(秒),或者使用hh:mm:ss[.xxx]形式。
	-to 和 -t 是互斥的,-t 優先級更高。
‘-to position (output)’ 
	在 position 處停止寫輸出。
	duration 可以是一個數字(秒),或者使用hh:mm:ss[.xxx]形式。
	-to 和 -t 是互斥的,-t 優先級更高。
‘-fs limit_size (output)’
	設置文件大小限制,以字節表示
‘-ss position (input/output)’
	當作為輸入選項時(在 -i 之前),在輸入文件中跳轉到 position。
	需要註意的是,在大多數格式中,不太可能精確的跳轉,因此,
	ffmpeg 將跳轉到 position 之前最接近的位置。當進行轉碼
	並且 ‘-accurate_seek’ 打開時(默認),位於跳轉點和 position 
	之間的額外部分將被解碼並且丟棄。當做流拷貝或者當使用
	‘-noaccurate_seek’時,它將被保留下來。
	當作為輸出選項時(在輸出文件名前),解碼但是丟棄輸入,直到
	時間戳到達 position。
	position 可以是秒或者 hh:mm:ss[.xxx] 形式
‘-itsoffset offset (input)’
	設置輸入時間偏移。 offset 將被添加到輸入文件的時間戳。指定
	一個正偏移,意味著相應的流將被延時指定時間。
‘-timestamp date (output)’
	在容器中設置錄音時間戳
‘-metadata[:metadata_specifier] key=value (output,per-metadata)’
	設置metadata key/value對
‘-target type (output)’
	指定目標文件類型(vcd, svcd, dvd, dv, dv50)。
	type 可以帶有 pal-, ntsc- 或 film- 前綴,以使用相應的標準。
	所有的格式選項(bitrate, codecs, buffer sizes)將自動設定。
‘-dframes number (output)’
	設置要錄制數據幀的個數。這是 -frames:d 的別名
‘-frames[:stream_specifier] framecount (output,per-stream)’  
	framecount 幀以後,停止寫流。
‘-q[:stream_specifier] q (output,per-stream)’
‘-qscale[:stream_specifier] q (output,per-stream)’ 
	使用固定質量範圍(VBR)。
‘-filter[:stream_specifier] filtergraph (output,per-stream)’
	創建filtergraph 指定的過濾圖,並使用它來過濾流。
‘-filter_script[:stream_specifier] filename (output,per-stream)’
	該選項與‘-filter’相似,唯一的不同是,它的參數是一個存放
	過濾圖的文件的名稱。
‘-pre[:stream_specifier] preset_name (output,per-stream)’ 
	指定匹配流的預設
‘-stats (global)’
	打印編碼進程/統計信息。默認打開,可以使用 -nostats 禁用。
‘-stdin’ 
	開啟標準輸入交互。默認打開,除非標準輸入作為一個輸入。
	可以使用 -nostdin 禁止。
‘-debug_ts (global)’
	打印時間戳信息。默認關閉。
‘-attach filename (output)’
	添加一個附件到輸出文件中
‘-dump_attachment[:stream_specifier] filename (input,per-stream)’ 
	提取匹配的附件流到filename指定的文件中。
3.3 視頻選項
-vframes number (output)’
	設置錄制視頻幀的個數。這是 -frames:v 的別名
‘-r[:stream_specifier] fps (input/output,per-stream)’
	設置幀率(Hz 值, 分數或縮寫)
‘-s[:stream_specifier] size (input/output,per-stream)’
	設置幀大小。格式為 ‘wxh’ (默認與源相同)
‘-aspect[:stream_specifier] aspect (output,per-stream)’
	設置視頻顯示長寬比
‘-vn (output)’
	禁止視頻錄制
‘-vcodec codec (output)’
	設置視頻 codec。這是 -codec:v 的別名
‘-pass[:stream_specifier] n (output,per-stream)’
	選擇pass number (1 or 2)。用來進行雙行程視頻編碼。
‘-passlogfile[:stream_specifier] prefix (output,per-stream)’
	設置 two-pass 日誌文件名前綴,默認為“ffmpeg2pass”。
‘-vf filtergraph (output)’
	創建 filtergraph 指定的過濾圖,並使用它來過濾流。
3.4 高級視頻選項
-pix_fmt[:stream_specifier] format (input/output,per-stream)’
	設置像素格式。
‘-sws_flags flags (input/output)’
	設置軟縮放標誌
‘-vdt n’
	丟棄閾值
‘-psnr’
	計算壓縮幀的 PSNR 
‘-vstats’
	復制視頻編碼統計信息到‘vstats_HHMMSS.log’
‘-vstats_file file’
	復制視頻編碼統計信息到 file
‘-force_key_frames[:stream_specifier] time[,time...] (output,per-stream)’
‘-force_key_frames[:stream_specifier] expr:expr (output,per-stream)’
	在指定的時間戳強制關鍵幀
‘-copyinkf[:stream_specifier] (output,per-stream)’
	當進行流拷貝時,同時拷貝開頭的非關鍵幀
‘-hwaccel[:stream_specifier] hwaccel (input,per-stream)’
	使用硬件加速來解碼匹配的流
‘-hwaccel_device[:stream_specifier] hwaccel_device (input,per-stream)’
	選擇硬件加速所使用的設備。該選項只有‘-hwaccel’同時指定時才有意義。
3.5 音頻選項
-aframes number (output)’
	設置錄制音頻幀的個數。這是 -frames:a 的別名
‘-ar[:stream_specifier] freq (input/output,per-stream)’
	設置音頻采樣率。
‘-aq q (output)’
	設置音頻質量。這是 -q:a 的別名
‘-ac[:stream_specifier] channels (input/output,per-stream)’
	設置音頻通道數。
‘-an (output)’
	禁止音頻錄制
‘-acodec codec (input/output)’
	設置音頻codec。這是-codec:a的別名
‘-sample_fmt[:stream_specifier] sample_fmt (output,per-stream)’
	設置音頻采樣格式
‘-af filtergraph (output)’
	創建filtergraph 所指定的過濾圖,並使用它來過濾流
3.6 字幕選項
-scodec codec (input/output)’
    設置字幕codec。這是 -codec:s 的別名
‘-sn (output)’
     禁止字幕錄制
3.7 高級選項
-map [-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]] | [linklabel] (output)’
	指定一個或多個流作為輸出文件的源。
	命令行中的第一個 -map 選項,指定輸出流0的源,
	第二個 -map 選項,指定輸出流1的源,等等。
‘-map_channel [input_file_id.stream_specifier.channel_id|-1][:output_file_id.stream_specifier]’
	將一個給定輸入的音頻通道映射到一個輸出。
‘-map_metadata[:metadata_spec_out] infile[:metadata_spec_in] (output,per-metadata)’
	設置下一個輸出文件的 metadata 信息。
‘-map_chapters input_file_index (output)’
	從索引號為 input_file_index 的輸入文件中拷貝章節到下一個輸出文件中。
‘-timelimit duration (global)’
	ffmpeg 運行 duration 秒後推出
‘-dump (global)’
	將每一個輸入包復制到標準輸出
‘-hex (global)’
	復制包時,同時復制負載
‘-re (input)’
	以本地幀率讀取數據。主要用來模擬一個采集設備,
	或者實時輸入流(例如:當從一個文件讀取時).
‘-vsync parameter’
	視頻同步方法
‘-async samples_per_second’
	音頻同步方法
‘-shortest (output)’
	當最短的輸入流結束時,終止編碼
‘-muxdelay seconds (input)’
	設置最大解封裝-解碼延時
‘-muxpreload seconds (input)’
	設置初始解封裝-解碼延時
‘-streamid output-stream-index:new-value (output)’
	為一個輸出流分配一個新的stream-id。
‘-bsf[:stream_specifier] bitstream_filters (output,per-stream)’
	為匹配的流設置比特流過濾器
‘-filter_complex filtergraph (global)’
	定義一個復雜的過濾圖
‘-lavfi filtergraph (global)’
	定義一個復雜的過濾圖。相當於‘-filter_complex’
‘-filter_complex_script filename (global)’
   該選項類似於‘-filter_complex’,唯一的不同是
   它的參數是一個定義過濾圖的文件的文件名
‘-accurate_seek (input)’
   打開或禁止在輸入文件中的精確跳轉。默認打開。

更詳細的高級選項說明,請查閱 ffmpeg 文檔

4. ffmpeg 使用示例

1) 輸出 YUV420P 原始數據
ffmpeg -i test.mp4 test.yuv
2) 從視頻前10s中提取圖像,1s提取一幀 ffmpeg -i test.mp4 -t 10 -r 1 -f image2 pic-%03d.jpeg
3) 從視頻中提取音頻 ffmpeg -i test.mp4 -vn music.mp2
4) 轉換 wav 格式,同時改變其采樣率 ffmpeg -i test.wav -ar 32K test.mp2
5) 輸出 mp3 原始 PCM 數據 ffmpeg -i test.mp3 -f s16le test.pcm


轉自http://www.tuicool.com/articles/nquMZv

黃聰:FFmpeg 使用指南