FFMPEG add text frames to the start of video

2019-07-13 20:12发布

问题:

I have some videos either in mp4 or webm format, and I'd like to use ffmpeg to add 4 seconds to the start of each video to display some text in the center with no sound.

Some other requirements:

  • try to avoid re-encoding the video
  • need to maintain the quality (resolution, bitrate, etc)
  • (optional) to make the text fade in/out

I am new to ffmpeg and any help will be appreciated.

thanks in advance

Example ffprobe information for mp4 below:

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

Example 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)

Screenshot from joined.mp4

Screenshot for step 3 console

回答1:

You'll have to generate a 4 second video with dummy audio matching the parameters of the existing video, including timebase, and then use the concat demuxer with streamcopy.

For the sample files shown in Q:

Step 1 Generate text video

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

For WebM, replace -c:v libx264 with -c:v libvpx, -c:a aac with -c:a libvorbis and intro.mp4 with intro.webm. You may remove the -video_track_timescale 15360 since WebMs tend to use a single timescale, that I've seen.

Step 2 Prepare concat file, say, list.txt

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

Step 3 Concat

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

The variables important here are video size 1280x720, frame rate -r 30, -pix_fmt yuv420p, sample rate -ar 48000, format -sample_fmt fltp, channel layout -ac 2 and of course, codecs.



回答2:

Short answer is that you cannot encode new data as mp4 or webm and insert it at the front of the video stream. Those formats simply do not work like that. Both of these encoding formats are lossy, so if you decode and encode them again then additional information will be lost/changed by the second encoding. You could do something else, but what you are trying to do will not work.