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

Video 使用FFMPEG将单个帧添加到MP4的末尾,video,command-line,ffmpeg,Video,Command Line,Ffmpeg,我已经编写了一些图像采集软件,在采集这些图像时,我想将最后一幅图像添加到视频文件的末尾(到目前为止采集的所有图像的延时)。这将提供所有图像的视频视图 然而,我正在努力添加单帧。我已经生成了延时罚款。我这样做的方式是等到我收集了10张图像,然后生成延时。我用来生成我将要添加帧的延时的命令是: -帧速率40-开始\u编号N-i DSC \u%05d.JPG-c:V libx264-r 30 output.mp4 我尝试过几种不同的方法,几乎都能奏效,但没有一种能完全按照需要发挥作用。以下是我尝试过的

我已经编写了一些图像采集软件,在采集这些图像时,我想将最后一幅图像添加到视频文件的末尾(到目前为止采集的所有图像的延时)。这将提供所有图像的视频视图

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

-帧速率40-开始\u编号N-i DSC \u%05d.JPG-c:V libx264-r 30 output.mp4

我尝试过几种不同的方法,几乎都能奏效,但没有一种能完全按照需要发挥作用。以下是我尝试过的,使用的命令和输出是什么:

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

文件“B00334_1.mp4”
文件“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-t5 test_video.mp4

这就产生了视频,我得到了一个5秒长的视频,显示了静止图像。这段视频没有加载缩略图,我不确定这是否意味着什么。现在concat.txt文件如下所示:

文件“B00334_1.mp4”
文件“text\u video.mp4”

运行相同的命令调用第一个示例中显示的文本文件后,我得到第一个文件的输出(延时)+连接视频的时间(成功!?)。但是,当您到达视频中应该显示图像的点时,它只显示timelapse的最后一帧,并且在第二个视频的5秒钟内向下出现故障。基本上根本不显示第二个视频,无论第二个视频是多长时间,最后一帧都会出现故障

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

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

此操作失败并返回输出: 比特流筛选器“h264_mp4toannexb”不支持编解码器“mjpeg”(8)。支持的编解码器为:h264(28)
将编解码器更改为显然受支持的h264也不会影响结果

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

我尝试使用FFMPEG的
concat协议
功能连接这些文件。使用此命令:

ffmpeg-y-i'concat:medium1.ts | medium2.ts'-c copy-bsf:a aac|u 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%

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

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


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

如果要将两个视频连接在一起,它们的大小必须相同。@WLGfx好吧,我正试图避免这种情况,我已经成功地编写了一个程序来连接任何大小的视频,但是我无法让它在这种情况下工作。我如何避免加入视频并将直接的JPG添加到MP4@WLGfx你是说决心吗?如果是这样,则不会。只要带内有xPS来重新配置播放器,就没有问题。TS流在流中没有实际的头信息,并且在连接PTS值时可能需要对其重新编码。我只是根据自己解码TS流的经验。如果两个流的大小(分辨率)不同,则可能是播放器崩溃的原因。@J.Scull您在哪个播放器中测试它们?奇怪的是,当我反复执行此操作时,我得到的图像越来越多,我附加的最新图像被覆盖了?我目前正在使用1秒的剪辑,以便更容易地查看是否添加了新帧。当我观看新视频时,它会显示第一个视频中的一帧,然后只显示最近的新层,持续X秒,以计算迭代次数。(例如,添加5帧并观看第一个视频,然后是第5帧,持续5秒)。
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