问题
This is a follow-up question to: Flutter (Dart): Merge two videos and view the new output in the device's gallery (photos)
In essence, I am trying to record two videos, merge them and then view the new video in the gallery. I am currently having some issues with the flutter_ffmpeg package.
I uploaded the my Flutter project onto GitHub here:
https://github.com/IttaiBarkai/Flutter-Video-Merger
Below is a snippet of my code used to execute ffmpeg:
void _videoMerger() async {
final appDir = await syspaths.getApplicationDocumentsDirectory();
String rawDocumentPath = appDir.path;
final outputPath = '$rawDocumentPath/output.mp4';
final FlutterFFmpeg _flutterFFmpeg = new FlutterFFmpeg();
String commandToExecute = '-y -i ${_storedVideoOne.path} -i ${_storedVideoTwo.path} -filter_complex \'[0:0][1:0]concat=n=2:v=1:a=0[out]\' -map \'[out]\' $outputPath';
_flutterFFmpeg.execute(commandToExecute).then((rc) => print("FFmpeg process exited with rc $rc"));
}
and this is the output displayed on my debug console when ffmpeg gets executed:
D/flutter-ffmpeg(29135): Running FFmpeg with arguments: [-y, -i, /storage/emulated/0/Android/data/com.example.video_merger_two/files/Pictures/1e8947f4-c9c2-4020-b78d-c40fb77ce0d16301015681843175998.mp4, -i, /storage/emulated/0/Android/data/com.example.video_merger_two/files/Pictures/3555b190-a9a6-450d-b6a7-7d1b8fc89ad38627500242651150494.mp4, -filter_complex, [0:0][1:0]concat=n=2:v=1:a=0[out], -map, [out], /data/user/0/com.example.video_merger_two/app_flutter/output.mp4].
I/mobile-ffmpeg(29135): Loading mobile-ffmpeg.
I/mobile-ffmpeg(29135): Loaded mobile-ffmpeg-https-x86-4.3.1-20200125.
D/mobile-ffmpeg(29135): Callback thread started.
I/mobile-ffmpeg(29135): ffmpeg version git-2020-01-25-fd11dd500
I/mobile-ffmpeg(29135): Copyright (c) 2000-2020 the FFmpeg developers
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): built with Android (5220042 based on r346389c) clang version 8.0.7 (https://android.googlesource.com/toolchain/clang b55f2d4ebfd35bf643d27dbca1bb228957008617) (https://android.googlesource.com/toolchain/llvm 3c393fe7a7e13b0fba4ac75a01aa683d7a5b11cd) (based on LLVM 8.0.7svn)
I/mobile-ffmpeg(29135): configuration: --cross-prefix=i686-linux-android- --sysroot=/files/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot --prefix=/home/taner/Projects/mobile-ffmpeg/prebuilt/android-x86/ffmpeg --pkg-config=/usr/bin/pkg-config --enable-version3 --arch=i686 --cpu=i686 --cc=i686-linux-android24-clang --cxx=i686-linux-android24-clang++ --target-os=android --disable-neon --disable-asm --disable-inline-asm --enable-cross-compile --enable-pic --enable-jni --enable-optimizations --enable-swscale --enable-shared --disable-v4l2-m2m --disable-outdev=v4l2 --disable-outdev=fbdev --disable-indev=v4l2 --disable-indev=fbdev --enable-small --disable-openssl --disable-xmm-clobber-test --disable-debug --enable-lto --disable-neon-clobber-test --disable-programs --disable-postproc --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-static --disable-sndio --disable-schannel --disable-securetransport --disable-xlib --disable-cuda --disable-cuvid --disable-nvenc --di
I/mobile-ffmpeg(29135): libavutil 56. 38.100 / 56. 38.100
I/mobile-ffmpeg(29135): libavcodec 58. 65.102 / 58. 65.102
I/mobile-ffmpeg(29135): libavformat 58. 35.101 / 58. 35.101
I/mobile-ffmpeg(29135): libavdevice 58. 9.103 / 58. 9.103
I/mobile-ffmpeg(29135): libavfilter 7. 70.101 / 7. 70.101
I/mobile-ffmpeg(29135): libswscale 5. 6.100 / 5. 6.100
I/mobile-ffmpeg(29135): libswresample 3. 6.100 / 3. 6.100
I/mobile-ffmpeg(29135): Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/storage/emulated/0/Android/data/com.example.video_merger_two/files/Pictures/1e8947f4-c9c2-4020-b78d-c40fb77ce0d16301015681843175998.mp4':
I/mobile-ffmpeg(29135): Metadata:
I/mobile-ffmpeg(29135): major_brand :
I/mobile-ffmpeg(29135): mp42
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): minor_version :
I/mobile-ffmpeg(29135): 0
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): compatible_brands:
I/mobile-ffmpeg(29135): isommp42
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): creation_time :
I/mobile-ffmpeg(29135): 2020-06-17T18:26:00.000000Z
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): com.android.version:
I/mobile-ffmpeg(29135): 10
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): Duration:
I/mobile-ffmpeg(29135): 27:34:19.38
I/mobile-ffmpeg(29135): , start:
I/mobile-ffmpeg(29135): 0.000000
I/mobile-ffmpeg(29135): , bitrate:
I/mobile-ffmpeg(29135): 0 kb/s
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): Stream #0:0
I/mobile-ffmpeg(29135): (eng)
I/mobile-ffmpeg(29135): : Video: h264 (avc1 / 0x31637661), yuv420p(tv, GBR), 1280x720, 3554 kb/s
I/mobile-ffmpeg(29135): , SAR 1:1 DAR 16:9
I/mobile-ffmpeg(29135): ,
I/mobile-ffmpeg(29135): 29.01 fps,
I/mobile-ffmpeg(29135): 29 tbr,
I/mobile-ffmpeg(29135): 90k tbn,
I/mobile-ffmpeg(29135): 180k tbc
I/mobile-ffmpeg(29135): (default)
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): Metadata:
I/mobile-ffmpeg(29135): rotate :
I/mobile-ffmpeg(29135): 90
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): creation_time :
I/mobile-ffmpeg(29135): 2020-06-17T18:26:00.000000Z
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): handler_name :
I/mobile-ffmpeg(29135): VideoHandle
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): Side data:
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): displaymatrix: rotation of -90.00 degrees
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): Stream #0:1
I/mobile-ffmpeg(29135): (eng)
I/mobile-ffmpeg(29135): : Audio: amr_nb (samr / 0x726D6173), 8000 Hz, mono, flt, 12 kb/s
I/mobile-ffmpeg(29135): (default)
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): Metadata:
I/mobile-ffmpeg(29135): creation_time :
I/mobile-ffmpeg(29135): 2020-06-17T18:26:00.000000Z
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): handler_name :
I/mobile-ffmpeg(29135): SoundHandle
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): Input #1, mov,mp4,m4a,3gp,3g2,mj2, from '/storage/emulated/0/Android/data/com.example.video_merger_two/files/Pictures/3555b190-a9a6-450d-b6a7-7d1b8fc89ad38627500242651150494.mp4':
I/mobile-ffmpeg(29135): Metadata:
I/mobile-ffmpeg(29135): major_brand :
I/mobile-ffmpeg(29135): mp42
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): minor_version :
I/mobile-ffmpeg(29135): 0
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): compatible_brands:
I/mobile-ffmpeg(29135): isommp42
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): creation_time :
I/mobile-ffmpeg(29135): 2020-06-17T18:26:09.000000Z
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): com.android.version:
I/mobile-ffmpeg(29135): 10
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): Duration:
I/mobile-ffmpeg(29135): 27:34:19.62
I/mobile-ffmpeg(29135): , start:
I/mobile-ffmpeg(29135): 0.000000
I/mobile-ffmpeg(29135): , bitrate:
I/mobile-ffmpeg(29135): 0 kb/s
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): Stream #1:0
I/mobile-ffmpeg(29135): (eng)
I/mobile-ffmpeg(29135): : Video: h264 (avc1 / 0x31637661), yuv420p(tv, GBR), 1280x720, 3765 kb/s
I/mobile-ffmpeg(29135): , SAR 1:1 DAR 16:9
I/mobile-ffmpeg(29135): ,
I/mobile-ffmpeg(29135): 28.80 fps,
I/mobile-ffmpeg(29135): 29.08 tbr,
I/mobile-ffmpeg(29135): 90k tbn,
I/mobile-ffmpeg(29135): 180k tbc
I/mobile-ffmpeg(29135): (default)
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): Metadata:
I/mobile-ffmpeg(29135): rotate :
I/mobile-ffmpeg(29135): 90
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): creation_time :
I/mobile-ffmpeg(29135): 2020-06-17T18:26:09.000000Z
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): handler_name :
I/mobile-ffmpeg(29135): VideoHandle
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): Side data:
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): displaymatrix: rotation of -90.00 degrees
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): Stream #1:1
I/mobile-ffmpeg(29135): (eng)
I/mobile-ffmpeg(29135): : Audio: amr_nb (samr / 0x726D6173), 8000 Hz, mono, flt, 12 kb/s
I/mobile-ffmpeg(29135): (default)
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): Metadata:
I/mobile-ffmpeg(29135): creation_time :
I/mobile-ffmpeg(29135): 2020-06-17T18:26:09.000000Z
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): handler_name :
I/mobile-ffmpeg(29135): SoundHandle
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): Stream mapping:
I/mobile-ffmpeg(29135): Stream #0:0 (h264) -> concat:in0:v0
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): Stream #1:0 (h264) -> concat:in1:v0
I/mobile-ffmpeg(29135):
I/mobile-ffmpeg(29135): concat
I/mobile-ffmpeg(29135): -> Stream #0:0 (mpeg4)
I/mobile-ffmpeg(29135): Press [q] to stop, [?] for help
W/mobile-ffmpeg(29135): [graph 0 input from stream 0:0 @ 0xed087710] sws_param option is deprecated and ignored
W/mobile-ffmpeg(29135): [graph 0 input from stream 1:0 @ 0xed086830] sws_param option is deprecated and ignored
W/mobile-ffmpeg(29135): [mp4 @ 0xeccd8790] Frame rate very high for a muxer not efficiently supporting it.
W/mobile-ffmpeg(29135): Please consider specifying a lower framerate, a different muxer or -vsync 2
E/mobile-ffmpeg(29135): [mpeg4 @ 0xe68049d0] timebase 1/1000000 not supported by MPEG 4 standard, the maximum admitted value for the timebase denominator is 65535
E/mobile-ffmpeg(29135): Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height
I/mobile-ffmpeg(29135): Conversion failed!
D/flutter-ffmpeg(29135): FFmpeg exited with rc: 1
I/flutter (29135): FFmpeg process exited with rc 1
回答1:
You probably need a slightly different filter:
-filter_complex "[0:v][1:v]concat=n=2:v=1:a=0[out]" -map "[out]"
Actually, you can copy the two input files to your PC, and tune the 'real' ffmpeg parameters using the command line until the result satisfies you. Only after that, and on condition that the expected true input files will be with same characteristics, you can put these parameters into your dart code.
BTW, do you deliberately drop the audio stream here?
回答2:
This was the commandToExecute, which finally worked for me. Hope it helps anyone with a similar issue :)
'-y -i ${_storedVideoOne.path} -i ${_storedVideoTwo.path} -r 24000/1001 -filter_complex \'[0:v:0][0:a:0][1:v:0][1:a:0]concat=n=2:v=1:a=1[out]\' -map \'[out]\' $outputPath'
I then still had to save the final output using this:
GallerySaver.saveVideo(outputPath).then((_) {});
来源:https://stackoverflow.com/questions/62436443/concat-filter-error-initializing-output-stream