FFMPEG将文本帧添加到视频开头

4
我有一些以mp4或webm格式保存的视频,并想使用ffmpeg在每个视频开始处添加4秒钟的时间来显示居中且没有声音的文本。其他要求如下:
- 尽量避免重新编码视频 - 保持视频质量(分辨率、比特率等) - (可选)使文本淡入/淡出
我对ffmpeg不熟悉,非常感谢您的帮助。
以下是mp4的示例ffprobe信息:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
  Metadata:
    major_brand : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.33.100
  Duration: 00:00:03.84, start: 0.042667, bitrate: 1117 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 1021 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
Metadata:
  handler_name    : VideoHandler
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 140 kb/s (default)
Metadata:
  handler_name    : SoundHandler

示例webm

Input #0, matroska,webm, from 'input.webm':
  Metadata:
  encoder         : Lavf55.33.100
 Duration: 00:00:03.80, start: 0.000000, bitrate: 1060 kb/s
   Stream #0:0(eng): Video: vp8, yuv420p, 1280x720, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 1k tbn, 1k tbc (default)
   Stream #0:1(eng): Audio: vorbis, 48000 Hz, stereo, fltp (default)

joined.mp4截图

第三步控制台截图

2个回答

6
您需要生成一个4秒的视频,其中包含与现有视频相匹配的参数和虚拟音频,并使用concat demuxer进行streamcopy。
对于Q中展示的示例文件: 步骤1 生成文本视频。
ffmpeg -f lavfi -r 30 -i color=black:1280x720 -f lavfi -i anullsrc -vf "drawtext=fontfile='/path/to/font.ttf':fontcolor=FFFFFF:fontsize=50:text='Your text':x='(main_w-text_w)/2':y='(main_h-text_h)/2',fade=t=in:st=0:d=1,fade=t=out:st=3:d=1" -c:v libx264 -b:v 1000k -pix_fmt yuv420p -video_track_timescale 15360 -c:a aac -ar 48000 -ac 2 -sample_fmt fltp -t 4 intro.mp4

对于WebM格式,将-c:v libx264替换为-c:v libvpx-c:a aac替换为-c:a libvorbis,并将intro.mp4替换为intro.webm。由于WebM通常使用单个时间刻度,因此可以删除-video_track_timescale 15360

步骤2 准备串联文件,例如list.txt

file 'intro.mp4'
file 'input.mp4'

步骤三:合并

ffmpeg -f concat -i list.txt -c copy -fflags +genpts joined.mp4

这里重要的变量包括视频大小1280x720,帧速率-r 30-pix_fmt yuv420p,采样率-ar 48000,格式-sample_fmt fltp,声道布局-ac 2,当然还有编解码器。


谢谢Mulvya,每个视频的分辨率、比特率等都可能不同。FFmpeg是否可以自动收集这些信息?例如,像复制编解码器这样的东西。 - Ryan
从 'input.mp4' 输入 #0,mov,mp4,m4a,3gp,3g2,mj2: 元数据: major_brand:isom minor_version:512 compatible_brands:isomiso2avc1mp41 encoder:Lavf55.33.100 持续时间:00:00:03.84,开始:0.042667,比特率:1117 kb/s 流#0:0(eng):视频:h264(高)(avc1 / 0x31637661),yuv420p,1280x720,1021 kb/s,30 fps,30 tbr,15360 tbn,60 tbc(默认) 元数据: handler_name:VideoHandler 流#0:1(eng):音频:aac(LC)(mp4a / 0x6134706D),48000 Hz,立体声,fltp,140 kb/s(默认) 元数据: handler_name:SoundHandler - Ryan
不是自动的,你需要运行 ffprobe input 并从读出的数据中抓取那些数据。 - Gyan
它没有上限。x264优化比特率。如果您想强制使用更高的速率,请使用-minrate 1000k-b:v 1000k。话虽如此,您能否发布一个引导帧的屏幕截图? - Gyan
第一步,是否可以使用单个图像作为背景?提前致谢。 - Ryan
显示剩余22条评论

0
简短的回答是,您无法将新数据编码为mp4或webm,并将其插入到视频流的前面。这些格式根本不是这样工作的。这两种编码格式都是有损的,因此如果您再次解码和编码它们,则第二次编码会丢失/更改其他信息。您可以尝试其他方法,但您正在尝试的方法不起作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接