Applying filter complex fails with something relat

2019-09-03 19:00发布

问题:

I finally managed to build ffmpeg as detailed in here: https://enoent.fr/blog/2014/06/20/compile-ffmpeg-for-android/ and in the end, I have a ffmpeg library which accepts command arguments.

I am trying to apply a watermark image over the video so for it I am using preparing this ffmpeg command:

ffmpeg -i input.avi -i logo.png -filter_complex 'overlay=10:main_h-overlay_h-10' output.avi

I have first tried it on windows using ffmpeg.exe and the result was as expected.

I have tried it on android using the compiled android and the output is as follows:

09-17 22:03:34.455: I/Videokit(18419): Loading native library compiled at 22:33:10 Sep 15 2014
09-17 22:03:34.455: I/Videokit(18419): Option: ffmpeg
09-17 22:03:34.455: I/Videokit(18419): Option: -loglevel
09-17 22:03:34.455: I/Videokit(18419): Option: debug
09-17 22:03:34.455: I/Videokit(18419): Option: -i
09-17 22:03:34.455: I/Videokit(18419): Option: /storage/emulated/0/vid.mp4
09-17 22:03:34.455: I/Videokit(18419): Option: -i
09-17 22:03:34.455: I/Videokit(18419): Option: /storage/emulated/0/logo.png
09-17 22:03:34.455: I/Videokit(18419): Option: -qscale:v
09-17 22:03:34.455: I/Videokit(18419): Option: 1
09-17 22:03:34.455: I/Videokit(18419): Option: -filter_complex
09-17 22:03:34.455: I/Videokit(18419): Option: overlay=10:main_h-overlay_h-10
09-17 22:03:34.455: I/Videokit(18419): Option: /storage/emulated/0/outVid.mp4
09-17 22:03:34.455: I/Videokit(18419): Running main
09-17 22:03:34.463: D/Videokit(18419): Splitting the commandline.
09-17 22:03:34.463: D/Videokit(18419): Reading option '-loglevel' ...
09-17 22:03:34.463: D/Videokit(18419):  matched as option 'loglevel' (set logging level) with argument 'debug'.
09-17 22:03:34.463: D/Videokit(18419): Reading option '-i' ...
09-17 22:03:34.463: D/Videokit(18419):  matched as input file with argument '/storage/emulated/0/vid.mp4'.
09-17 22:03:34.463: D/Videokit(18419): Reading option '-i' ...
09-17 22:03:34.463: D/Videokit(18419):  matched as input file with argument '/storage/emulated/0/logo.png'.
09-17 22:03:34.463: D/Videokit(18419): Reading option '-qscale:v' ...
09-17 22:03:34.463: D/Videokit(18419):  matched as option 'qscale' (use fixed quality scale (VBR)) with argument '1'.
09-17 22:03:34.463: D/Videokit(18419): Reading option '-filter_complex' ...
09-17 22:03:34.463: D/Videokit(18419):  matched as option 'filter_complex' (create a complex filtergraph) with argument 'overlay=10:main_h-overlay_h-10'.
09-17 22:03:34.463: D/Videokit(18419): Reading option '/storage/emulated/0/outVid.mp4' ...
09-17 22:03:34.463: D/Videokit(18419):  matched as output file.
09-17 22:03:34.463: D/Videokit(18419): Finished splitting the commandline.
09-17 22:03:34.463: D/Videokit(18419): Parsing a group of options: global .
09-17 22:03:34.463: D/Videokit(18419): Applying option loglevel (set logging level) with argument debug.
09-17 22:03:34.463: D/Videokit(18419): Applying option filter_complex (create a complex filtergraph) with argument overlay=10:main_h-overlay_h-10.
09-17 22:03:34.463: D/Videokit(18419): Successfully parsed a group of options.
09-17 22:03:34.463: D/Videokit(18419): Parsing a group of options: input file /storage/emulated/0/vid.mp4.
09-17 22:03:34.463: D/Videokit(18419): Successfully parsed a group of options.
09-17 22:03:34.463: D/Videokit(18419): Opening an input file: /storage/emulated/0/vid.mp4.
09-17 22:03:34.612: D/Videokit(18419): Successfully opened the file.
09-17 22:03:34.612: D/Videokit(18419): Parsing a group of options: input file /storage/emulated/0/logo.png.
09-17 22:03:34.612: D/Videokit(18419): Successfully parsed a group of options.
09-17 22:03:34.612: D/Videokit(18419): Opening an input file: /storage/emulated/0/logo.png.
09-17 22:03:34.620: D/Videokit(18419): Successfully opened the file.
09-17 22:03:34.620: D/Videokit(18419): Parsing a group of options: output file /storage/emulated/0/outVid.mp4.
09-17 22:03:34.620: D/Videokit(18419): Applying option qscale:v (use fixed quality scale (VBR)) with argument 1.
09-17 22:03:34.620: D/Videokit(18419): Successfully parsed a group of options.
09-17 22:03:34.620: D/Videokit(18419): Opening an output file: /storage/emulated/0/outVid.mp4.
09-17 22:03:34.627: D/Videokit(18419): Successfully opened the file.
09-17 22:03:34.643: I/Videokit(18419): Conversion failed!
09-17 22:03:34.643: I/Videokit(18419): Stream mapping:
09-17 22:03:34.643: E/Videokit(18419): Error while opening encoder for output stream #0:1 - maybe incorrect parameters such as bit_rate, rate, width or height

The problem is Error while opening encoder for output stream #0:1 - maybe incorrect parameters such as bit_rate, rate, width or height and this is somehow related to audio of the file. I have removed the audio and I get no error.

ffmpeg -i vid.mp4 returns this:

Command line:
ffmpeg -i vid.mp4 -report
ffmpeg version N-66278-g91459bd Copyright (c) 2000-2014 the FFmpeg developers
  built on Sep 14 2014 22:05:07 with gcc 4.8.3 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-decklink --enable-zlib
  libavutil      54.  7.100 / 54.  7.100
  libavcodec     56.  1.100 / 56.  1.100
  libavformat    56.  4.101 / 56.  4.101
  libavdevice    56.  0.100 / 56.  0.100
  libavfilter     5.  1.100 /  5.  1.100
  libswscale      3.  0.100 /  3.  0.100
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  0.100 / 53.  0.100
Splitting the commandline.
Reading option '-i' ... matched as input file with argument 'vid.mp4'.
Reading option '-report' ... matched as option 'report' (generate a report) with argument '1'.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option report (generate a report) with argument 1.
Successfully parsed a group of options.
Parsing a group of options: input file vid.mp4.
Successfully parsed a group of options.
Opening an input file: vid.mp4.
[mov,mp4,m4a,3gp,3g2,mj2 @ 040e38c0] Format mov,mp4,m4a,3gp,3g2,mj2 probed with size=2048 and score=100
[mov,mp4,m4a,3gp,3g2,mj2 @ 040e38c0] ISO: File Type Major Brand: isom
[mov,mp4,m4a,3gp,3g2,mj2 @ 040e38c0] Before avformat_find_stream_info() pos: 19279 bytes read:32768 seeks:0
[mov,mp4,m4a,3gp,3g2,mj2 @ 040e38c0] All info found
[mov,mp4,m4a,3gp,3g2,mj2 @ 040e38c0] After avformat_find_stream_info() pos: 41952 bytes read:65536 seeks:0 frames:2
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'vid.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.19.104
  Duration: 00:00:14.58, start: 0.023222, bitrate: 1250 kb/s
    Stream #0:0(und), 1, 1/11988: Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 640x640 [SAR 1:1 DAR 1:1], 1099 kb/s, 29.97 fps, 29.97 tbr, 11988 tbn, 59.94 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und), 1, 1/44100: Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 97 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
    Stream #0:2(eng), 0, 1/90000: Data: none (rtp  / 0x20707472), 39 kb/s
    Metadata:
      handler_name    : HintHandler
    Stream #0:3(eng), 0, 1/44100: Data: none (rtp  / 0x20707472), 8 kb/s
    Metadata:
      handler_name    : HintHandler
Successfully opened the file.
At least one output file must be specified
[AVIOContext @ 040e3f40] Statistics: 65536 bytes read, 0 seeks

回答1:

ffmpeg has a native AAC encoder (-c:a aac), but it is considered experimental, so an additional option is required: -strict experimental (or -strict -2, same thing different name).

This is not the best encoder supported by ffmpeg, but it is not the worst either. If in doubt just provide it enough bitrate until it sounds good enough. For more info see the FFmpeg AAC Audio Encoding Guide.