Raf*_*ima 5 encoding android android-mediacodec
我正在尝试使用 MediaCodec 从我拥有的一组位图生成 mp4 文件。
经过大量编码和测试后,我注意到互联网上不存在任何示例,也没有在 Android Studio 模拟器上进行任何工作,但它们确实可以在我的两部真实手机(android 7 和 9)中工作...所以我一直只进行测试真正的手机。
经过大量编码和测试后,我得到了一个有效的编码(适用于我的两部手机,但适用于 Android 模拟器)并部署到生产中。
我的网站已经上线几个月了,大约有 150 个日常用户,但其中大约 30% 的用户遇到了我在 Android 模拟器上注意到的同样的崩溃问题。所以这不是模拟器的限制。
E/ACodec:[OMX.google.h264.encoder] configureCodec 返回错误 -38 signalError(omxError 0x80001001,internalError -2147483648) E/MediaCodec:编解码器报告错误 0x80001001,actionCode 0,而处于状态 3 E/MediaCodec:配置失败错误 0x80001001,正在重置...
private static MediaCodecInfo selectCodec(String mimeType) {
int numCodecs = MediaCodecList.getCodecCount();
for (int i = 0; i < numCodecs; i++) {
MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(i);
if (!codecInfo.isEncoder()) {
continue;
}
String[] types = codecInfo.getSupportedTypes();
for (String type : types) {
if (type.equalsIgnoreCase(mimeType)) {
return codecInfo;
}
}
}
return null;
}
MediaCodecInfo codecInfo = EncoderUtils.selectCodec("video/avc");
MediaCodec.createByCodecName(codecInfo.getName()).encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
Run Code Online (Sandbox Code Playgroud)
format有以下键
"color-format" -> {Integer@17131} 21
"i-frame-interval" -> {Integer@17133} 3
"mime" -> "video/avc"
"profile" -> {Integer@17136} 8
"width" -> {Integer@17138} 928
"bitrate-mode" -> {Integer@17140} 0
"bitrate" -> {Integer@17142} 3500000
"language" -> "eng"
"frame-rate" -> {Integer@17146} 12
"max-input-size" -> {Integer@17140} 0
"height" -> {Integer@17149} 1152
Run Code Online (Sandbox Code Playgroud)
然后我得到以下异常:
Non-fatal Exception: android.media.MediaCodec$CodecException: Error 0x80001001
at android.media.MediaCodec.native_configure(MediaCodec.java)
at android.media.MediaCodec.configure(MediaCodec.java:1960)
at android.media.MediaCodec.configure(MediaCodec.java:1889)
at com.tomatedigital.lottogram.util.EncoderUtils.start(EncoderUtils.java:98)
at com.tomatedigital.lottogram.service.LottogramService$3.run(LottogramService.java:329)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
Run Code Online (Sandbox Code Playgroud)
当 logcat 打印时:
I/OMXClient: IOmx service obtained
E/ACodec: [OMX.google.h264.encoder] configureCodec returning error -38
signalError(omxError 0x80001001, internalError -2147483648)
E/MediaCodec: Codec reported err 0x80001001, actionCode 0, while in state 3
E/MediaCodec: configure failed with err 0x80001001, resetting...
I/OMXClient: IOmx service obtained
W/AMessage: failed to deliver message as target handler 7 is gone.
E/ACodec: [OMX.google.h264.encoder] configureCodec returning error -38
signalError(omxError 0x80001001, internalError -2147483648)
E/MediaCodec: Codec reported err 0x80001001, actionCode 0, while in state 3
E/MediaCodec: configure failed with err 0x80001001, resetting...
I/OMXClient: IOmx service obtained
Run Code Online (Sandbox Code Playgroud)
在我能找到的任何地方都没有这样的对 0x80001001 错误的引用。这是什么意思?怎么解决呢?有人知道吗?
| 归档时间: |
|
| 查看次数: |
2516 次 |
| 最近记录: |