ffmpeg for android, out of memory on encoding h264

与世无争的帅哥 提交于 2019-12-14 03:59:44

问题


I'm getting an weird error when enconding a video with ffmpeg on android

Failed to inject frame into filter network: Out of memory

Althoug is a pretty objective error, I do believe this is some "generic message" for another problem, because the video I used for testing is 17MB and less than 11 seconds length and I've sucessfully tested with videos bigger than 200MB and longer than 5min

This problem happens to any video vertical videos recorded on my phone (the videos were recorded and play fine on my phone but i cant reencode them... other video h264 were encoded fine on same phone)

this is ffmpeg output

ffmpeg version 4.0 Copyright (c) 2000-2018 the FFmpeg developers
  built with Android (4691093 based on r316199) clang version 6.0.2 (https://android.googlesource.com/toolchain/clang 183abd29fc496f55536e7d904e0abae47888fc7f) (https://android.googlesource.com/toolchain/llvm 34361f192e41ed6e4e8f9aca80a4ea7e9856f327) (based on LLVM 6.0.2svn)
  configuration: --prefix=/home/rafa/Desktop/m4/build --target-os=android --arch=i686 --cpu=i686 --cross-prefix=/home/rafa/Desktop/m4/ndk/toolchain/i686/bin/i686-linux-android- --enable-cross-compile --cc=/home/rafa/Desktop/m4/ndk/toolchain/i686/bin/clang --cxx=/home/rafa/Desktop/m4/ndk/toolchain/i686/bin/clang++ --pkg-config=/usr/bin/pkg-config --pkg-config-flags=--static --enable-pic --enable-gpl --enable-nonfree --enable-static --disable-shared --enable-ffmpeg --disable-ffplay --disable-ffprobe --disable-doc --disable-devices --enable-libx264 --enable-libfdk-aac --enable-bsf=aac_adtstoasc --disable-asm
  libavutil      56. 14.100 / 56. 14.100
  libavcodec     58. 18.100 / 58. 18.100
  libavformat    58. 12.100 / 58. 12.100
  libavdevice    58.  3.100 / 58.  3.100
  libavfilter     7. 16.100 /  7. 16.100
  libswscale      5.  1.100 /  5.  1.100
  libswresample   3.  1.100 /  3.  1.100
  libpostproc    55.  1.100 / 55.  1.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/data/data/com.tomatedigital.toolsforinstagram/qqq.mp4':
  Metadata:  
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2018-06-09T04:28:55.000000Z
    location        : -08.0638-034.8723/
    location-eng    : -08.0638-034.8723/
    com.android.version: 7.0
  Duration: 00:00:09.06, start: 0.000000, bitrate: 17349 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080, 17088 kb/s, SAR 1:1 DAR 16:9, 30.04 fps, 30 tbr, 90k tbn, 180k tbc (default)
    Metadata:
      rotate          : 90
      creation_time   : 2018-06-09T04:28:55.000000Z
      handler_name    : VideoHandle
    Side data:
      displaymatrix: rotation of -90.00 degrees
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 255 kb/s (default)
    Metadata:
      creation_time   : 2018-06-09T04:28:55.000000Z
      handler_name    : SoundHandle
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
Error reinitializing filters!
Failed to inject frame into filter network: Out of memory
Error while processing the decoded data for stream #0:0
Conversion failed!

=====================UPDATE===================

I re-run the command with -v 9 -loglevel 99 and got paste the log file at:

https://pastebin.com/ihawsPvZ

If someone have real good expertise at ffmpeg i would apreciate very much the help

=====================UPDATE 2=================

I made more tests and the problem happens only when i record the video with my phone at vertical (other videos in vertical work and videos from my phone in horizontal also work)

==================UPDATE 3==================== I detected the problem happens to ANY video with the

Metadata:
      rotate          : 90 (or any value)

It was suggested to use -noautorotate as workaround and it WORKDED, but this implies in tons of other complications ex:

-if i decide to apply any filter to the video, it will be applied to the horizontal version but the video will be played at vertical producing a totally different effect

ex: https://i.stack.imgur.com/R3jXJ.jpg (at this photo the drawtext filter should be placed at bottom line with horizontal text, but as ffmpeg can't handle the orientation it is missplaced and rotated at runtime producing this vertical message)

-I checked and if I set -metadata:s:v:0 rotate= while enconding it has no effect ex:

ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate= output.mp4
will remove the rotate metadata and produce a non rotated video

BUT
ffmpeg -i input.mp4 -c:v libx264 -metadata:s:v:0 rotate= output.mp4
will keep the metadata and the produced video will be played rotated (this behavior was also noticed on the official ffmpeg 4.0 binaries for windows available at ffmpeg website)

I'M STILL LOOKING FOR A BETTER SOLUTION, THANKS FOR THE HELP

来源:https://stackoverflow.com/questions/50867307/ffmpeg-for-android-out-of-memory-on-encoding-h264

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!