ffmpeg經常使用命令

FFmpeg經常使用命令

1. 分離視頻音頻流

ffmpeg -i input.mp4 -c:v copy -an output_video.mp4  //-an 屏蔽audio 只提取出視頻流
ffmpeg -i input.mp4 -c:v copy -vn output_audio.mp4  //-vn 屏蔽video 只提取出音頻流
//實現類似功能的選項有 -vn / -an / -sn / -dn

2. 視頻解複用、封裝

//解複用demuxer
ffmpeg -i input.mp4 -c:v copy –an output.264 
ffmpeg -i input.avi -c:v copy –an output.264
//封裝muxer
ffmpeg -i input.264 -i <audio_file> -c:v copy c:a copy output.mp4

3. 視頻轉碼

//yuv
ffmpeg -i input.mp4 -ss 00:00:00 -to 00:00:10  -pix_fmt yuv420p output.yuv
ffmpeg -s w*h -pix_fmt yuv420p -r 30 -i input.yuv -c:v libx264 output.mp4

//libx264
ffmpeg -i input.mp4 -c:v libx264 -x264-param "level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000" -g 30 -b:v 1000k output.mp4 
ffmpeg -i input.mp4 -c:v libx264 -g 30 -crf 23 output.mp4

//libx265
ffmpeg -i input.mp4 -c:v libx265 -x265-param <param> -g 30 -b:v 1000k output.mp4

//硬解硬編(解碼hevc_cuvid、h264_cuvid,編碼hevc_nvenc、h264_nvenc)
ffmpeg -hwaccel cuvid -c:v hevc_cuvid -i input.mp4 -c:v hevc_nvenc -b:v 1000k -r 30 output.mp4

//硬解硬編、加filter(scale_cuda、resize、自定義cuda filter)
ffmpeg -hwaccel cuvid -c:v hevc_cuvid -i input.mp4 -vf scale_cuda=1280:720 -c:v hevc_nvenc output.mp4

//camera、v4l二、rtmp等
ffmpeg -re -i input.mp4 -f flv rtmp://myserver/live/mystream //-re 實時

4. 視頻剪切

//時間上截取 (-ss <start> -to <end>)
ffmpeg -i input.mp4 -r 1 -f image2 image-%3d.jpeg  //提取圖片,-r 提取圖像的頻率
ffmpeg -ss 00:01:30 -t 00:00:20 -i input.mp4 -c:v copy -c:a copy output.mp4    //剪切視頻,-ss 開始時間,-t 持續時間
ffmpeg -ss 00:1:30 -to 00:01:50 -i input.mp4 -c:v copy -c:a copy output.mp4    //剪切視頻,-ss 開始時間,-to 截止時間
//備註:若是開始時間和結束時間不在I幀上,直接copy可能會出現有一段時間沒視頻數據,畫面變成黑色
ffmpeg -ss 00:1:30 -to 00:01:50 -i input.mp4 -c:v libx265 -c:a copy output.mp4

//空間上裁剪 -vf crop=out_w:out_h:start_point_w:start_point_h      
ffmpeg -i input.mp4 -vf crop=640:480:0:0 -c:v libx265  -crf 23 -c:a copy output640x480.mp4

//cropdetect:自動檢測裁剪尺寸(自動去除邊緣的黑部)

5. 旋轉、翻轉

//水平翻轉輸入視頻(hflip、vflip)
ffmpeg -i in.avi -vf "hflip" out.avi
ffmpeg -i in.avi -vf "vflip" out.avi

//transpos
ffmpeg -i in.mov -vf "transpose=1" out.mov //Rotate 90 clockwise
ffmpeg -i in.mov -vf "transpose=2,transpose=2" out.mov //Rotate 180 degrees
0 = 90CounterCLockwise and Vertical Flip (default)
1 = 90Clockwise
2 = 90CounterClockwise
3 = 90Clockwise and Vertical Flip

//任意旋轉視頻角度(以弧度值表示)
//With 90 degrees equating with PI/2, you can do it like so:
ffmpeg -i in.mp4 -vf "rotate=PI/2" out.mp4
//for counter-clockwise the angle must be negative
ffmpeg -i in.mp4 -vf "rotate=-PI/2" out.mp4
//順時針旋轉PI/6:rotate=PI/6

6. 視頻拼接

//時間上拼接,視頻文件切片合併 concat    
ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg 
//或者 file_list.txt
cat file_list.txt
    # this is a comment
    file '/path/to/file1'
    file '/path/to/file2'
    file '/path/to/file3'
ffmpeg -f concat -i file_list.txt -c copy output.mp4

//空間上拼接 pad, overlay(疊加)
//pad=dst_w:dst_h:start_point_w:start_point_h
//overlay=start_point_w:start_point_h (默認爲0)
//2 video to 2x1 video                                       
ffmpeg -i input_640x480_1.mp4 -i input_640x480_2.mp4 -filter_complex "[0:0]pad=iw*2:ih:0:0[a];[a][1:0]overlay=w" -libx265 output_1280x480.mp4 //iw,ih 輸入視頻的寬高,[0:0]->第一視頻的第一個流,[1:0]->第二個視頻的第一路流
ffmpeg -i input_640x480_1.mp4 -i input_640x480_2.mp4 -filter_complex "[0:0]pad=1280:480:0:0[a];[a][1:0]overlay=640" -libx265 output_1280x480.mp4
//4 video to 2x2 video
ffmpeg -i 1_640x480.mp4 -i 2_640x480.mp4 -i 3_640x480.mp4 -i 4_640x480.mp4 -filter_complex "[0:0]pad=iw*2:ih*2:0:0[a];[a][1:0]overlay=640:0[over1];[over1][2:0]overlay=0:480[over2];[over2][3:0]overlay=640:480" -c:v libx265 output_2x2_1280x960.mp4

2x1
圖6.一、 2x1 video
2x2
圖6.二、 2x2 videohtml

7. 截屏

能夠經過ffmpeg直接抓取X11顯示內容:git

ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0+10,20 /tmp/out.mpg
//0.0 是X11服務的顯示屏幕號(display.screen), 定義於 DISPLAY 環境變量。 10是水平偏移, 20是垂直偏移

ffmpeg -f gdigrab -show_region 1 -framerate 6 -video_size cif -offset_x 10 -offset_y 20 -i desktop out.mpg

8. 圖片生成視頻、視頻提取圖片(視頻截圖)

//圖片生成視頻                  
ffmpeg -f image2 -framerate 30 -i foo-%03d.jpeg -s WxH foo.avi
//視頻生成圖片,可與 -ss 00:00:00 -to 00:00:10 結合使用
ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg

9. two pass

ffmpeg -y -i input.mp4 -c:v libx264 -b:v 2600k -pass 1 -an -f mp4 /dev/null && \
ffmpeg -i input.mp4 -c:v libx264 -b:v 2600k -pass 2 -c:a aac -b:a 128k output.mp4

10. 插幀、升幀

ffmpeg -i input-30fps.mp4 -vf fps=fps=60 output-60fps.mp4

11. hls、dash

//hls, -re 實時、直播        
ffmpeg -i in.mp4 -hls_segment_filename 'output%03d.ts' output.m3u8
ffmpeg -re -i in.mp4 -c:v libx264 -map 0 -f segment -segment_list playlist.m3u8 -segment_list_flags +live -segment_time 10 out%03d.mp4
//dash
ffmpeg -re -i <input> -map 0 -map 0 -c:a libfdk_aac -c:v libx264 -b:v:0 800k -b:v:1 300k -s:v:1 320x170 -profile:v:1 baseline -profile:v:0 main -bf 1 -keyint_min 120 -g 120 -sc_threshold 0 -b_strategy 0 -ar:a:1 22050 -use_timeline 1 -use_template 1 -window_size 5 -adaptation_sets "id=0,streams=v id=1,streams=a" -f dash /path/to/out.mpd

12. 軌道分離、合併 (map)

//音視頻軌道分離,假設input.mp4有兩個視頻軌,1個音頻軌
ffmpeg -i input.mp4 -map 0:0 -c:v copy output_stream1.mp4 -map 0:1 -c:v copy output_stream2.mp4 -map 0:3 -c:a copy output_audio.mp4 //0:0表示第一個輸入視頻的第一個視頻流

//多個視頻合成爲一個具備多個軌道的視頻
ffmpeg -i input_video_1.mp4 -i input_video_2.mp4 -i input_audio.mp4 -map 0:0:0 -c:v copy -map 1:0:0 -c:v copy -map 2:0:0 -c:a copy output_3track.mp4

Reference:
[1]: https://xdsnet.gitbooks.io/other-doc-cn-ffmpeg
[2]: http://ffmpeg.org/ffmpeg-all.htmlide

相關文章
相關標籤/搜索