【问题标题】:ffmpeg for android, out of memory on decoding rotate mp4 file with openh264ffmpeg for android,在使用 openh264 解码旋转 mp4 文件时内存不足
【发布时间】:2026-01-25 05:40:02
【问题描述】:

版本

  • ffmpeg:4.0.2
  • openh264: 1.8.0

问题

我尝试修剪 .mp4 文件,其中 metadata 信息包含旋转信息,但我因错误信息而失败。

文件流信息:

  Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2018-10-09T09:40:53.000000Z
    location        : +39.8983+116.4145/
    location-eng    : +39.8983+116.4145/
    com.android.version: 6.0
  Duration: 00:00:10.56, start: 0.000000, bitrate: 8671 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 8563 kb/s, SAR 1:1 DAR 16:9, 30.01 fps, 30 tbr, 90k tbn, 180k tbc (default)
    Metadata:
      rotate          : 180
      creation_time   : 2018-10-09T09:40:53.000000Z
      handler_name    : VideoHandle
    Side data:
      displaymatrix: rotation of -180.00 degrees
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      creation_time   : 2018-10-09T09:40:53.000000Z
      handler_name    : SoundHandle

ffmpeg 命令

ffmpeg -y -i 1.mp4 -threads 4 -b:v 2000k -vcodec libopenh264 -acodec copy -ss 0 -t 3 -f mp4 -movflags faststart -strict -2 ./output.mp4

结果

Error reinitializing filters!
Failed to inject frame into filter network: Out of memory
Error while processing the decoded data for stream #0:0

然后我找到了这个答案:ffmpeg-for-android-out-of-memory,在我将-noautorotate命令添加到我的cmd后,视频修剪成功。

如果我用-vcodec copy代替-vcodec libopenh264,结果也是ok的,不知道libopenh264用ffmpeg的autorotate函数解码时是否有bug。

我使用-metadata:s:v:0命令从元数据中擦除视频的旋转信息,新视频可以使用原始cmd成功修剪:(

【问题讨论】:

  • 显示失败命令的完整日志。

标签: ffmpeg android-ffmpeg


【解决方案1】:

错误信息具有误导性。由于您使用--disable-filters,您需要手动启用 hflip/vflip 过滤器:

--enable-filter=aresample,crop,hflip,scale,transpose,vflip

在这种情况下会自动启用一些过滤器(例如格式过滤器)。

【讨论】:

  • @daque 这个日志似乎和以前没有什么不同。您需要使用我在答案中列出的选项重新编译ffmpeg
  • 这对我有用 :) 谢谢你。我用hflipvflip过滤器重新编译ffmpeg,然后可以在没有--noautorotate的情况下成功修剪视频。我想知道如果我的命令有误,为什么 command 需要 40 seconds 修剪 15 senconds 视频?
  • @daque 1) 视频编码是处理器密集型的。 2)您在处理器比典型台式机慢的手机上进行此操作。 3) openh264 可能没有像 x264 那样优化。 4) 我不了解您在 Android 上可能拥有的硬件编码选项,但值得研究。