大家好!
我们正在尝试用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覆盖视频过滤器需要重新编码。
当你改变视频中的几乎任何内容时,你将处理视频的重新编码。这可能是一个昂贵的过程,这取决于视频和你有多匆忙(如果你想实时,你是在匆忙)。
可能的解决方案如下:
打开输入视频。
创建输出视频。
在输入视频的数据包上循环,直到找到所需的帧。
读取视频包(avpacket结构)的标志,可以识别该帧的Group of Pictures。
好的,你只需要重新编码属于这组图片的帧。因为gop总是从一个关键帧开始,所以您可以这样做。
完成后,继续读取输入的数据包并将其写入输出(transmux)。
从源读取数据包并将其写入目标的过程称为transmux,对于实时流媒体来说非常便宜。基本上是字节的简单拷贝。没什么大不了的。
“这里最困难的部分是,你必须管理一个数据包池,直到你确定你的帧所在的gop。为什么?因为您将读取所有数据包并将其存储在池中(不解码数据包)。当您确定它是一个gop时,您将把这些数据包写到您的输出中,然后转到下一个gop。因此,内存中总是有要刷新的gop(所有数据包放在一起)。确定要修改的目标帧时。我将不得不解码的帧从开始的gop到结束,修改您想要的帧,然后重新编码这个gop!好极了!”
对于任意视频,上述过程可能会导致您重新编码的gop中的编码质量出现明显差异。:。-(
如果你不知道如何打开视频,读数据包,写数据包,等等…你必须知道基本的操作系统ffmpeg。
为了做到这一点,我建议您在不了解以下内容的情况下研究这个示例:
Duu邢:http://ffmpeg.org/doxygen/trunk/doc_2examples_2demuxing_8c-example.html
Muxing:http://ffmpeg.org/doxygen/trunk/doc_2examples_2muxing_8c-example.html
本例将教您如何打开视频、识别音频/视频流并在数据包上循环,以及解码和重新编码。
干得很辛苦。这些例子都是用C语言编写的,你可以决定为php做一个插件,或者为ffmpeg使用一个php包装器。
另一种解决方案是:如果你有选择框架的灵活性,尝试只编码关键帧。因为关键帧是完整的“位图”。你不需要和共和党人打交道。您将只解码并重新编码1帧。
关于php - 关键帧上的随机像素。 (ffmpeg),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16927691/