如何使用FFmpeg在MP4上显示3秒的水印

时间:2014-02-05 19:23:04

标签: android ffmpeg

我需要在Android中为Camera录制的视频添加3秒水印。我正在使用FFmpeg静态构建来执行命令。

接近我

我在运行Linux Mint的桌面上使用最新版本的FFmpeg(版本N-60108-gda25a65)尝试了以下命令,命令运行正常。

ffmpeg -y -itsoffset 3 -i input.mp4 -i myImage.jpg -filter_complex "[0:v][1:v]overlay=0:0:enable=between(t\,0\,3)"  -codec:a copy output.mp4

在Android中,我使用带有以下配置的FFmpegv1.2来执行命令。

 *******Starting FFMPEG
    ***ffmpeg version 1.2 Copyright (c) 2000-2013 the FFmpeg developers***
    ***  built on Mar 31 2013 23:44:57 with gcc 4.6 (GCC) 20120106 (prerelease)***
    ***  configuration: --arch=arm --target-os=linux --enable-runtime-cpudetect --enable-pic --disable-shared --enable-static --cross-prefix=/opt/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi- --sysroot=/opt/android-ndk-r8e/platforms/android-8/arch-arm --extra-cflags='-march=armv6' --extra-ldflags= --enable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --disable-network***
    ***  libavutil      52. 18.100 / 52. 18.100***
    ***  libavcodec     54. 92.100 / 54. 92.100***
    ***  libavformat    54. 63.104 / 54. 63.104***
    ***  libavdevice    54.  3.103 / 54.  3.103***
    ***  libavfilter     3. 42.103 /  3. 42.103***
    ***  libswscale      2.  2.100 /  2.  2.100***
    ***  libswresample   0. 17.102 /  0. 17.102***

运行FFmpeg命令的Java代码:

String[] ffmpegCommandToAddWatermark = { 
            mFfmpegInstallPath, "-y", "-itsoffset","3",
             "-i", INPUT_VIDEO_PATH, "-i", WATERMARK_IMAGE_PATH,
             "-filter_complex","[0:v][1:v]overlay=0:0:between(t\\,0\\,3)",
             "-strict","-2",
             "-codec:a","copy",OUTPUT_VIDEO_PATH};          
        try {
        Process ffmpegProcess = new ProcessBuilder(ffmpegCommandToAddWatermark)
            .redirectErrorStream(true).start();

        String line;

        BufferedReader reader = new BufferedReader(
            new InputStreamReader(ffmpegProcess.getInputStream()));
        Log.d(TAG, "*******Starting FFMPEG");
        while ((line = reader.readLine()) != null ) {

            Log.d(TAG, "***" + line + "***");
        }
        Log.d(null, "****ending FFMPEG****");

        } catch (Exception e) {
        e.printStackTrace();
        }

命令执行失败,出现以下错误:

***[overlay @ 0x271f770] No option name near 'between(t,0,3)'***
***[AVFilterGraph @ 0x2711530] Error initializing filter 'overlay' with args '0:0:between(t,0,3)'***
***Error configuring filters.***

删除:enable=between(t\,0\,3)时,相同的命令会成功执行,但结果输出视频在整个时间轴上都有水印,但我只需要水印开始3秒。

方法II

我尝试将WaterMarkImage转换为WaterMarkVideo

ffmpeg -y -loop 1 -r 30 -i WaterMarkImage.jpg -b:v "4096k" -vf "scale=640:480" -t 3 WaterMarkVideo.mp4

然后使用concat命令合并WaterMarkVideo.mp4 + CameraRecordedVideo.mp4:

ffmpeg -y -f concat -i inputs.txt -c copy output.mp4

由于BitRate,FrameRate等不匹配,结果输出已损坏。有什么想法解决问题吗?。

1 个答案:

答案 0 :(得分:0)

FFmpeg 1.2没有timeline editing支持。使用旧版本时,请参阅您当地的FFmpeg文档。在线FFmpeg documentation每天都会与源代码同步,因为FFmpeg development is very active在线文档可能不适合您的旧版本。

发布适用于分销商。一般用户应该使用git master中最新的源代码。