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
ffmpeg -s 1280x720 -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、v4l2、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
图6.1、 2x1 video
图6.2、 2x2 video
7. 截屏
可以通过ffmpeg直接抓取X11显示内容:
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.html