当前位置: 首页 > 后端技术 > Python

ffmpeg命令实战使用详解(从一线经验,视频合并&avi到MP4&空白音频填充【收藏必用】)

时间:2023-03-26 11:25:29 Python

大家好,我是码农飞哥,谢谢阅读本文,欢迎您!三键。本文从实战的角度详细讲解了ffmpeg命令的使用。干货满满,建议收藏,需要时不时看看。如果您有任何疑问或需求,欢迎随时留言~~~。前言ffmpeg介绍和安装ffmpeg是一个非常快速的视频和音频转换器,也可以从实时音频/视频源中抓取。它还可以在任意采样率之间进行转换,并使用高质量多相滤波器动态调整视频大小。他兼容Windows、Linux和mac操作系统(说白了三个操作系统都可以用)。ffmpeg的下载地址为:ffmpeg的下载地址安装过程没什么好说的,按照提示点击下一步即可。这里需要说明一点,ffmpeg安装好后,最好在PATH中配置ffmpeg的环境变量。配置完成后,在命令行输入ffmpeg,会出现如下结果:基本概念说明比特率:指每秒传输的比特数(bits),单位为bps。帧率:指每秒刷新图片的帧数,也可以理解为图形处理器每秒可以刷新多少次。单位是fps(每秒帧数)或“赫兹(Hz)”。ffmpeg命令使用的一般格式ffmpeg命令使用的一般格式如下:ffmpeg[global_options]{[input_file_options]-i输入文件地址}...{[output_file_options]输出文件地址}...ffmpeg:表示调用ffmpeg程序如果没有配置环境变量,需要指定ffmpeg.exe的绝对路径,如下:D:\\develop\\ffmpeg-4.3.2-2021-02-20-full_build\\bin\\ffmpeg。exeglobal_options:用于指定全局操作参数,如-y参数,可选参数。input_file_options:用于指定输入文件的操作参数,如:-fconcat参数等。-i:指定输入文件的地址,必要的参数。output_file_options:用于指定输出文件的操作参数,可选参数。ffmpeg的一些常用命令参数要想熟练使用ffmpeg命令,就需要掌握ffmpeg的一些常用命令参数。常用选项常用选项是指用于音频和视频的命令参数。参数scope-f示例强制输入或输出文件格式,通常输入文件的格式是自动检测的,根据输出文件的文件扩展名猜测格式,所以大多数情况下不需要这个选项Global-iaddressinputfile输入-y的地址覆盖输出文件,即当output.mp4存在时,不提示直接覆盖文件。全局-i指定输入文件的地址。如果按照ffmpeg,可以写xxx.mp4,否则需要写全路径。输入-n不覆盖输出文件,即如果指定的输出文件已经存在则立即退出global-stream_loopnumber设置输入流应该循环的次数。Loop0表示不循环,loop-1表示无限循环。input-c[:stream_specifier]codecinput/output,每一个stream-c拷贝(即根据输入流的编码调用输出流)-codec[:stream_specifier]codec,为一个或多个选择编码器流(在输出文件之前使用时)或解码器(在输入文件之前使用时)输入/输出,每个流ffmpeg-iinput-map0-c:vlibx264-c:acopyoutput(使用libx264编码所有视频流和复制所有音频流。)-tdurationin/out,当用作输入选项时,限制从输入文件读取数据的持续时间。当用作输出选项时(在输出url之前),在其持续时间达到持续时间后停止写入输出。duration必须是duration-t20(20秒)-fslimit_size是指以字节为单位的文件大小限制。超过限制后不再写入字节块。输出文件的大小略大于请求的文件大小。output-ss用作输入选项时的位置,在输入文件中寻找位置,主要用于视频剪辑输入/输出-ss15(从第15秒开始)-ss用作输入选项时,在输入文件中寻找位置,主要用于视频切入/切出-ss15(从第15秒开始)-dn作为输入选项,防止文件的所有流被过滤或自动选择或映射到任何输出输入/输出-ss15(从第15秒开始)-frames[:stream_specifier]帧数是生成指定帧数的视频输出-filter[:stream_specifier]filtergraph(output,per-stream)创建filtergraph指定的filtergraph并用它来过滤流,filtergraph是应用于流的过滤器图的描述,并且必须具有同一类型流的单个输入和单个输出。输出视频选项视频选项是指仅对视频有效的命令参数。参数范围示例-vframesnumber设置要输出的视频帧数-rfps设置帧率(HZ值,分数或缩写),作为输入选项,忽略视频文件的视频时长,一个常量帧假定速率fps生成时间戳。作为输出选项,复制或丢弃输入帧以实现恒定的输出帧速率fps。input/output-r30(30framespersecond)-ssize以'width-height'输入/输出格式设置帧大小,每个流-vn作为输入选项,阻止要过滤的文件的所有视频流或自动-selectedorMappedtoanyoutput,作为输出选项,即自动选择或映射任意视频流,可用于从videoin/out中提取音频audiooptionsaudiooptions,指只作用于音频的命令参数。参数范围示例-aframesnumber设置要输出的音频帧数output-arfrequency设置音频采样频率,对于输出流,默认为对应输入流的频率。对于输入流,此选项仅对输入/输出的音频采集器和原始解复用器有意义-ar24000(以24000Hz捕获音频)-aqq设置音频质量(仅作用于编解码器、VBR)输出-ac通道设置音频数量渠道。对于输出流,它默认为每个流输入/输出的输入音频通道数-ac2(通道数设置为2)-an作为输入选项,防止文件的所有音频流被过滤或自动选择或映射到任何输出,作为输出选项,禁用音频录制,即自动选择或映射任何音频流输入/输出-acodeccodecsetaudiocodecin/out-acodecaac(aacforaudioencoding)-volpercent设置输入/输出的音量百分比-vol150(150%volume)-mapfile:stream设置输入/输出流映射输入/输出ffmpeg实战说完ffmpeg的命令参数,我们来看看实战。示例中的所有视频和音频都放在D:\\ffmpeg_test目录下。1、webm转mp4命令webm格式的视频是所有浏览器都支持的视频格式。录制完视频后,前端向后端发送一个webm格式的视频。通常我们需要将webm格式的视频转换成mp4格式。视频。ffmpeg-y-iD:\\ffmpeg_test\\1.webm-r30D:\\ffmpeg_test\\1.mp4这里是把1.webm的视频转成每秒30帧的视频1.mp4。这里指定了1.mp4的绝对路径,如果不指定,生成的视频文件会落到当前ffmpeg命令的执行目录下。运行结果为:2.视频合并命令当上传的视频比较大或者用户分段录制视频时,前端会向后端发送多个视频。这时候就需要进行视频合并操作。使用ffmpeg命令的视频合并操作分为两步。首先新建一个文件filelist.txt,将要合并的视频地址写到这个文件中。比如D:\ffmpeg_test目录下有1.mp4和2.mp4需要合并。写入格式如下:视频合并的ffmpeg命令:ffmpeg-fconcat-safe0-y-iD:\\ffmpeg_test\\filelist.txt-ccopy-strict-2D:\\ffmpeg_test\\说明concated.mp4命令:这里是将前面filelist.txt中录制的1.mp4和2.mp4这两个视频合并成一个名为concated.mp4的视频。-fconcat:指定操作为合并操作-safe0:用于避免操作输入流的权限问题-ccopy:用于指定输出视频流和输入视频流的编码格式一致-strict-2:用于避免opusinMP4支持是实验性的这个问题。具体可以参考使用ffmpeg进行视频合并时的几个问题记录Operationnotpermitted运行结果为:3.视频裁剪原视频制作完成后,用户可能对视频不满意,需要裁剪糟糕的视频剪辑。它的操作命令也非常简单。这是将原来的视频concated.mp4从第15秒剪切成新的25秒视频clip.mp4。ffmpeg-ss15-t25-iD:\\ffmpeg_test\\concated.mp4-c:vlibx264-c:aaac-strictexperimentalD:\\ffmpeg_test\\clip.mp4参数介绍:-ss15:from第15秒,视频被剪断。-t25:指定剪切视频的长度为25秒。-c:vlibx264:指定视频的编码格式为libx264格式。-c:aaac:指定音频编码格式为aac格式。-严格的实验:安全处理。运行结果为:4.提取音频现在用户满意的视频已经被剪切,用户可以进入配音环节。在配音之前,我们首先需要将原视频的音频与原视频进行分离。提取音频的操作比较简单。命令为:ffmpeg-y-iD:\\ffmpeg_test\\concated.mp4-vnD:\\ffmpeg_test\\output.wav这里是从concated.mp4视频中测试原音频,原名称音频是输出.wav。这里-vn指定输出音频的编码格式与视频的音频格式一致。运行结果为:5.音量调节将原视频的音频分离出来后,用户可以在播放原音频的同时录制配音。这时,用户可能想要调节音频的音量。调节音量的操作也非常简单。以下是将音频的音量调整到其原始音量的80%。ffmpeg-y-iD:\\ffmpeg_test\\output.wav-af"volume=0.8"D:\\ffmpeg_test\\output_80.wav或ffmpeg-y-iD:\\ffmpeg_test\\output.wav-vol80D:\\ffmpeg_test\\output_80.wav这里要注意,如果是第一种方法-af"volume=value"音量的值必须是除以100后的值。而-volvalue的值直接传递给百分比。运行结果为:6、同轨配音后,我们想将原音频和配音后的音频合并为一个音频,需要对同轨音频进行表演。命令为:ffmpeg-y-iD:\\ffmpeg_test\\org_video_sound_input.wav-iD:\\ffmpeg_test\\org_voice_input.wav-filter_complexamix=inputs=2:duration=longestD:\\ffmpeg_test\\org_voice_output这里的.wav是将audioorg_video_sound_input.wav和org_voice_input.wav音频合并为一个audioorg_voice_output.wav。其核心命令参数为:-filter_complexamix=inputs=2:duration=longest:这里使用-filter_complex指定一个复杂的filtermap,amix=inputs=2:duration=longest使用amixfilter指定输入音频的个数为2最长音频的长度作为持续时间。运行结果为:7.配音填空。音频配音完成后,配音音频的时长一般不等于原音频的时长。这时候就需要在不配音的情况下,将时长的空白音频补上。消隐音频的操作稍微复杂一些。其操作思路分为三个步骤。生成与原音频时长相同的空白音频,命令为:这里假设原音频时长为20秒,则生成时长为20秒的空白音频。ffmpeg-y-flavfi-ianullsrc-t20D:\\ffmpeg_test\\silence.wav填充配音音频开头的空白音频(比如用户是从原音频的第二秒开始配音,然后第一部分配音音频2秒补空音频),命令是:ffmpeg-y-iD:\\ffmpeg_test\\silence.wav-iD:\\ffmpeg_test\\org_voice_input.wav-filter_complex"aevalsrc=0:d=2[s1];[s1][1:a]concat=n=2:v=0:a=1[aout]"-c:vcopy-map[aout]D:\\ffmpeg_test\\org_voice_output_silence.wav其中:D:\ffmpeg_test\silence.wav为第一步生成的空白音频,D:\ffmpeg_test\org_voice_input.wav为用户发声的音频。d=2:用于指定填空点,填空时间为0秒到2秒。-c:vcopy:音频的编码格式不变。将完成空白音频的配音与第一步生成的空白音频放在同一轨道上,即可得到与原音频时长相同的配音。命令与上面第6节相同,这里不再赘述。ffmpeg-y-iD:\\ffmpeg_test\\org_voice_output_silence.wav-iD:\\ffmpeg_test\\silence.wav-filter_complexamix=inputs=2:duration=longestD:\\ffmpeg_test\\org_voice_output_result.wav运行结果是:8.为视频添加声音(视频和音频的组合)。视音频结合就是将之前生成的音频与原视频进行配音结合。命令为:ffmpeg-y-iD:\\ffmpeg_test\\user_video.avi-iD:\\ffmpeg_test\\org_voice_output_result.wav-c:vcopy-c:aaac-strictexperimentalD:\\ffmpeg_test\\user_video_target.avi输入视频为:user_video.mp4,输入音频为:org_voice_output_result.wav。输出视频为:org_voice_output_result.avi-c:vcopy:指定输出视频的格式与输入视频的格式一致。-c:aaac:指定输出视频的音频编码格式为aac格式。运行结果为:9.Avi转mp4可惜生成的avi格式的视频不能在浏览器直接播放。因此,我们需要将avi格式的视频转换为mp4格式的视频。转换命令为:ffmpeg-y-iD:\\ffmpeg_test\\user_video_target.avi-c:vlibx264-crf19-presetslow-c:aaac-b:a192k-ac2D:\\ffmpeg_test\\user_video_target.mp4这里的输入视频是:user_video_target.avi,输出视频是:user_video_target.mp4。-c:vlibx264:指定视频的编码格式为libx264格式。-c:aaac:指定音频的编码格式为aac格式。-b:a192k:指定输出视频的码率为192kbits。运行结果为:总结本文从实战的角度详细介绍了ffmpeg的使用。相信会对读者朋友们有很大的帮助。参考ffmpeg常用命令汇总:(avi转MP4、MP4转ts、视频压缩、去除视频声音、合并音视频)ffmpeg官方文档我是码农飞哥,再次感谢阅读本文。全网同名【马农飞歌】。不积步,方能达千里。享受分享的快乐。我是码农飞哥。再次感谢您阅读本文。