android 的 ffmpeg,使用 openh264 解码旋转 mp4 文件时内存不足
ffmpeg for android, out of memory on decoding rotate mp4 file with openh264
版本
- ffmpeg : 4.0.2
- openh264: 1.8.0
问题
我尝试 trim 一个 .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,在我向我的 cmd 添加 -noautorotate
命令后,视频 trimmed 成功。
如果我用-vcodec copy
代替-vcodec libopenh264
,结果也是可以的,我想知道libopenh264
用ffmpeg的自动旋转功能解码时是否有错误。
我用 -metadata:s:v:0
命令从元数据中擦除视频的旋转信息,新视频可以 trim 使用 origin cmd 成功:(
错误消息具有误导性。由于您使用 --disable-filters
,您需要手动启用 hflip/vflip 过滤器:
--enable-filter=aresample,crop,hflip,scale,transpose,vflip
在这种情况下,某些过滤器(例如格式过滤器)将自动启用。
版本
- ffmpeg : 4.0.2
- openh264: 1.8.0
问题
我尝试 trim 一个 .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,在我向我的 cmd 添加 -noautorotate
命令后,视频 trimmed 成功。
如果我用-vcodec copy
代替-vcodec libopenh264
,结果也是可以的,我想知道libopenh264
用ffmpeg的自动旋转功能解码时是否有错误。
我用 -metadata:s:v:0
命令从元数据中擦除视频的旋转信息,新视频可以 trim 使用 origin cmd 成功:(
错误消息具有误导性。由于您使用 --disable-filters
,您需要手动启用 hflip/vflip 过滤器:
--enable-filter=aresample,crop,hflip,scale,transpose,vflip
在这种情况下,某些过滤器(例如格式过滤器)将自动启用。