如何以编程方式在android中混合/合并两个视频

时间:2015-10-23 22:46:26

标签: java android ffmpeg

正如描述所说,我正在尝试创建一个视频,其中包含背景视频和半透明视频覆盖。

我最初的尝试是使用ffmpeg用于android https://github.com/WritingMinds/ffmpeg-android-java并在叠加模式下使用混合滤镜。

但事实证明ffmpeg安卓库是建立在ffmpeg 2.4之上的,但是自ffmpeg 2.6以来可以使用混合过滤器。到目前为止,ffmpeg对我来说失败了,我正在寻找替代解决方案。

我们非常感谢任何建议。

更新#1

我终于设法为android安装ffmpeg 2.6.4,其中包含混合过滤器但出现了另一个问题。当它开始视频处理它只是在开始时停止并且永远不会结束,没有来自ffmpeg工具的输出,没有错误,没有警告,没有任何东西可以帮助我追查问题。

在Android设备上,它按以下命令运行:

/data/user/0/com.test.app/files/ffmpeg 
-i /storage/emulated/0/Android/data/com.test.app/files/video/vid1.mp4 
-i /storage/emulated/0/Android/data/com.test.app/files/video/overlay.mp4 
-filter_complex blend=all_mode='overlay':all_opacity=0.8" 
-strict -2 /storage/emulated/0/Android/data/com.test.app/files/video/blended.mp4

还有以下输出:

ffmpeg version n2.6.4 Copyright (c) 2000-2015 the FFmpeg developers
   built with gcc 4.8 (GCC)
   configuration: --target-os=linux --cross-prefix=/media/ubuntu/data/ffmpeg-android/toolchain-android/bin/arm-linux-androideabi- --arch=arm --cpu=cortex-a8 --enable-runtime-cpudetect --sysroot=/media/ubuntu/data/ffmpeg-android/toolchain-android/sysroot --enable-pic --enable-libx264 --enable-libass --enable-libfreetype --enable-libfribidi --enable-fontconfig --enable-pthreads --disable-debug --disable-ffserver --enable-version3 --enable-hardcoded-tables --disable-ffplay --disable-ffprobe --enable-gpl --enable-yasm --disable-doc --disable-shared --enable-static --pkg-config=/media/ubuntu/data/ffmpeg-android/ffmpeg-pkg-config --prefix=/media/ubuntu/data/ffmpeg-android/build/armeabi-v7a-neon --extra-cflags='-I/media/ubuntu/data/ffmpeg-android/toolchain-android/include -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all -mfpu=neon' --extra-ldflags='-L/media/ubuntu/data/ffmpeg-android/toolchain-android/lib -Wl,-z,relro -Wl,-z,now -pie' --extra-libs='-lpng -lexpat -lm' --extra-cxxflags=
   libavutil      54. 20.100 / 54. 20.100
   libavcodec     56. 26.100 / 56. 26.100
   libavformat    56. 25.101 / 56. 25.101
   libavdevice    56.  4.100 / 56.  4.100
   libavfilter     5. 11.102 /  5. 11.102
   libswscale      3.  1.101 /  3.  1.101
   libswresample   1.  1.100 /  1.  1.100
   libpostproc    53.  3.100 / 53.  3.100
 [h264 @ 0xb5e03000] no frame!
 [aac @ 0xb5e03400] Input buffer exhausted before END element found
 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/storage/emulated/0/Android/data/com.test.app/files/video/vid1.mp4':
   Metadata:
     major_brand     : mp42
     minor_version   : 0
     compatible_brands: isommp42
     creation_time   : 2015-08-30 17:19:07
   Duration: 00:00:05.03, start: 0.000000, bitrate: 3449 kb/s
     Stream #0:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 640x640, 3381 kb/s, SAR 1:1 DAR 1:1, 30 fps, 30 tbr, 90k tbn, 180k tbc (default)
     Metadata:
       creation_time   : 2015-08-30 17:19:07
       handler_name    : VideoHandle
     Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 63 kb/s (default)
     Metadata:
       creation_time   : 2015-08-30 17:19:07
       handler_name    : SoundHandle
 [h264 @ 0xb5e03800] no frame!
 [aac @ 0xb5e04400] Input buffer exhausted before END element found
 Input #1, mov,mp4,m4a,3gp,3g2,mj2, from '/storage/emulated/0/Android/data/com.test.app/files/video/overlay.mp4':
   Metadata:
     major_brand     : mp42
     minor_version   : 0
     compatible_brands: isommp42
     creation_time   : 2015-08-30 17:19:07
   Duration: 00:00:05.03, start: 0.000000, bitrate: 3449 kb/s
     Stream #1:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 640x640, 3381 kb/s, SAR 1:1 DAR 1:1, 30 fps, 30 tbr, 90k tbn, 180k tbc (default)
     Metadata:
       creation_time   : 2015-08-30 17:19:07
       handler_name    : VideoHandle
     Stream #1:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 63 kb/s (default)
     Metadata:
       creation_time   : 2015-08-30 17:19:07
       handler_name    : SoundHandle

此输出后ffmpeg进程仍然在运行,但它没有提供任何响应......我不知道如何处理这样的问题,也许我可以尝试使用不同的编解码器,这在android上运行得更好或启用一些调试记录在ffmpeg中。 任何建议都会有所帮助。

更新#2

谢谢

1 个答案:

答案 0 :(得分:4)

如果你想要混合滤镜,那么你应该自己构建ffmpeg。

但是,您可以将视频叠加到视频中而不使用混合滤镜。

首先,改变你的视频透明度,colorchannelmixer过滤器可以做到。

colorchannelmixer=[0 to 1] // 0 = 0%, 0.5 = 50%, 1 = 100%

然后将其合并为主视频。你可以使用宏来表示X和Y的位置(main_h,main_w和over_h,over_w)。

overlay=X:Y // X : x of position, Y : y of position

完整的命令行如下:

ffmpeg -i OVERLAY_VIDEO.mp4 -i MAIN_VIDEO.mp4 -filter_complex "[0:v]colorchannelmixer=aa=0.5[ov];[1:v][ov]overlay=0:0[video_out]" -map [video_out] -map 1:a OUTPUT.mp4

[0:v]是OVERLAY_VIDEO.mp4的视频流,因为第一个-i是OVERLAY_VIDEO.mp4,它自动映射为0。我还定义了[ov] map来获取透明度过滤器的输出,

然后我使用覆盖过滤器和[1:v](MAIN_VIDEO.mp4的视频流)和[ov]合并两个视频,我刚刚发布。

最后,我定义了[video_out]来获取叠加滤波器的输出,然后再用1:a映射它,这是MAIN_VIDEO.mp4的音频流

如果您有任何疑问,请与我联系:)

更新#1的答案

您未向过滤器提供地图,因此未向过滤器提供任何内容,也没有输出。

以下命令可行:

/data/user/0/com.test.app/files/ffmpeg \ 
-i /storage/emulated/0/Android/data/com.test.app/files/video/vid1.mp4 \
-i /storage/emulated/0/Android/data/com.test.app/files/video/overlay.mp4 \
-filter_complex "[0:v][1:v]blend=all_mode='overlay':all_opacity=0.8[v_out]" \
-map [v_out] -map 0:a -strict -2 /storage/emulated/0/Android/data/com.test.app/files/video/blended.mp4