【问题标题】:A random pixel on a keyframe. (ffmpeg)关键帧上的随机像素。 (ffmpeg)
【发布时间】:2013-05-31 10:20:32
【问题描述】:

大家好!

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

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

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

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

make_random_red_pixel_mark($videofile, $frame);

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

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

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

有什么推荐吗?

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

更多信息:

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

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

【问题讨论】:

  • PHP 可能不是最好的方法,因为它不够强大。您可能想研究一个二进制服务器端解决方案并从 PHP 中调用它。
  • 确实,我的朋友,你知道任何可以做到这一点的软件吗?谢谢!
  • 您可以搜索 FFMPEG 选项。您可能想要搜索“ffmpeg 覆盖”之类的内容——然后找出您想要像素的位置,然后找出如何指定帧(如果可能)。 stackoverflow.com/questions/8131020/…ffmpeg.org/ffmpeg.html#overlay-1 一起似乎是一个好的开始
  • @RobW overlay 视频过滤器需要重新编码,如果“重新处理”还包括或暗示重新编码,我相信 Chris Russo 想避免这种情况。您的覆盖 URL 也很旧:overlay video filter documentation
  • 谢谢@RobW 和 LordNeckbeard

标签: php ffmpeg video-streaming video-processing


【解决方案1】:

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

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

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

  • 打开输入视频。
  • 创建 OUTPUT 视频。
  • 循环遍历 INPUT 视频的数据包,直到找到所需的帧。
  • 读取视频包的标志(AVPacket 结构)可以识别此帧的Group of Pictures
  • 好的,您只需要重新编码属于这组图片的帧。因为 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 帧。

【讨论】:

  • 首先,非常感谢您的回复。它实际上看起来像是这个问题的真正解决方案!幸运的是,我们在帧上确实有灵活性,所以我们可以使用你提到的关键帧。在这种情况下,如果我理解你的话,我们只能解码和重新编码 1 帧,这将是目标。您认为在我们流式传输视频时有可能进行此过程吗?换句话说,我们是否可以将原始视频加载到缓冲区中,并创建另一个输出缓冲区来流式传输内容,只编辑(并按需显示)预先选择的帧?
  • 是的,有可能!如果您了解这两个文件 muxing.c 和 demuxing.c,您将能够做到这一点。 ;-)
  • 我的朋友,这可能有点跑题了,但由于我们有这方面的预算,我想在 Facebook 上和你谈谈。您似乎是该项目这部分的合适人选。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
相关资源
最近更新 更多