FFmpeg几种常见视频编辑操作总结
Posted 老樊Lu码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FFmpeg几种常见视频编辑操作总结相关的知识,希望对你有一定的参考价值。
1.视频切片,那么每隔50秒裁剪为一个文件
ffmpeg -i input.mp4 -c copy -map 0 -segment_time 00:00:30 -f segment output%03d.mp4
2.视频抽帧,在视频文件第15 秒位置,提取一张图片
ffmpeg -i input.mp4 -r 0.1 -t 20 image%3d.jpg
3.为视频打上水印
ffmpeg -i sub_video3.mp4 -vf drawtext="fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSerif.ttf:text='Watermark Text':fontsize=20:fontcolor=red:x=100:y=100" with_text3.mp4
vf 是视频过滤器;此处调用 drawtext 进行文本绘制。
- fontfile:指定字体文件;
- text:指定水印文字,utf8字符均支持;
- fontsize:字体大小;
- fontcolor:字体颜色;
- x, y :指定文字放置在画面的位置。
4.给视频加上时间戳
如果能给视频文件添加一个时间戳,动态展示播放,会是一种很好的播放体验。思考一下,其实打时间戳,与在画面绘制文本原理其实是一致的。ffmpeg 提供了 timecode 用于展示实时的时间。
ffmpeg -y -i input.mp4 -vf "drawtext=fontcolor=white:fontsize=16:fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf:box=1:boxcolor=black@0.3:x=50:y=20:timecode='00\\:01\\:00\\;02':rate=30000/1001" out.mp4
上面的指令,是从 01:00 位置开始显示时间戳。
5. 视频打上时间戳,自定义格式
这是第5条的加强版,使用灵活的自定义时间格式进行 overlay。
ffmpeg -i video.mp4 -vf drawtext="fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf:text='%T %D':x=10: y=10: fontsize=24: fontcolor=black" -vcodec libx264 -preset fast -crf 34 -threads 0 strftime.mp4
在本实例中,我们使用了格式化时间文本输出,同时为了优化CPU处理速度,手动选择了视频编码器 libx264,并且指定自动使用优化的多线程。
6.加强难度:耦合多路输入,并配上字幕
输入信号可以有多路,支持字幕需要引入字幕文件。
ffmpeg -i in_video.avi -c:v libx264 -vpre ipod640 -s 480x240 -b 256k -map 0:0 -c:a libfaac -ar 48000 -ab 128k -ac 2 -map 0:1 -i in_subtitles.srt -c:s copy -map 1:2 out_video_with_titles.m4v
7.保留原声合并音(视)频
ffmpeg -i {$input} -i {$addFilePath} -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -crf {$this->crf} -preset {$this->preset} {$output}
注意:inputs=输入流数量,duration=决定流的结束(longest最长输入时间,shortest最短,first第一个输入持续的时间),dropout_transition= 输入流结束时,容量重整时间
8.截取时间段内的音频
ffmpeg -ss {$startTime} -i {$input} -to {$endTime} -c copy -copyts {$outputPath}
ffmpeg -ss {$startTime} -i {$input} -t {$duration} -c copy {$outputPath}
如果你仅仅在输入文件之前( -i 之前)指定了 ss 选项,那么时间戳会被重置为 0,此时选项 t 和选项 to 产生的效果一样。
如:ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy cut.mp4
ffmpeg -i video.mp4 -ss 00:01:00 -to 00:02:00 -c copy cut.mp4
上面例子中,第一个命令会得到从 00:01:00 到 00:03:00 的片断,而第二个命令会真正得到从 00:01:00 到 00:02:00 的片断。
9.去除音视频的原声
ffmpeg -i {$input} -c:v copy -an {$output}
-c:v copy 表示复制视频,-an 表示不需要音频。
10.为不带音频的视频文件添加音频
ffmpeg -i {$input} -i {$audio} {$output}
#0:0 表示视频流,#0:1 表示音频流。该命令只适用于给音频流为空的视频文件添加音频流。
11.生成指定长度的空白音频
ffmpeg -f lavfi -i aevalsrc=0 -t {$seconds} -q:a 9 -ac 1 -ar 16000 -acodec pcm_s16le {$output}
12.视频转音频,wav 格式
ffmpeg -i {$input} -vn -ar 16000 -ac {$channel} -f wav {$output}
-vn 表示不需要视频。
13.生成视频封面图
ffmpeg -ss 00:00:00 -t 00:00:00.001 -i {$input} -r 1 -f image2 {$output}
14.改变音频文件的音量
ffmpeg -i {$input} -filter: volume={$multiple} -y {$output}
15.获取音视频时长
ffmpeg -i {$input} 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//
通过命令行命令,搜索、截取出 00:00:00 格式的音视频时长。
16.获取视频帧图
ffmpeg -i {$input} -vf scale=160:-1 -r {$numPerSecond} -start_number 000000 {$dir}/%11d.png
-start_number 设置输出文件名开始的数字。
17.修改视频分辨率5
ffmpeg -i {$input} -vf scale=iw*{$multiple}:ih*{$multiple} -crf {$this->crf} -preset {$this->preset} {$output}
-vf 表示滤镜。
scale 为滤镜里的缩放功能。
iw/ih 表示原始尺寸的大小。
scale=-1:ih*2 表示高度乘 2,宽度等比缩放。
pass 压制视频可自定义码率6 = 可自定义大小
ffmpeg -i {$input} -strict -2 -passlogfile {$dir} -vb {$bitRate}k -pass 1 -f mp4 -y /dev/null
ffmpeg -i {$input} -strict -2 -passlogfile {$dir} -vb {$bitRate}k -pass 2 -f mp4 {$output}
18.两条命令可以分开执行,也可以用 && 连接一起执行。
-strict -2 -passlogfile {$dir} 用于指定生成中间临时文件的目录。
-vb 可理解为 video bitrate。
19.生成纯色视频
ffmpeg -f lavfi -i color=white:1280*720:d=10 -format rgb32 -f matroska -vcodec libx264 -b:v 2000k color.mp4
20.循环图片生成视频
ffmpeg -stream_loop {$frame} -i {$input} {$output}
以上是关于FFmpeg几种常见视频编辑操作总结的主要内容,如果未能解决你的问题,请参考以下文章
Android 集成 FFmpeg 轻松实现一个音视频编辑 App