mp4中的h264編碼,而h264有兩種封裝:
一種是annexb模式,傳統模式,有startcode,SPS和PPS是在ES中;另外一種是mp4模式,通常mp四、mkv、avi會沒有startcode,SPS和PPS以及其它信息被封裝在container中,每個frame前面是這個frame的長度,不少解碼器只支持annexb這種模式,所以須要將mp4作轉換;在ffmpeg中用h264_mp4toannexb_filter能夠作轉換;因此須要使用-bsf h264_mp4toannexb來進行轉換;linux
ffmpeg命令參數說明:app
-i 輸入文件ide
-vcodec 視頻編解碼格式,如:h264或者libx264(h264編解碼)、copy(原樣拷貝)、mpeg4(mp4編碼)oop
-acodec 音頻編碼格式,如aac(aac編解碼)編碼
-bsf h264_mp4toannexb 見上面解釋spa
-vn 取消視頻3d
-an 取消音頻code
-sn 取消字幕orm
-intra 採用幀內編碼,僅適用幀內編碼視頻
更多參數詳見最後。
1.分離視頻音頻流
ffmpeg -i input_file -vcodec copy -an output_file_video //分離視頻流 ffmpeg -i input_file -acodec copy -vn output_file_audio //分離音頻流
ffmpeg -i target.mp4 -vcodec libx264 -an target.h264 // 將target.mp4分離出沒有聲音的h264編碼的視頻文件
ffmpeg -i target.mp4 -acodec aac target.aac // // 將target.mp4分離出aac編碼的音頻文件
ffmpeg -i target.mp4 -c:v libx264 -c:a aac -strict -2 -f hls target.m3u8 // 將mp4文件切爲ts視頻段,並生成m3u8文件
2.視頻解複用
ffmpeg –i test.mp4 –vcodec copy –an –f m4v test.264 ffmpeg –i test.avi –vcodec copy –an –f m4v test.264
3.視頻轉碼
ffmpeg –i test.mp4 –vcodec h264 –s 352*278 –an –f m4v test.264 //轉碼爲碼流原始文件 ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352*278 –an –f m4v test.264 //轉碼爲碼流原始文件 ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi //轉碼爲封裝文件 //-bf B幀數目控制,-g 關鍵幀間隔控制,-s 分辨率控制
ffmpeg -i target.h264 -vcodec h264 -i target.aac -acodec copy target.ts
4.視頻封裝
ffmpeg –i video_file –i audio_file –vcodec copy –acodec copy output_file
5.視頻剪切
ffmpeg –i test.avi –r 1 –f image2 image-%3d.jpeg //提取圖片 ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi //剪切視頻 //-r 提取圖像的頻率,-ss 開始時間,-t 持續時間
6.視頻錄製
ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec copy out.avi
7.YUV序列播放
ffplay -f rawvideo -video_size 1920x1080 input.yuv
8.YUV序列轉AVI
ffmpeg –s w*h –pix_fmt yuv420p –i input.yuv –vcodec mpeg4 output.avi
經常使用參數說明:
主要參數: -i 設定輸入流 -f 設定輸出格式 -ss 開始時間 視頻參數: -b 設定視頻流量,默認爲200Kbit/s -r 設定幀速率,默認爲25 -s 設定畫面的寬與高 -aspect 設定畫面的比例 -vn 不處理視頻 -vcodec 設定視頻編解碼器,未設定時則使用與輸入流相同的編解碼器 音頻參數: -ar 設定採樣率 -ac 設定聲音的Channel數 -acodec 設定聲音編解碼器,未設定時則使用與輸入流相同的編解碼器 -an 不處理音頻
------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------
一、將文件當作直播送至live
ffmpeg -re -i localFile.mp4 -c copy -f flv rtmp://server/live/streamName
二、將直播媒體保存至本地文件
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv
三、將其中一個直播流,視頻改用h264壓縮,音頻不變,送至另一個直播服務流
ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v libx264 -vpre slow -f flv rtmp://server/live/h264Stream
四、將其中一個直播流,視頻改用h264壓縮,音頻改用faac壓縮,送至另一個直播服務流
ffmpeg -i rtmp://server/live/originalStream -c:a libfaac -ar 44100 -ab 48k -c:v libx264 -vpre slow -vpre baseline -f flv rtmp://server/live/h264Stream
五、將其中一個直播流,視頻不變,音頻改用faac壓縮,送至另一個直播服務流
ffmpeg -i rtmp://server/live/originalStream -acodec libfaac -ar 44100 -ab 48k -vcodec copy -f flv rtmp://server/live/h264_AAC_Stream
六、將一個高清流,複製爲幾個不一樣視頻清晰度的流從新發布,其中音頻不變
ffmpeg -re -i rtmp://server/live/high_FMLE_stream -acodec copy -vcodec x264lib -s 640×360 -b 500k -vpre medium -vpre baseline rtmp://server/live/baseline_500k -acodec copy -vcodec x264lib -s 480×272 -b 300k -vpre medium -vpre baseline rtmp://server/live/baseline_300k -acodec copy -vcodec x264lib -s 320×200 -b 150k -vpre medium -vpre baseline rtmp://server/live/baseline_150k -acodec libfaac -vn -ab 48k rtmp://server/live/audio_only_AAC_48k
七、功能同樣,只是採用-x264opts選項
ffmpeg -re -i rtmp://server/live/high_FMLE_stream -c:a copy -c:v x264lib -s 640×360 -x264opts bitrate=500:profile=baseline:preset=slow rtmp://server/live/baseline_500k -c:a copy -c:v x264lib -s 480×272 -x264opts bitrate=300:profile=baseline:preset=slow rtmp://server/live/baseline_300k -c:a copy -c:v x264lib -s 320×200 -x264opts bitrate=150:profile=baseline:preset=slow rtmp://server/live/baseline_150k -c:a libfaac -vn -b:a 48k rtmp://server/live/audio_only_AAC_48k
八、將當前攝像頭及音頻經過DSSHOW採集,視頻h26四、音頻faac壓縮後發佈
ffmpeg -r 25 -f dshow -s 640×480 -i video=」video source name」:audio=」audio source name」 -vcodec libx264 -b 600k -vpre slow -acodec libfaac -ab 128k -f flv rtmp://server/application/stream_name
九、將一個JPG圖片通過h264壓縮循環輸出爲mp4視頻
ffmpeg.exe -i INPUT.jpg -an -vcodec libx264 -coder 1 -flags +loop -cmp +chroma -subq 10 -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -flags2 +dct8x8 -trellis 2 -partitions +parti8x8+parti4x4 -crf 24 -threads 0 -r 25 -g 25 -y OUTPUT.mp4
十、將普通流視頻改用h264壓縮,音頻不變,送至高清流服務(新版本FMS live=1)
ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v libx264 -vpre slow -f flv 「rtmp://server/live/h264Stream live=1〃
ffmpeg參數說明:
基本選項: | |
---|---|
-formats | 輸出全部可用格式 |
-f fmt | 指定格式(音頻或視頻格式) |
-i filename | 指定輸入文件名,在linux下固然也能指定:0.0(屏幕錄製)或攝像頭 |
-y | 覆蓋已有文件 |
-t duration | 記錄時長爲t |
-fs limit_size | 設置文件大小上限 |
-ss time_off | 從指定的時間(s)開始, [-]hh:mm:ss[.xxx]的格式也支持 |
-itsoffset time_off | 設置時間偏移(s),該選項影響全部後面的輸入文件。該偏移被加到輸入文件的時戳,定義一個正偏移意味着相應的流被延遲了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持 |
-title string | 標題 |
-timestamp time | 時間戳 |
-author string | 做者 |
-copyright string | 版權信息 |
-comment string | 評論 |
-album string | album名 |
-v verbose | 與log相關的 |
-target type | 設置目標文件類型("vcd", "svcd", "dvd", "dv", "dv50", "pal-vcd", "ntsc-svcd", ...) |
-dframes number | 設置要記錄的幀數 |
視頻選項: | |
-b | 指定比特率(bits/s),彷佛ffmpeg是自動VBR的,指定了就大概是平均比特率 |
-bitexact | 使用標準比特率 |
-vb | 指定視頻比特率(bits/s) |
-vframes number | 設置轉換多少楨(frame)的視頻 |
-r rate | 幀速率(fps) (能夠改,確認非標準楨率會致使音畫不一樣步,因此只能設定爲15或者29.97) |
-s size | 指定分辨率 (320x240) |
-aspect aspect | 設置視頻長寬比(4:3, 16:9 or 1.3333, 1.7777) |
-croptop size | 設置頂部切除尺寸(in pixels) |
-cropbottom size | 設置底部切除尺寸(in pixels) |
-cropleft size | 設置左切除尺寸 (in pixels) |
-cropright size | 設置右切除尺寸 (in pixels) |
-padtop size | 設置頂部補齊尺寸(in pixels) |
-padbottom size | 底補齊(in pixels) |
-padleft size | 左補齊(in pixels) |
-padright size | 右補齊(in pixels) |
-padcolor color | 補齊帶顏色(000000-FFFFFF) |
-vn | 取消視頻 |
-vcodec codec | 強制使用codec編解碼方式('copy' to copy stream) |
-sameq | 使用一樣視頻質量做爲源(VBR) |
-pass n | 選擇處理遍數(1或者2)。兩遍編碼很是有用。第一遍生成統計信息,第二遍生成精確的請求的碼率 |
-passlogfile file | 選擇兩遍的紀錄文件名爲file |
-newvideo | 在如今的視頻流後面加入新的視頻流 |
高級視頻選項 | |
-pix_fmt format | set pixel format, 'list' as argument shows all the pixel formats supported |
-intra | 僅適用幀內編碼 |
-qscale q | 以<數值>質量爲基礎的VBR,取值0.01-255,約小質量越好 |
-loop_input | 設置輸入流的循環數(目前只對圖像有效) |
-loop_output | 設置輸出視頻的循環數,好比輸出gif時設爲0表示無限循環 |
-g int | 設置圖像組大小 |
-cutoff int | 設置截止頻率 |
-qmin int | 設定最小質量,與-qmax(設定最大質量)共用,好比-qmin 10 -qmax 31 |
-qmax int | 設定最大質量 |
-qdiff int | 量化標度間最大誤差 (VBR) |
-bf int | 使用frames B 幀,支持mpeg1,mpeg2,mpeg4 |
音頻選項: | |
-ab | 設置比特率(單位:bit/s,也許老版是kb/s)前面-ac設爲立體聲時要以一半比特率來設置,好比192kbps的就設成96,轉換 默認比特率都較小,要聽到較高品質聲音的話建議設到160kbps(80)以上。 |
-aframes number | 設置轉換多少楨(frame)的音頻 |
-aq quality | 設置音頻質量 (指定編碼) |
-ar rate | 設置音頻採樣率 (單位:Hz),PSP只認24000 |
-ac channels | 設置聲道數,1就是單聲道,2就是立體聲,轉換單聲道的TVrip能夠用1(節省一半容量),高品質的DVDrip就能夠用2 |
-an | 取消音頻 |
-acodec codec | 指定音頻編碼('copy' to copy stream) |
-vol volume | 設置錄製音量大小(默認爲256) <百分比> ,某些DVDrip的AC3軌音量極小,轉換時能夠用這個提升音量,好比200就是原來的2倍 |
-newaudio | 在如今的音頻流後面加入新的音頻流 |
字幕選項: | |
-sn | 取消字幕 |
-scodec codec | 設置字幕編碼('copy' to copy stream) |
-newsubtitle | 在當前字幕後新增 |
-slang code | 設置字幕所用的ISO 639編碼(3個字母) |
Audio/Video 抓取選項: | |
-vc channel | 設置視頻捕獲通道(只對DV1394) |
-tvstd standard | 設 |
轉換爲flv: ffmpeg -i test.mp3 -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 test.flv ffmpeg -i test.wmv -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 test.flv 轉換文件格式的同時抓縮微圖: ffmpeg -i "test.avi" -y -f image2 -ss 8 -t 0.001 -s 350x240 'test.jpg' 對已有flv抓圖: ffmpeg -i "test.flv" -y -f image2 -ss 8 -t 0.001 -s 350x240 'test.jpg' 轉換爲3gp: ffmpeg -y -i test.mpeg -bitexact -vcodec h263 -b 128 -r 15 -s 176x144 -acodec aac -ac 2 -ar 22500 -ab 24 -f 3gp test.3gp ffmpeg -y -i test.mpeg -ac 1 -acodec amr_nb -ar 8000 -s 176x144 -b 128 -r 15 test.3gp