正如描述所说,我正在尝试创建一个视频,其中包含背景视频和半透明视频覆盖。
我最初的尝试是使用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
谢谢
答案 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的音频流
如果您有任何疑问,请与我联系:)
您未向过滤器提供地图,因此未向过滤器提供任何内容,也没有输出。
以下命令可行:
/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