ffmpeg for android,编码h264的内存不足

时间:2018-06-14 23:34:42

标签: android encoding ffmpeg android-ffmpeg libx264

我在Android上使用ffmpeg进行视频时出现了一个奇怪的错误

Failed to inject frame into filter network: Out of memory

Althoug是一个非常客观的错误,我相信这是一些"通用消息"另一个问题,因为我用于测试的视频是17MB,长度不到11秒,我已经成功测试了大于200MB且超过5分钟的视频

在手机上录制的任何视频垂直视频都会出现此问题(视频已录制并在我的手机上正常播放但我无法重新编码...其他视频h264在同一手机上编码正常)

这是ffmpeg输出

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 ===================

我使用-v 9 -loglevel 99重新运行命令并将日志文件粘贴到:

https://pastebin.com/ihawsPvZ

如果有人在ffmpeg拥有真正优秀的专业知识,我会非常感谢帮助

=====================更新2 =================

我做了更多的测试,只有当我用手机垂直录制视频时才会出现问题(垂直工作的其他视频和手机水平的视频也可以工作)

==================更新3 ==================== 我用

检测到问题发生在任何视频上
Metadata:
      rotate          : 90 (or any value)

有人建议使用-noautorotate作为解决方法并且工作正常,但这意味着其他许多并发症:

- 如果我决定对视频应用任何过滤器,它将应用于水平版本,但视频将在垂直方向播放,产生完全不同的效果

ex:https://i.stack.imgur.com/R3jXJ.jpg(在此照片中,drawtext过滤器应放置在带有水平文本的底线,但由于ffmpeg无法处理定位,因此它会在运行时错过放置并旋转,从而生成此垂直消息)

- 我检查过,如果我在设置-metadata:s:v:0 rotate=时设置ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate= output.mp4,则无效:

ffmpeg -i input.mp4 -c:v libx264 -metadata:s:v:0 rotate= output.mp4
将删除旋转元数据并生成非旋转视频

BUT
{{1}}
将保持元数据和制作的视频将被旋转播放(这种行为也在ffmpeg网站上提供的官方ffmpeg 4.0二进制文件中注意到了)

我仍然期待更好的解决方案,感谢帮助

0 个答案:

没有答案