3

你好,SO的人!

我们试图在 PHP 中编写一些非常小而简单的代码来生成视频的变体,始终使用相同的文件。

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

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

$frame = $_GET[frame];
$videofile = 'video.avi';

make_random_red_pixel_mark($videofile, $frame);

有谁知道这是否可以使用ffmpeg?同样,对我们来说,尽快执行此程序也非常重要。

意味着重新处理整个视频的解决方案对我们的目的没有用处。它应该类似于隐藏式字幕或快速图像/叠加过滤器,无需重新处理整个视频即可应用。同样,我们不能使用 Javascript 或任何 HTML 方法放置覆盖,因为实际操作必须在视频文件本身上。

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

有什么推荐吗?

提前致谢!!
克里斯·C·鲁索

更多信息:

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

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

4

1 回答 1

2

这是一个难题。FFmpeg 覆盖视频过滤器需要重新编码。

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

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

  • 打开输入视频。
  • 创建输出视频。
  • 循环输入视频的数据包,直到找到所需的帧。
  • 读取视频数据包的标志(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 帧。

于 2013-06-05T05:44:57.537 回答