python - 每帧带有自定义叠加层的 FFMPEG H264

标签 python video ffmpeg

我们有一个流作为单独的 H264 帧存储在云 (Amazon S3) 中。帧存储为 framexxxxxx.264 ,编号不是从 0 开始,而是从更大的数字开始,比如 1000(所以,frame001000.264)
目标是创建一个 mp4 剪辑,它要么是延时拍摄,要么只是更快地进行检查和其他检查(更快,将大约 3 小时的视频压缩到 < 20 分钟),这还需要我们将帧号(文件名)覆盖在框架本身
起初,我通过从 S3 中仅提取关键帧(i 帧?对于编解码器和东西来说还是相当新的)并在它们上覆盖文件名并保存为 png(这可能不需要,但这就是我所做的)来创建延时摄影) using (此命令在 python 脚本中使用)

ffmpeg -y -i {h264_name} -vf \"scale=1920:-1, 
drawtext=fontfile=/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-B.ttf:fontsize=34:text={txt}:fontcolor=white:x=50:y=50:bordercolor=black:borderw=2\" 
-c:a copy -pix_fmt yuv420p {basename}.png
在此之后,我使用 python 将所有帧合并,将最低编号的帧转换为 0.png并递增(所以它是连续的,因为我只使用了关键帧,数字最初不是连续的)并运行
ffmpeg -y -f image2 -i %d.png -r {self.params.fps} -vcodec libx264 -crf {self.params.crf} -pix_fmt yuv420p {out_file}
这很好用,但是关键帧之间的差异太长而无法进行正确检查
所以现在的问题
因为我知道ffmpeg不能单独使用不是关键帧(p帧?)的帧,所以覆盖文件名并将其转换为png(或保留为h264,同样的东西)的方法将不起作用,或者至少,我找不到让它工作的方法,也许有一种方法可以指定帧的关键帧?,如何覆盖文件名(而不是显示的帧号 here 例如)
另外,是否可以在关键帧之间跳过一些 p 帧? (因此,如果每 30 帧有一个关键帧,我们将取一个关键帧,15 帧后取一帧,然后再取一个关键帧)
我考虑过使用ffmpeg的管道选项在下载文件时为其提供文件,但我不确定是否可以通过这种方式指定dr​​awtext
另外,如果有另一种选择可以实现这一点(起初我正在转换为 png,使用 python 和 OpenCV 添加文件名,然后将 pngs 合并到 mp4,但后来我发现 drawtext 可以在一个命令中做到这一点,所以我使用它)

最佳答案

我最终使用了 https://github.com/DaWelter/h264decoder而不是 ffmpeg 直接。
它有一个非常简单的界面,我只是调用了

decoder = h264decoder.H264Decoder()
# For each file, in order call
framedatas = decoder.decode(data_in)
for framedata in framedatas:
    (frame, w, h, ls) = framedata
    self.process_frame(frame, path) # Using OpenCV to manipulate, resize, add the overlay, etc.
然后将输出数据通过管道传输到 ffmpeg 以组合成一个 MP4 文件

关于python - 每帧带有自定义叠加层的 FFMPEG H264,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64041623/

相关文章:

python - 如何对子图/嵌套图进行拓扑排序?

python - 对 pandas DataFrame 中每一行的操作

ios - FFmpeg iOS -> 输出文件无效

ffmpeg - 检测部分帧的场景变化

ffmpeg - 在寻找使用动画编解码器降低质量的选项时遇到问题

python - 尽管指定了 `device_count={' CPU' : 1, 'GPU' : 0}`?,为什么 TensorFlow session 由于 GPU 内存不足错误而无法启动

python - uWSGI 不使用 .ini 文件

尝试在 appdelegate 中调用 AdColony.configure 时,Swift/Xcode AdColony 返回错误

python - vlc mac python 绑定(bind)无视频输出

linux - 使用 ffmpeg 截取多个屏幕截图