我需要将文本、音频和视频合并到一个 mp4 文件中。为了做到这一点,我在 .bat 文件中使用了这两个命令
ffmpeg -i %video_file% -i %audio_file% -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 %output_file_name% -shortest
ffmpeg -i %output_file_name% -vf "drawtext=fontfile=font.ttf:text='Powered by SANTA ltd.':fontcolor=white:fontsize=96:box=1:[email protected]:boxborderw=5:x=(w-text_w)/2:y=(h-text_h)/2" -c:a copy output_font.mp4
因此,第一个合并了音频+视频,第二个在屏幕中间绑定了文本。
问题是 - 如何通过这两个命令创建管道?那么,我不使用两个命令,而是只使用一个命令?
更新型多巴胺
我尝试使用此命令
ffmpeg -i %video_file% -i %audio_file% -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 -vf "drawtext=fontfile= /windows/fonts/font.ttf:text='Powered by SANTA ltd.':fontcolor=white:fontsize=96:box=1:[email protected]:boxborderw=5:x=(w-text_w)/2:y=(h-text_h)/2" -shortest %output_file_name%
我收到一个错误:
Filtergraph 'drawtext=fontfile= /windows/fonts/font.ttf:text='由 SANTA ltd. 提供支持':fontcolor=white:fontsize=96:box=1:[电子邮件保护]:boxborderw=5:x=(w-text_w)/2:y=(h-text_h)/2' 已针对视频输出流 0:0 定义,但已选择编解码器复制。过滤和流复制不能同时使用。
答案1
将这 2 个命令合并为一个应该可以正常工作。这就是视频过滤器在 ffmpeg 中的工作方式。请注意,我建议使用您提供的 bat 文件来回答,但我在 shell 中工作,语法略有不同。
ffmpeg -i %video_file% -i %audio_file% -c:v libx264 -c:a aac -map 0:v:0 -map 1:a:0 \
-vf "drawtext=fontfile= /windows/fonts/font.ttf:text='Powered by \
SANTA ltd.':fontcolor=white:fontsize=96:box=1:boxcolor=\
[email protected]:boxborderw=5:x=(w-text_w)/2:y=(h-text_h)/2" -shortest %output_file_name%
请注意,如果您使用 drawtext 之类的视频过滤器,则编码必须发生。换句话说,您不能使用 -c:v copy,这意味着没有编码。如果您没有明确使用/声明编解码器,ffmpeg 将使用默认编解码器。最好使用编解码器并明确设置比特率。见下文。
我在 bash shell 中使用图像进行了测试,并且效果很好:
ffmpeg -y -loop 1 -f image2 -i image.png -i audio.wav -s 1280x720 -strict -2 -acodec \
aac -b:a 128k -vcodec libx264 -pix_fmt yuv420p -vf "drawtext=fontfile= /Windows/fonts/courier.ttf:text=\
'Powered by SANTA ltd.':fontcolor=white:fontsize=96:box=1:[email protected]:boxborderw=\
5:x=(w-text_w)/2:y=(h-text_h)/2" -threads 4 -crf 25 -refs 1 -bf 0 -coder 0 -g 25 -keyint_min 15 \
-shortest -movflags +faststart test.mp4
请注意,在 Windows 中,您需要提供字体的路径,并带有正斜杠。