FFmpeg从图像创建视频,将图像作为时间戳插入帧?

时间:2018-08-29 07:42:09

标签: python batch-file video ffmpeg

因此,我尝试提取视频的每个帧,然后使用ffprobe查看何时在视频中播放每个帧,然后能够使用提取的图像和ffprobe输出将视频缝合在一起。

现在,我有这个批处理文件:

for %%a in (*.mp4) do (
    mkdir "%%~na_images" > NUL
    ffmpeg.exe -hide_banner -i "%%a"  -t 100 "%%~na_images\image-%%d.png"
    ffprobe.exe "%%a" -hide_banner -show_entries frame=coded_picture_number,best_effort_timestamp_time -of csv > "%%~na_frames.txt"
)

首先,为图像创建目录。 然后,ffmpeg将视频的所有帧提取到单独的PNG文件中,并对其进行适当编号。 最后,ffprobe看到何时在该视频中首次显示每个帧(IE:第1帧以0秒显示,但以60fps播放,然后在视频中以0.016667秒播放第2帧)。输出看起来像这样:

frame,0.000000,0
frame,0.000000
frame,0.017000,1
frame,0.023220

第一个数字(IE 0.17000是第二帧的出现时间),第二个数字是帧号。 现在我的问题是使用ffmpeg拍摄每一帧并将其放置在视频中的适当时间。我可以使用另一种语言(可能是Python)来完成此操作,但是我最好的猜测是制作一个循环,循环遍历ffprobe输出文件,获取帧时间和图像编号,将该帧放置在其出现的位置,然后继续到下一帧和时间位置。看一下我上面作为例子使用的帧数据,它会是这样的:

for line in lines:
    mySplit = line.split(',')
    # Get image number 0 and insert at time 0.000000

这是我不确定如何编码的部分。我可以阅读并解析ffprobe输出文本文件的行,但是我不知道如何使用ffmpeg或类似的解决方案在视频的某些点插入帧。

1 个答案:

答案 0 :(得分:1)

您需要告诉系统存在多个令牌。即

for /f "tokens=1-4 delims=," %%a in ...

在这里您告诉您要获取令牌1到4,且分界符为,

因此,对于包含1,100,1000,10000的文件的示例,它将{%%a分配给第一个标记(即1,而%%b分配给第二个标记(即{{ 1}})等。