使用FFMPEG将单个帧添加到MP4的末尾

时间:2017-08-22 07:48:02

标签: video command-line ffmpeg

我已经写了一些图像采集软件,因为我正在获取这些图像,我想将最后一个图像添加到视频文件的末尾(到目前为止所有图像的延时)。这将给出所有图像的视频视图。

然而,我正在努力尝试添加单帧。我已经产生了延时罚款。我这样做的方式是等到我收集了10张图像,然后我产生了延时。我用来生成延时的命令我将添加帧:

  

-framerate 40 -start_number N -i DSC_%05d.JPG -c:V libx264 -r 30 output.mp4

我尝试了一些不同的方法,几乎​​都在工作,但没有一个按需工作。这是我尝试过的,有什么命令和输出是什么:

Concat Demuxer将JPG加入MP4
包含用于连接的文件列表的文本文件如下所示:

  

文件' B00334_1.mp4'
  file' test_image.jpg'
  持续时间10

我用来尝试加入文件的命令是:

  

ffmpeg -f concat -i concat.txt -c copy outputfile.mp4

此尝试的输出是一个非损坏的视频(得分!)但它只显示第一个视频,并且没有显示新帧的任何迹象,特别是在指定的10秒内没有。 (我不想在那里停留10秒,更像是0.1,但是我只使用了10秒,所以我很容易看到成功的时候。)

将JPG转换为MP4然后转换为Concat Demuxer
所以我想;也许它想要第二个视频而不是图像,所以我会创建一个长视频帧,然后将其附加到时间流逝的末尾。

用于从JPG创建MP4的命令:

  

fmpeg -loop 1 -i test_image.jpg -r -t 5 test_video.mp4

这会生成视频,我会看到一段长5秒的视频,显示静止图像。此视频未加载缩略图,我不确定这是否意味着什么。现在concat.txt文件如下所示:

  

文件' B00334_1.mp4'
  文件' text_video.mp4'

运行相同的命令来调用第一个例子中显示的文本文件时,我得到第一个文件的输出(延时)+连接视频的时间(成功!?)。然而,一旦你到达视频中它应该显示图像的点,它就会显示游戏中时光倒流的最后一帧,并且在第二个视频的5秒内向下毛刺。基本上根本没有显示第二个视频,不管第二个视频是多长时间,最后一帧都会出现这么长时间。

将JPG和MP4转换为.ts,然后返回MP4
用于尝试将JPG转换为TS文件的命令:

  

ffmpeg -y -i test_image.jpg -c copy -bsf:v h264_mp4toannexb -f mpegts medium1.ts

此操作失败并返回输出: Codec 'mjpeg' (8) is not supported by the bitstream filter 'h264_mp4toannexb'. Supported codecs are: h264 (28)
将编解码器更改为明显支持的h264也不会影响结果。

将JPG转换为MP4,然后转换为.ts,然后连接
使用与ffmpeg -y -i input.jpg -c copy -bsf:v h264_mp4toannexb -f mpegts output.ts之前相同的命令,从MP4创建两个TS文件很好。新制作的文件也会按原样显示,从图像创建的ts文件只显示图像,视频显示视频。现在有了这两个新的TS文件,我应该能够将它们连接在一起吗?

我尝试使用FFMPEG的concat protocol功能加入这些文件。使用此命令:

  

ffmpeg -y -i' concat:medium1.ts | medium2.ts' -c copy -bsf:aac_adtstoasc output.mp4

现在,这将视频加入到一起!时间会附加到最后,如果您跳到最后几秒,则会看到新添加的图像。但是,如果你让视频播放,一旦它播放第二个视频,媒体播放器就会崩溃。


非常感谢任何帮助和/或想法,我可以根据需要提供更多信息。感谢您的阅读。

修改:输出日志来自Mulvya的答案:

[mov,mp4,m4a,3gp,3g2,mj2 @ 000000000255c0a0] Auto-inserting h264_mp4toannexb bitstream filter
Input #0, concat, from 'concat.txt':
  Duration: N/A, start: 0.000000, bitrate: 44807 kb/s
    Stream #0:0(und): Video: h264 (High 4:2:2) (avc1 / 0x31637661), yuvj422p(pc), 2896x1944, 44807 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc
    Metadata:
      handler_name    : VideoHandler
Output #0, mp4, to 'merged.mp4':
  Metadata:
    encoder         : Lavf57.66.102
    Stream #0:0(und): Video: h264 (High 4:2:2) ([33][0][0][0] / 0x0021), yuvj422p(pc), 2896x1944, q=2-31, 44807 kb/s, 30 fps, 30 tbr, 15360 tbn, 15360 tbc
    Metadata:
      handler_name    : VideoHandler
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
[mov,mp4,m4a,3gp,3g2,mj2 @ 0000000002564840] Auto-inserting h264_mp4toannexb 
bitstream filter
frame=   60 fps=0.0 q=-1.0 Lsize=    5564kB time=00:00:01.90 
bitrate=23990.6kbits/s speed=30.6x
video:5563kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.024155%

1 个答案:

答案 0 :(得分:3)

要在VLC或ffplay中播放,以下内容适用于我:

ffmpeg -framerate 40 -i DSC_%05d.JPG -c:v libx264 -x264opts stitchable -r 30 main.mp4

ffmpeg -framerate 40 -loop 1 -i latest.JPG -c:v libx264 -x264opts stitchable -t 1 -r 30 appendix.mp4

file main.mp4
file appendix.mp4

ffmpeg -f concat -i list.txt -c copy merged.mp4

如果分辨率不同,VLC将中断播放以切换上下文。