2012-02-06 93 views
12

我试图以编程方式覆盖使用FFmpeg的另一个视频的顶部的图像或视频。看来AVFilter可以做到这一点。FFmpeg AVFilter覆盖/水印以编程方式

有很多关于如何使用命令行做类似事情的例子,但是我没有找到使用AVFilter编程的例子,除了doc/examples/filtering.c,它可以帮助我但不够真实。 我已经可以对视频进行解码和编码,我只需要学习如何过滤解码的帧并添加水印。

是否有任何编程使用libavfilter的例子?

是否有使用覆盖或电影过滤器的例子?

+0

该代码示例可以轻松修改为应用任意过滤器。问题是什么?有关使用叠加层和电影过滤器的示例,请参阅[如何使用FFmpeg为视频加水印](http://www.idude.net/index.php/how-to-watermark-a-video-using-ffmpeg)。 – 2012-02-06 06:48:44

+1

该示例的问题是它过载(2个过滤器,过滤器图等)。对于一个新手而且想知道如何应用一个AVFilter的人来说,这是令人困惑的,因为它并没有说明开始所需的东西。 – 2012-07-13 21:53:52

回答

7

的命令:

ffmpeg –i inputvideo.avi -vf "movie=watermarklogo.png [watermark]; [in][watermark] overlay=10:10 [out]" outputvideo.flv 

产生具有在左上角的图像 “watermarklogo.png” 视频。从另一个程序调用该命令应该足够简单。滴滴

打破下来有点明白了吧:

ffmpeg是你将使用添加水印的程序。

-i用于指定输入文件。

inputvideo.avi是您的输入文件,由-i指定。

-vf用于指定视频过滤器。在这种情况下,这是引号中的所有内容。

movie=watermarklogo.png将加载您要用作水印的文件。在这里,我们将文件加载为视频源(使用movie),无论文件是否为视频。在这种情况下,它是一个图像。

[watermark]标记刚加载的文件。该标签将用于代码的其余部分。

[in][out]指的是视频的输入流和输出流。

overlay正好在[watermark]标签后面使用,以便引用它。在这种简单的情况下,我们把overlay放在10:10。这意味着水印将从顶部和左侧偏移10个像素。如果您想要右下角,则可以使用overlay=main_w-overlay_w-10:main_h-overlay_h-10,其中main_w是输入流的宽度,overlay_h是叠加文件的高度,依此类推。

最后,outputvideo.flv显然是您希望将结果保存到的文件。

其他信息:

我发现这个信息通过the site Dmitry had mentioned中的注释。亚历克斯曾经提到,这个页面可能对于那些不熟悉这种事情的人来说太复杂了。然而,我从来没有做过这样的事情,在几分钟内我就得到了我相信正在寻求的结果。

注:我的时候,我得到的错误麻烦了一下:

error while opening encoder for output stream #0.1 

如果你有可能需要手动设置使用-ar参数的采样频率相同的问题(例如,-ar 22050)。

+0

您可以定义水印的时间吗?可以说我想要水印从00:00开始并在@ 01:00消失,这可能吗? – rroche 2012-08-31 23:10:51

+0

@rroche查看[这篇文章](http://stackoverflow.com/questions/9160771/ffmpeg-watermark-first-30-second)。费利克斯的答案可能是最简单的,但德米特里的答案(与上面相同的德米特里)有点整齐,并允许淡出水印。 – golmschenk 2012-09-01 01:55:20

+4

这个问题涉及到使用AVFilter库,而不是调用FFMPEG二进制文件。 – Erik 2012-09-04 02:23:32