Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 关键帧上的随机像素。(ffmpeg)_Php_Ffmpeg_Video Streaming_Video Processing - Fatal编程技术网

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

Php 关键帧上的随机像素。(ffmpeg),php,ffmpeg,video-streaming,video-processing,Php,Ffmpeg,Video Streaming,Video Processing,大家好 我们试图用PHP编写一些非常小而简单的代码来生成视频的变体,始终使用相同的文件 脚本必须在视频文件的随机或特定帧上做一个小像素标记,并且必须实时流式传输 这里有一些伪代码来解释我的想法: $frame = $_GET[frame]; $videofile = 'video.avi'; make_random_red_pixel_mark($videofile, $frame); 有人知道使用ffmpeg是否可以做到这一点吗?同样,对我们来说,尽快执行这个过程非常重要 一个意味着重新处

大家好

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

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

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

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

make_random_red_pixel_mark($videofile, $frame);
有人知道使用ffmpeg是否可以做到这一点吗?同样,对我们来说,尽快执行这个过程非常重要

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

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

有什么建议吗

提前感谢
克里斯·C·鲁索

更多信息:

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

make_random_red_pixel_mark($videofile, $frame);
1)我们可以在想要的任何帧上应用此过程,因此我们可以使用“关键帧”,以避免对整个GOP进行解码和重新编码


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

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

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

可能的解决方案如下:

  • 打开输入视频
  • 创建输出视频
  • 循环输入视频的数据包,直到找到所需的帧
  • 读取视频数据包的标志(AVPacket结构),可以识别此帧的格式
  • 好的,您必须只重新编码属于这组图片的帧。因为GOP总是以关键帧开始,所以您将能够做到这一点
  • 完成后,继续读取输入数据包并将其写入输出(transmux)
从源读取数据包并写入目标的过程称为transmux,对于实时流媒体来说非常便宜。它基本上是字节的纯拷贝。没什么大不了的

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

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

如果您不知道如何打开视频、读取数据包、写入数据包等,那么您必须了解基本的操作系统FFmpeg

为了做到这一点,如果您对以下内容一无所知,我建议您学习此示例:

  • 解组:
  • 慕兴:
  • 本例将教您如何打开视频,识别音频/视频流并在数据包上循环,以及解码和重新编码

    很难。这些例子都是C语言的。你可以决定为PHP制作一个插件,或者为FFmpeg使用一个PHP包装器


    另一个解决方案是:若你们有选择帧的灵活性,那个么试着只重新编码关键帧。因为关键帧是完整的“位图”。你不需要处理GOP。你只需要解码和重新编码一帧。

    PHP可能不是最好的方法,因为它不够强大。你可能想研究一个二进制服务器端解决方案,并从PHP调用它。事实上,我的朋友,你知道有什么软件可以做到这一点吗?谢谢!你可以搜索FFMPEG选项。哟你可能想搜索像“ffmpeg覆盖”这样的东西——然后找出你想要像素的位置,然后找出如何指定帧,如果可能的话。这似乎是一个好的开始,与@RobW一起,
    覆盖
    视频过滤器需要重新编码,如果“重新处理”,我相信Chris Russo希望避免这种情况还包括或暗示重新编码。此外,您的覆盖URL是旧的:。无论如何,感谢@RobW和LordNeckbeardFirst,非常感谢您的响应。它实际上看起来是解决此问题的真正解决方案!幸运的是,我们在帧上具有灵活性,因此我们可以使用您提到的关键帧。在这种情况下,如果我理解您的意思,我们只能对1帧进行解码和重新编码,这将是我们的目标。您认为在流式传输视频时可以进行此过程吗?换句话说,我们可以将原始视频加载到缓冲区,然后创建另一个输出缓冲区来流式传输内容,仅进行编辑(并按需显示)预选的帧?是的,这是可能的!如果你理解muxing.c和demuxing.c这两个文件,你就可以这么做了。-)我的朋友,这可能有点离题了,但既然我们有预算,我想在facebook上和你谈谈。你似乎是项目这一部分的合适人选。