关键帧上的随机像素.(ffmpeg)


A random pixel on a keyframe. (ffmpeg)

大家好!

我们正在尝试在PHP中做一些非常小而简单的代码来生成一个视频的变体,总是使用相同的文件。

脚本必须在视频文件的随机或特定帧上制作一个小像素标记,并且必须实时流式传输。

下面是一些伪代码来解释我的想法:

$frame = $_GET[frame];
$videofile = 'video.avi';
make_random_red_pixel_mark($videofile, $frame);

是否有人知道这是可能的使用ffmpeg?同时,对我们来说,尽可能快地执行这个程序是极其重要的。

意味着重新处理整个视频的解决方案对我们的目的是没有用的。它应该是一个封闭的标题,或者一个快速的图像/覆盖过滤器,可以在没有整个视频重新处理的情况下应用。同样,我们不能使用Javascript或任何HTML方法来放置覆盖,因为实际操作必须在视频文件本身。

原始视频的质量和帧率应保持完整。也许其他一些PHP模块或软件可以从PHP使用exec()执行?

推荐吗?

提前感谢!!
Chris C. Russo

更多信息:

1)我们可以在任何我们想要的帧上应用这个过程,所以我们可以使用"关键帧"来避免整个GOP的解码和重新编码。

2)如前所述,视频流必须实时流动

这是一个难题。FFmpeg叠加视频滤波器需要重新编码。

当您更改几乎视频中的任何内容时,您将处理视频的重新编码。这可能是一个昂贵的过程,这取决于视频和你有多匆忙(如果你想要实时的,你是匆忙的)。

一个可能的解决方案是这样的:

  • 打开输入视频
  • 创建OUTPUT视频
  • 循环输入视频的数据包,直到你找到你想要的帧。
  • 读取视频包的标志(AVPacket结构),可以识别该帧的图片组。
  • 好的,你将不得不重新编码,只属于这组图片的帧。因为GOP总是以关键帧开始,所以你可以这样做。
  • 完成后,继续读取INPUT的数据包并将其写入OUTPUT (transmux)。

从源读取数据包并将其写入目标的过程称为transmux,对于实时流来说非常非常便宜。它基本上是字节的普通副本。没什么大不了的。

"这里困难的部分是你必须管理数据包池,直到你确定你的帧所在的GOP。为什么?因为您将读取所有数据包并将它们存储在一个池中(不解码数据包)。当您确定它是一个GOP时,您将把这些数据包写入您的OUTPUT并继续到下一个GOP。因此,您将始终在内存中有要刷新的GOP(所有数据包一起)。当你确定了你想要修改的目标坐标系。我将不得不解码从GOP开始到结束的帧,修改你想要的帧,然后重新编码这个GOP!嗯,非常难!"

对于任意视频,上述过程可能会导致您重新编码的GOP中编码质量的明显差异。: - (

如果你不知道如何打开一个视频,读数据包,写数据包,等等…你必须了解FFmpeg的基本知识。

为了做到这一点,如果你对以下内容一无所知,我建议你研究一下这个例子:

  1. 多路分配器:http://ffmpeg.org/doxygen/trunk/doc_2examples_2demuxing_8c-example.html
  2. 多路复用技术:http://ffmpeg.org/doxygen/trunk/doc_2examples_2muxing_8c-example.html

这个例子将教你如何打开视频,识别音频/视频流和循环数据包,以及解码和重新编码。

努力工作。这些例子都是用c语言写的。你可以决定为PHP做一个插件,或者为FFmpeg使用一个PHP包装器。

另一个解决方案是:如果你有选择帧的灵活性,尝试只重新编码关键帧。因为关键帧是完整的"位图"。你不需要和共和党人打交道。您将只解码和重新编码1帧。