gpt4 book ai didi

php - 关键帧上的随机像素。 (ffmpeg)

转载 作者:搜寻专家 更新时间:2023-10-31 21:12:17 29 4
gpt4 key购买 nike

SO 的 friend 们好!

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

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

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

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

make_random_red_pixel_mark($videofile, $frame);

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

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

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

有什么建议吗?

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

更多信息:

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

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

最佳答案

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

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

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

  • 打开输入视频。
  • 创建输出视频。
  • 遍历 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 包装器。

其他解决方案是:如果您可以灵活选择帧,请尝试仅对关键帧重新编码。因为关键帧是完整的“位图”。您不需要处理 GOP。您将仅对 1 帧进行解码和重新编码。

关于php - 关键帧上的随机像素。 (ffmpeg),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16927691/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com