ffmpeg剪切和合并视频文件命令
相关参考文章列表:
中文文档:https://www.longqi.cf/tools/2015/02/13/ffmpegcn/
https://www.jianshu.com/p/aba78d738c5d
https://blog.csdn.net/yu540135101/article/details/84311244
https://cloud.tencent.com/developer/article/1972715
ffmpeg是一个非常快的视频和音频转换器,还可以抓取实时的音频/视频流。它可以在任意的采样率之间的转换和调整视频,并同时使用高品质的多相滤波器。
ffmpeg从输入“文件”(其可以是常规文件,管道,网络流,录制装置等),由指定任意数量的读取-i选项,并写入到任意数量的输出“文件”,只需指定一个输出的文件名。任何一个命令行中不能被解释为选项的内容都被认为是一个输出文件名。
ffmpeg命令行要点:
作为一般规则,选项作用于下一个指定的文件。因此,命令的顺序是重要,你可以在命令行上多次相同的选项。每次选项的出现都将作用于下一个输入或输出文件。这条规则若有例外将会提前声明(例如冗余级别)。
不要混合输入和输出文件。首先指定所有输入文件,那么所有的输出文件。也不要混用属于不同的文件的选项。所有选项仅适用于下一个输入或输出文件,之后选项将被重置
引用输入文件的选项时,则必须使用他们的索引(从0开始)。例如:第一输入文件是0 ,第二个是1等。类似地,一个文件中的流也通过其索引指定。例如2:3指的是在第三个输入文件中的第四数据流。参见流章节
每个输入或输出文件可以在原则上,包含任意数量的不同类型(视频/音频/字幕/附件/数据)的流。输出文件中允许流的数量和类型是由输出格式容器限制决定的。输入流和输出流直接的映射可以自动完成也可以用-map选项给定(见流选择章节)。
format 选项可能需要指定,对于原始输入文件。滤镜
在编码之前, ffmpeg可以使用libavfilter库中的滤镜处理原始的音频和视频帧。几个连接的滤镜可以形成一个滤镜组(filtergraphs)。 ffmpeg有两种filtergraphs:简单和复杂。
简单filtergraphs
简单filtergraphs是那些具有相同的类型且正好一个输入和输出的滤镜组。另外,在上图中,他们可以由简单地在解码和编码之间插入附加步骤来表示:
_________ ______________
| | | |
| decoded | | encoded data |
| frames |\ _ | packets |
|_________| \ /||______________|
\ __________ /
simple _\|| | / encoder
filtergraph | filtered |/
| frames |
|__________|简单filtergraphs配置了每个流的筛选器选项(与视频和音频分别-vf和-af别名)。一个简单的FilterGraph动态视频可以看一下这样的例子:
_______ _____________ _______ ________
| | | | | | | |
| input | ---> | deinterlace | ---> | scale | ---> | output |
|_______| |_____________| |_______| |________|需要注意的是一些滤镜改变帧属性而不是画面的内容。例如,在上例中,fps改变帧的数量,但不触及帧的内容。又如setpts滤镜,其仅设置时间戳而保持帧不变。
复杂filtergraphs
复杂filtergraphs是那些不能被描述为简单的线性处理链的滤镜组。例如,当滤镜组具有多个输入和/或输出,或当输出流的类型是不同于输入。它们可以被表示为以下图:
_________
| |
| input 0 |\ __________
|_________| \ | |
\ _________ /| output 0 |
\ | | / |__________|
_________ \| complex | /
| | | |/
| input 1 |---->| filter |\
|_________| | | \ __________
/| graph | \ | |
/ | | \| output 1 |
_________ / |_________| |__________|
| | /
| input 2 |/
|_________|复杂filtergraphs可使用-filter_complex选项配置。注意,此选项是全局性的,因为复杂FilterGraph,就其本质,不能明确地与单个流或文件相关联。
-lavfi选项相当于-filter_complex。
一个复杂FilterGraph动态的简单的例子是在overlay滤镜,它具有两个视频输入和一个视频输出,含有一个视频重叠在另一个的上面。其对应的音频滤镜是amix。
复制流
复制流是通过添加copy选项到-codec选项完成的。它使ffmpeg对指定的流忽略解码和编码步骤,所以它只能混合和拆包。它用于改变所述容器的格式或修改容器级别的元数据是有用的。在这种情况下,可以简化为这样:
_______ ______________ ________
| | | | | |
| input | demuxer | encoded data | muxer | output |
| file | ---------> | packets | -------> | file |
|_______| |______________| |________|由于不存在解码或编码,它是非常快,没有质量损失。然而因为许多因素的工作,它可能无法在某些情况下使用。应用滤镜显然也是不可能的,因为滤镜仅能作用在未压缩的数据上。
4 选择流
默认情况下, ffmpeg只包含输入文件中每个类型流各一个(视频,音频,字幕),并将它们添加到每个输出文件。它选择“最好”的每一个流基于以下标准:用于视频,它选择最高分辨率的流;对于音频,它使用最多声道的流;对于字幕,它是第一个字幕流。在相同类型中,参数相等的若干流中具有最低索引的流被选择。
您可以通过-vn/-an/-sn选项禁用其中的一些默认值。若需全手动控制,请使用-map选项,它将禁用刚才所描述的默认设置。
5 选项
所有的数值选项中,如果不另外指明,均表示接受数作为输入,其后可添加一个SI单位的字符串,例如:K,M,或G。
如果i被附加在SI单位,完整的前缀将被解释为一个单元前缀的二进制倍数,也即1024倍,而不是1000倍。追加B可使数值增加8倍。这允许使用,例如:KB,MiB,G和B的数量后缀。
选项不带参数是布尔选项,并设置相应的值设置为true。他们可以通过在选项前添加no来将选项设置为false。例如使用-nofoo将设置名称为foo为假
流标识符
有些选项是按流的,例如比特率或编解码器。流标识符被用来精确地指定一个给定的选项作用于哪一个数据流(多个)。
一个标识符一般是选项名称加冒号分隔的字符串。例如-codec:a:1 ac3包含流标识符a:1,它匹配第二音频流。因此,将选择AC3编解码器的第二音频流。
一个标识符可以匹配多个流,这个选项将适用于所有流。比如,流标识符-b:a 128k标识了所有的音频流。
空标识符匹配所有的流。例如, -codec copy或-codec: copy会复制所有的数据流而不重新编码。
流标识符的可能形式有:
stream_index匹配与该索引对应的流。例如-threads:1 4将设置第二个流的线程计数为4。
stream_type[:stream_index]流类型是下列字母之一:v为视频,a为声音,s为字幕,d为数据,t为附件。如果stream_index给出,则它匹配该类型的索引为stream_index的流。否则,它匹配所有这种类型的流。
p:program_id[:stream_index]如果给定stream_index,那其将与在与ID为 program_id的program的stream_index的流相匹配。否则,它将匹配在program_id中的所有流。
#stream_id 或者 i:stream_id按流索引逐一匹配流(如在MPEG-TS容器中的PID)。
m:key[:value]匹配流的元数据标签中具有指定key的流。如果value 没有给出,将匹配包含给定标签的所有流。
请注意,在ffmpeg中,按元数据匹配仅能用于输入文件
================== 以上内容摘自 https://www.longqi.cf/tools/2015/02/13/ffmpegcn
比较重要和复杂的两个参数
-filter_complex
-map查看文件的详情流信息
ffprobe -show_streams -of json video/concataudio.mp4
ffprobe input.mp4
ffprobe -show_data input.mp4
ffprobe -show_packets input.mp4
ffprobe -show_format input.mp4
ffprobe -show_frames input.mp4
ffprobe -show_streams input.mp4
//打印帧数
ffprobe -v error -count_frames -select_streams v:0
-show_entries stream=nb_read_frames
-of default=nokey=1:noprint_wrappers=1 input.mp4
-v error这隐藏了“info”输出(版本信息等),使解析更容易。
-count_frames计算每个流的帧数,并在相应的流部分中报告。
-select_streams v:0仅选择视频流中第一条流。
-show_entries stream = nb_read_frames只显示读取的帧数。
-of default = nokey = 1:noprint_wrappers = 1将输出格式设置为默认值,不打印每个字段的键(nokey = 1),不打印节头和页脚(noprint_wrappers = 1)。
ffprobe -print_format json -show_streams input.mp4(1)-print_format json 以json格式打印
(2)-show_streams 打印所有的流信息
剪裁视频
-vf crop的参数格式为w:h:x:y,
w、h为输出视频的宽和高,
x、y标记输入视频中的某点,将该点作为基准点,向右下进行裁剪得到输出视频。如果x y不写的话,默认居中剪切
例子:
ffmpeg -i 3.mp4 -vf crop=400:400 33.mp4 -y
ffmpeg -i 3.mp4 -vf crop=400:400:0:0 333.mp4 -y剪切视频
ffmpeg -ss 00:00:00 -t 00:00:30 -i test.mp4 -vcodec copy -acodec copy output.mp4- -ss 指定从什么时间开始
- -t 指定需要截取多长时间
- -i 指定输入文件
用以上命令剪的视频可能会发现多出几秒?
原因是剪切点不是关键帧,命令会在关键帧处进行剪切
将所有的帧的编码方式转为帧内编码,这个问题就有解了。
ffmpeg -i INPUT -sameq -intra OUTPUT-i 输入,后面是空格,紧跟着就是输入视频文件;
INPUT 输入文件;
-sameq 表示保持同样的视频质量;
-intra, 帧内编码;
OUTPUT 输出文件名。
如:
ffmpeg -i ./MyVideo.mpg -sameq -intra ./temp.mpg
## 注意:上面的命令在新版本中已经废弃,可以参考下面的命令
ffmpeg -i output.mp4 -strict -2 -qscale 0 -intra keyoutput.mp4以下两个参数还不明白有什么用,有大佬提到过这两个参数,有兴趣可以研究下:
-accurate_seek 使时间更精准
-avoid_negative_ts 1 寻找结尾时关键帧进行补全
剪辑合并例子
#截取从头开始的30s
ffmpeg -ss 00:00:00 -t 00:00:30 -i keyoutput.mp4 -vcodec copy -acodec copy split.mp4
#截取从30s开始的30s
ffmpeg -ss 00:00:30 -t 00:00:30 -i keyoutput.mp4 -vcodec copy -acodec copy split1.mp4
#进行视频的合并
ffmpeg -f concat -i list.txt -c copy concat.mp4
#如果报错:Operation not permitted,加上-safe 0参数
ffmpeg -f concat -i list.txt -safe 0 -c copy concat.mp4
#合并视频,并去掉音频(-an),如果存在文件则自动覆盖
ffmpeg -f concat -i list.txt -c copy -an concat.mp4 -y
#合并后的视频在浏览器查看时,总时长和视频时长不对,播放到中间时直接跳到结束,合并时用-to参数,而不要用-t参数
ffmpeg -f concat -i list.txt -c copy -an -to 10 concat.mp4 -y
在list.txt文件中,对要合并的视频片段进行了描述。
内容如下
file ./split.mp4
file ./split1.mp4视频旋转和翻转
参考文章:https://cloud.tencent.com/developer/article/1638406
ffmpeg -i input.mp4 -vf "transpose=1" output.mp4
#或者使用语义化的参数名称。
ffmpeg -i input.mp4 -vf "transpose=clock" output.mp4这里,transspose=1 表示顺时针90度转置给定的视频。
下面是转置功能可用的参数列表:
0-逆时针旋转90度,垂直翻转。这也是默认设置。
1-顺时针旋转90度。
2-逆时针旋转90度。
3-顺时针旋转90度,垂直翻转。
要将视频顺时针旋转180度,需要像下面这样转置两次。
ffmpeg -i input.mp4 -vf "transpose=2,transpose=2" output.mp4
##要把视频水平翻转的话,可以先0,再1转回去
ffmpeg -i input.mp4 -vf "transpose=0,transpose=1" output.mp4hue:调整视频色调、饱和度、亮度
h:色调角度度数(0到360),默认值为0,对应CSS3的 filter: hue-rotate(0deg);
s:饱和度(-10到10),默认值为1, 请注意 0 值表示黑白图片,对应CSS3的 filter: saturate(100%);
b:亮度(-10到10),默认值为0,对应CSS3的 filter: brightness(100%);
命令格式:ffmpeg -i 源视频地址 -vf hue=s=1:b=1:h=90 -b 输出比特率 输出视频地址
使用例子:(调整饱和度)
ffmpeg -i d:\2.flv -vf hue=b=1 -b 600k d:\outTemp.flvcolorbalance:颜色平衡,调整RGB得值的权重,分为三个阶层,用于调整饱和度和调整颜色偏移值
rs、gs、bs:调整红色,绿色和蓝色阴影(最暗的像素)(范围:-1到1)
rm、gm、bm:调整红色,绿色和蓝色中间色(中等像素)(范围:-1到1)
rh、gh、bh:调整红色,绿色和蓝色的亮点(最亮的像素)(范围:-1到1)
命令格式:ffmpeg -i 源视频地址 -vf colorbalance=rh=.3:gh=.3:bh=.3 -b 输出比特率 输出视频地址
使用例子:(增加红色权重)
ffmpeg -i d:\2.flv -vf colorbalance=rh=.3 -b 600k d:\outTemp.flv给视频增加背景音乐
ffmpeg -y -i input.mp4 -i back.wav -filter_complex "[0:a] pan=stereo|c0=1*c0|c1=1*c1 [a1], [1:a] pan=stereo|c0=1*c0|c1=1*c1 [a2],[a1][a2]amix=duration=first,adelay=3000|3000,pan=stereo|c0<c0+c1|c1<c2+c3,pan=mono|c0=c0+c1[a]" -map "[a]" -map 0:v -c:v libx264 -c:a aac -strict -2 -ac 2 output.mp4添加文字 drawtext
ffmpeg -i original.mp4 -vf drawtext=fontcolor=black:fontsize=50:text='Hello World':x=0:y=100 -y out.mp4.
#前5秒加文字
ffmpeg -i bunny.mp4 -vf drawtext=fontcolor=white:fontsize=40:fontfile=msyh.ttf:line_spacing=7:text='test':x=50:y=50:enable='lte(t\,5)' -y out.mp4.
#后五秒加文字
ffmpeg -i original.mp4 -vf drawtext=fontcolor=white:fontsize=40:fontfile=msyh.ttf:line_spacing=7:text='test':x=50:y=50:enable='gte(t\,5)' -y out.mp4.
#第十秒到第二十秒加文字
ffmpeg -i original.mp4 -vf drawtext=fontcolor=white:fontsize=40:fontfile=msyh.ttf:line_spacing=7:text='test':x=50:y=50:enable='between(t\,10\,20)' -y out.mp4.
#切片的时候使用 比如每个切片10秒 对第二个切片的前5秒 加文字 也就是总文件的10~15秒 当前切片的前5秒
ffmpeg -i original.mp4 -vf drawtext=fontcolor=white:fontsize=40:fontfile=msyh.ttf:line_spacing=7:text='test':x=50:y=50:enable='between(t+10\,0\,15)' -y out.mp4
#显示5秒 然后5秒不显示 然后再显示5秒 然后5秒不显示; 依次。。
ffmpeg -i original.mp4 -vf drawtext=fontcolor=white:fontsize=40:fontfile=msyh.ttf:line_spacing=7:text='test':x=50:y=50:enable='lte(mod(t\,10)\,5)' -y out.mp4
#5秒显示hello 接着5秒显示world 依次。
ffmpeg -i original.mp4 -vf drawtext=fontcolor=red:fontsize=40:fontfile=msyh.ttf:line_spacing=7:text='hello':x=50:y=50:enable='lte(mod(t\,2)\,1)',drawtext=fontcolor=red:fontsize=40:fontfile=msyh.ttf:line_spacing=7:text='world':x=50:y=50:enable='gte(mod(t\,2)\,1)' -y out.mp4参数:
between(x, min, max)
Return 1 if x is greater than or equal to min and lesser than or equal to max, 0 otherwise.
...
gt(x, y)
Return 1 if x is greater than y, 0 otherwise.
gte(x, y)
Return 1 if x is greater than or equal to y, 0 otherwise.
...
if(x, y)
Evaluate x, and if the result is non-zero return the result of the evaluation of y, return 0 otherwise.
if(x, y, z)
Evaluate x, and if the result is non-zero return the evaluation result of y, otherwise the evaluation result of z.
...
lt(x, y)
Return 1 if x is lesser than y, 0 otherwise.
lte(x, y)
Return 1 if x is lesser than or equal to y, 0 otherwise.
...
mod(x, y)
Compute the remainder of division of x by y.
如何通过FFmpeg删除某个特定音轨,如果有多个音轨的时候会有用的?
使用FFmpeg删除特定音频,map命令来删除特定音轨。
map命令的通用语法是:
-map input_file_index:stream_type_specifier:stream_index然后,你可以通过-map 0:a:1(从0开始计数)从视频中选择第二个音轨。在上文的例子中,如果你的文件中有一个视频和两个音轨,那么你就可以使用-map 0:a:1只选择第二个音轨,并将它复制到你的最终输出文件中。
同样,-map 0是指选择第一个输入文件中的所有数据(包括音频和视频),所以你需要先选择所有数据,然后取消选择音频。
ffmpeg.exe -i videoWithAudio.mp4 -map 0 -map 0:a:1 -copy videoOutput.mp4如果电影中有5个音轨,除了第一个,其他你都想选择。这个时候你可以使用反向的map命令(在map命令的参数前加负号)。使用-map -0:a:0 这一命令,FFmpeg在选择时就会忽略第一个音轨。反向的map非常强大!
实际上,我们已在前文学习了使用 -an命令从视频中删除音频。你可以通过如下方式,使用反向的map来达到相同的效果。
ffmpeg -i videoWithAudio.mp4 -map 0 -map -0:a videoWithoutAudio.mp4添加音频
#如果音频时长>视频时长,则后面没有画面更新,相反则没有音频内容
ffmpeg -i video.mp4 -i audio.mp3 -c copy -map 0:v:0 -map 1:a:0 videoWithAudio.mp4
#加上 -shortest 参数时,确保当达到较短的输入文件(两个输入文件之一)长度时停止转换(但是播放时视频时长仍然显示最长的资源时长,使用-to参数可解决这个问题)
ffmpeg -i video.mp4 -i audio.mp3 -map 0:0 -map 1:0 -c:v copy -c:a libmp3lame -q:a 1 -shortest videoWithAudio.mp4
#使用 -to position (output)参数,在position位置停止输出,-to和-t是相互排斥的,-t具有优先权。
#position可能是一个表示秒数的数,或hh:mm:ss[.xxx]形式。
#使用 -fs limit_size (output) 设置文件大小限制,以字节表示。
##视频mp4重新编码,音频也重新编码(也可以用“-c:v h264”、“-c:a mp3”来进行上述操作,这样的话不用知道编码器名)
ffmpeg -i video.mp4 -i audio.mp3 -map 0:0 -map 1:0 -c:v libx264 -c:a libmp3lame -q:a 1 -shortest videoWithAudio.mp4使用map命令将视频和音频分别从不同的文件中复制到同一个输出文件。
-map 0:v:0 选择了第0个输入文件(视频输入)的第0个轨道。
–map 1:a:0 选择了第一个输入文件(音频输入)的第0个轨道。
不用重新编码,-c copy同时复制音轨和视轨到输出文件。如果你想要重新编码,可以选择合适的音视频编解码器,配置相应的编码质量。
提取视频中的音频, -vn 不要视频画面
#提取音频,使用-acodec copy 复制而不是重新编码
ffmpeg -i videoWithAudio.mp4 -vn -acodec copy onlyAudio.aac
#提取时重新编码 libmp3lame 格式, -q:a 1 音频质量(质量分布范围为0~6,其中0表示高质量音频,6表示低质量音频)
ffmpeg.exe -i videoWithAudio.mp4 -vn -c:a libmp3lame -q:a 1 onlyAudio.mp3替换音频内容 -map 选择通道,-c:v 视频编码 -c:a 音频编码
语法 : -map input_file_index:stream_type_specifier:stream_index.
ffmpeg -i video_with_audio.mp4 -i newAudio.wav \
-map 0:0 \
-map 1:0 \
-c:v copy \
-c:a libmp3lame -q:a 1 \
-shortest \ video_with_newAudio.mp4在上文的例子中,我们需要从一个文件中获取视频以及另一个文件中获取音频。而map命令非常便捷地完成了上述操作。我们从第一个输入文件(视频)中选择第0个轨道,并从第2个输入文件(音频)中选择第0个轨道。
然后我们原样复制视频并重新编码音频,再将它们一起放入新的文件中。如果你不想重新编码音频,你只需使用-a:c copy命令,那么音频就只被复制而不会重新编码。
加上 -shortest 参数时,确保当达到较短的输入文件(两个输入文件之一)长度时停止转换
画面淡入淡出,用到了 -vf fade滤镜功能
#0秒处淡入,时长1秒,并在9秒处淡出,时长1秒
ffmpeg -i video.mp4 -vf fade=t=in:st=0:d=1,fade=t=out:st=9:d=1 video1.mp4
#长视频在剪切的时候,加入淡入淡出的效果
ffmpeg -ss 00:00:00 -t 00:00:10 -i video.mp4 -vf fade=t=in:st=0:d=0.5,fade=t=out:st=9.5:d=0.5 video1.mp4制作视频水印需求
给一段视频加上一张静态图片制作的logo,在网上已经有很多例子了,只要把它放置在视频的固定位置即可,这个功能非常容易实现:
ffmpeg -i video.mp4 -i logo.jpg -filter_complex "[1:v]scale=w=120:h=120:\
force_original_aspect_ratio=decrease:force_divisible_by=2[logo];\
[0:v][logo]overlay=x=32:y=64" \
new_video.mp4详细的操作步骤是:
将输入的任意尺寸图片都等比例缩放至不大于120x120大小的小图,并且缩放时计算的尺寸保持宽高均为偶数;
将上一步缩放好的图片放置在主视频的(32,64)位置上。
输入的logo是一张静态图片,从视频的角度上说,它只有1帧,因此它会一直“卡”在这一帧上,然后经过缩放后交给后续滤镜处理
淡入淡出水印的实现思路
但正是在制作带淡入淡出的水印时,遇到了标题中所述的问题。
淡入淡出功能,在FFmpeg中有现成的fade滤镜。但是如果直接加入此滤镜,输出结果与想象的结果完全不同——画面没有logo出现。
下面的命令是有问题的:
ffmpeg -i video.mp4 -i logo.jpg -filter_complex "[1:v]scale=w=120:h=120:\
force_original_aspect_ratio=decrease:force_divisible_by=2,\
fade=t=in:s=160:n=15:alpha=1,\
fade=t=out:s=230:n=20:alpha=1[logo];\
[0:v][logo]overlay=x=32:y=64" \
new_video.mp4但是总体思路是没有问题的:

那么问题出在哪里了?其实问题是因为上面提到的logo图片一直“卡”在一帧上,导致fade滤镜无法触发后续的计算,而fade滤镜启用了alpha通道方式淡入,在淡入之前,alpha会被设置为0,因此后续logo一直是透明输入,看不到叠加效果。
改进实现
知道了问题所在,那是不是让FFmpeg把logo图片当做视频流输入,就可以触发淡入淡出滤镜的计算了呢?答案是:正确。
ffmpeg -i video.mp4 -loop 1 -i logo.jpg ... -shortest new_video.mp4在输入logo图片前增加-loop 1参数,开启此输入的循环选项;
这样图片就会变成一个永不停止的静态视频源
在输出文件前增加-shortest参数,让生成的视频最短化。
由于logo图片已经变成了永不停止的视频源,如果不加此参数,会一直输出,因此千万不要忘了。
问题又来了:原视频流时长:10.04秒,加入logo后视频流时长:12.36秒,夸张地增加了2秒多
ffprobe -show_streams -of json new_video.mp4
# 加logo后视频长度
"time_base": "1/12800",
"start_pts": 0,
"start_time": "0.000000",
"duration_ts": 158208,
"duration": "12.360000",
# 加logo后音频长度
"time_base": "1/44100",
"start_pts": 0,
"start_time": "0.000000",
"duration_ts": 443381,
"duration": "10.053991",通过查阅文档,发现overlay滤镜中提供了一个类似的shortest选项,专门用来处理这种情况。
在overlay滤镜后启用该选项即可
overlay=x=32:y=64:shortest=1既然在overlay滤镜中已经将logo视频流截断了,那么就可以去掉-shortest输出参数了。
ffmpeg -i video.mp4 -loop 1 -i logo.jpg ...overlay=x=32:y=64:shortest=1... new_video.mp4此时再查看输出视频信息:
# 加logo后视频长度
"time_base": "1/12800",
"start_pts": 0,
"start_time": "0.000000",
"duration_ts": 128512,
"duration": "10.040000",
# 加logo后音频长度
"time_base": "1/44100",
"start_pts": 0,
"start_time": "0.000000",
"duration_ts": 443381,
"duration": "10.053991",可以看到,输出文件视频流时间长度与原视频一致。音频流时长稍微长一点点,可以在拼接时修正掉,如果是单个文件播放,可忽略不计。
常用命令如下
# 去掉视频中的音频
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
# -an: 去掉音频;-vcodec:视频选项,一般后面加copy表示拷贝
# 提取视频中的音频
ffmpeg -i input.mp4 -acodec copy -vn output.mp3
# -vn: 去掉视频;-acodec: 音频选项, 一般后面加copy表示拷贝
# 音视频合成
ffmpeg -y –i input.mp4 –i input.mp3 –vcodec copy –acodec copy output.mp4
# -y 覆盖输出文件
#剪切视频
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.mp4 -vcodec copy -acodec copy output.mp4
# -ss 开始时间; -t 持续时间
# 视频截图
ffmpeg –i test.mp4 –f image2 -t 0.001 -s 320x240 image-%3d.jpg
# -s 设置分辨率; -f 强迫采用格式fmt;
# 视频分解为图片
ffmpeg –i test.mp4 –r 1 –f image2 image-%3d.jpg
# -r 指定截屏频率
# 将图片合成视频
ffmpeg -f image2 -i image%d.jpg output.mp4
#视频拼接
ffmpeg -f concat -i filelist.txt -c copy output.mp4
# 将视频转为gif
ffmpeg -i input.mp4 -ss 0:0:30 -t 10 -s 320x240 -pix_fmt rgb24 output.gif
# -pix_fmt 指定编码
# 将视频前30帧转为gif
ffmpeg -i input.mp4 -vframes 30 -f gif output.gif
# 旋转视频
ffmpeg -i input.mp4 -vf rotate=PI/2 output.mp4
# 缩放视频
ffmpeg -i input.mp4 -vf scale=iw/2:-1 output.mp4
# iw 是输入的宽度, iw/2就是一半;-1 为保持宽高比
#视频变速
ffmpeg -i input.mp4 -filter:v setpts=0.5*PTS output.mp4
#如果担心会出现丢帧的情况,可以使用 -r 指定输入帧数,我们想4倍播放:
ffmpeg -i input.mkv -r 60 -filter:v "setpts=0.25*PTS" output.mkv
#音频变速(2表示2倍速)
ffmpeg -i input.mp3 -filter:a atempo=2.0 output.mp3
#音视频同时变速,但是音视频为互倒关系
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4
#音视频同时变速(setpts=0.5相当于2倍速,atempo就=2,换算:1/0.5,setpts=2,atempo=0.5 (换算1/2))
ffmpeg -i input.mkv -r 60 -filter:v "setpts=0.5*PTS" -filter:a atempo=2 output.mkv
# 视频添加水印
ffmpeg -i input.mp4 -i logo.jpg -filter_complex [0:v][1:v]overlay=main_w-overlay_w-10:main_h-overlay_h-10[out] -map [out] -map 0:a -codec:a copy output.mp4
# main_w-overlay_w-10 视频的宽度-水印的宽度-水印边距;
# 截取视频局部
ffmpeg -i in.mp4 -filter:v "crop=out_w:out_h:x:y" out.mp4
# 截取部分视频,从[80,60]的位置开始,截取宽200,高100的视频
ffmpeg -i in.mp4 -filter:v "crop=80:60:200:100" -c:a copy out.mp4
# 截取右下角的四分之一
ffmpeg -i in.mp4 -filter:v "crop=in_w/2:in_h/2:in_w/2:in_h/2" -c:a copy out.mp4
# 截去底部40像素高度
ffmpeg -i in.mp4 -filter:v "crop=in_w:in_h-40" -c:a copy out.mp4参数说明
参数说明:
-vcodec xvid 使用xvid压缩
-s 320x240 指定分辨率
-r fps 设置帧频 缺省25
-b <比特率> 指定压缩比特
-acodec aac 设定声音编码
-ac <数值> 设定声道数,1就是单声道,2就是立体声
-ar <采样率> 设定声音采样率,PSP只认24000
-ab <比特率> 设定声音比特率
-vol <百分比> 设定音量
-y(覆盖输出文件
-t duration 设置纪录时间 hh:mm:ss[.xxx]格式的记录时间也支持
-ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持
-title string 设置标题
-author string 设置作者
-copyright string 设置版权
-hq 激活高质量设置
-aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777
-croptop size 设置顶部切除带大小 像素单位
-cropbottom size -cropleft size -cropright size
-padtop size 设置顶部补齐的大小 像素单位
-padbottom size -padleft size -padright size -padcolor color 设置补齐条颜色(hex,6个16进制的数,红:绿:兰排列,比如 000000代表黑色)
-bt tolerance 设置视频码率容忍度kbit/s
-maxrate bitrate设置最大视频码率容忍度
-minrate bitreate 设置最小视频码率容忍度
-bufsize size 设置码率控制缓冲区大小
-vcodec codec 强制使用codec编解码方式。 如果用copy表示原始编解码数据必须被拷贝。
-sameq 使用同样视频质量作为源(VBR)
-pass n 选择处理遍数(1或者2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精确的请求的码率
-passlogfile file 选择两遍的纪录文件名为file
-map file:stream 设置输入流映射
-debug 打印特定调试信息
0.常用参数快捷:
主要参数:
-i——设置输入文件名。
-f——设置输出格式。
-y——若输出文件已存在时则覆盖文件。
-fs——超过指定的文件大小时则结束转换。
-t——指定输出文件的持续时间,以秒为单位。
-ss——从指定时间开始转换,以秒为单位。
-t从-ss时间开始转换(如-ss 00:00:01.00 -t 00:00:10.00即从00:00:01.00开始到00:00:11.00)。
-title——设置标题。
-timestamp——设置时间戳。
-vsync——增减Frame使影音同步。
-c——指定输出文件的编码。
-metadata——更改输出文件的元数据。
-help——查看帮助信息
影像参数:
-b:v——设置影像流量,默认为200Kbit/秒。(单位请引用下方注意事项)
-r——设置帧率值,默认为25。
-s——设置画面的宽与高。
-aspect——设置画面的比例。
-vn——不处理影像,于仅针对声音做处理时使用。
-vcodec( -c:v )——设置影像影像编解码器,未设置时则使用与输入文件相同之编解码器。
声音参数:
-b:a——设置每Channel(最近的SVN版为所有Channel的总合)的流量。(单位请引用下方注意事项)
-ar——设置采样率。
-ac——设置声音的Channel数。
-acodec ( -c:a ) ——设置声音编解码器,未设置时与影像相同,使用与输入文件相同之编解码器。
-an——不处理声音,于仅针对影像做处理时使用。
-vol——设置音量大小,256为标准音量。(要设置成两倍音量时则输入512,依此类推。)版权属于:Joyber
本文链接:https://blog.qqvbc.com/default/641.html
转载时须注明出处及本声明