Android 硬解码 MediaCodec 遇到的(部分手机绿屏)API21
2017-11-21 16:04
2111 查看
MediaCodec 是android用来做音视频编解码
注意:由于时间有限我这里就不说用法了,只说一些我遇到的上些问题及理解。
老铁们可以多baidu,这里是一个老铁的中文说明,MediaCodec
中文API文档
目前网上的例子大部分是Synchronous Processing using Buffer Arrays (deprecated)这种方式写的demo,<=20 API可以用。
现在5.0以下的手机已经很少了,并且我的应用要求延时小,所以就只支持5.0或以上的手机。
这里网上基本有二个方式,推荐第一种
下面是我用的代码,
public boolean onFrame(byte[] buf, int offset, int length) {
//这里while是为了保证每一帧数据能够送入解码,我之前就用的下面的方式,有时候出现好几帧没有送入解码,
//便出现花屏,部分手机绿屏(华为,honor手机),
//这部分是送入解码
//因为相关参数我也不是很明白,所以就不多说了,以免引起误解决。
while(true){
inputBufferId = mCodec.dequeueInputBuffer(100);
if (inputBufferId >= 0) {
inputBuffer = mCodec.getInputBuffer(inputBufferId);
inputBuffer.clear();
inputBuffer.put(buf, offset, length);
mCodec.queueInputBuffer(inputBufferId, 0, length, mCount
* TIME_INTERNAL, 0);
mCount++;
} else{
continue;
}
//这部分是解码后的处理, dequeueOutputBuffer延时20000是跟据测试来写的,这个好像是看手机硬解的能力,所以要自己测试调整
//如果延时太小了,可能出现解码延时,该帧不会显示。
宁波整形医院http://www.lyxcl.org/
宁波整形美容医院http://www.zuanno.com/
outputBufferId = mCodec.dequeueOutputBuffer(bufferInfo, 20000);
if (outputBufferId >= 0){
mCodec.releaseOutputBuffer(outputBufferId, true);
return true;
} else if (outputBufferId == -1){
Log.e("H264", "AMEDIACODEC__INFO_TRY_AGAIN_LATER");
return false;
}else if (outputBufferId < 0){
return false;
}
}
return true;
}
网上的另一种方式
inputBufferId = mCodec.dequeueInputBuffer(timeoutUs);
if (inputBufferId >= 0) {
inputBuffer = mCodec.getInputBuffer(inputBufferId);
inputBuffer.clear();
inputBuffer.put(buf, offset, length);
mCodec.queueInputBuffer(inputBufferId, 0, length, mCount
* TIME_INTERNAL, 0);
mCount++;
}
outputBufferId = mCodec.dequeueOutputBuffer(bufferInfo, timeoutUs);
while (outputBufferId >= 0) {
mCodec.releaseOutputBuffer(outputBufferId, true);
outputBufferId = mCodec.dequeueOutputBuffer(bufferInfo, timeoutUs);
}
注意:由于时间有限我这里就不说用法了,只说一些我遇到的上些问题及理解。
老铁们可以多baidu,这里是一个老铁的中文说明,MediaCodec
中文API文档
目前网上的例子大部分是Synchronous Processing using Buffer Arrays (deprecated)这种方式写的demo,<=20 API可以用。
现在5.0以下的手机已经很少了,并且我的应用要求延时小,所以就只支持5.0或以上的手机。
这里网上基本有二个方式,推荐第一种
下面是我用的代码,
public boolean onFrame(byte[] buf, int offset, int length) {
//这里while是为了保证每一帧数据能够送入解码,我之前就用的下面的方式,有时候出现好几帧没有送入解码,
//便出现花屏,部分手机绿屏(华为,honor手机),
//这部分是送入解码
//因为相关参数我也不是很明白,所以就不多说了,以免引起误解决。
while(true){
inputBufferId = mCodec.dequeueInputBuffer(100);
if (inputBufferId >= 0) {
inputBuffer = mCodec.getInputBuffer(inputBufferId);
inputBuffer.clear();
inputBuffer.put(buf, offset, length);
mCodec.queueInputBuffer(inputBufferId, 0, length, mCount
* TIME_INTERNAL, 0);
mCount++;
} else{
continue;
}
//这部分是解码后的处理, dequeueOutputBuffer延时20000是跟据测试来写的,这个好像是看手机硬解的能力,所以要自己测试调整
//如果延时太小了,可能出现解码延时,该帧不会显示。
宁波整形医院http://www.lyxcl.org/
宁波整形美容医院http://www.zuanno.com/
outputBufferId = mCodec.dequeueOutputBuffer(bufferInfo, 20000);
if (outputBufferId >= 0){
mCodec.releaseOutputBuffer(outputBufferId, true);
return true;
} else if (outputBufferId == -1){
Log.e("H264", "AMEDIACODEC__INFO_TRY_AGAIN_LATER");
return false;
}else if (outputBufferId < 0){
return false;
}
}
return true;
}
网上的另一种方式
inputBufferId = mCodec.dequeueInputBuffer(timeoutUs);
if (inputBufferId >= 0) {
inputBuffer = mCodec.getInputBuffer(inputBufferId);
inputBuffer.clear();
inputBuffer.put(buf, offset, length);
mCodec.queueInputBuffer(inputBufferId, 0, length, mCount
* TIME_INTERNAL, 0);
mCount++;
}
outputBufferId = mCodec.dequeueOutputBuffer(bufferInfo, timeoutUs);
while (outputBufferId >= 0) {
mCodec.releaseOutputBuffer(outputBufferId, true);
outputBufferId = mCodec.dequeueOutputBuffer(bufferInfo, timeoutUs);
}
相关文章推荐
- Android 硬解码 MediaCodec 遇到的(部分手机绿屏)API21
- Android 硬解码 MediaCodec 遇到的问题
- android新浪微博开发-------授权部分实例+官方Api解析+可能遇到的问题
- Android 用MediaCodec实现视频硬解码
- Android官方ApiDemo中animation部分代码要点整理
- Android 部分8.0手机(eg:华为荣耀V10) 更新下载应用后,不能调用安装的问题
- 使用内部(com.android.internal)和隐藏(@hide)API[第2部分,定制android.jar]
- 使用内部(com.android.internal)和隐藏(@hide)API[第1部分,介绍]
- Android Multimedia框架总结(二十一)MediaCodec中创建到start过程(到jni部分)
- 利用简易Tomcat服务器结合MysqL实现Android手机注册与登录(服务器部分)
- 部分Android手机拍照后照片被旋转的解决方案
- Android SmackAPI使用中遇到的问题
- android照相、相册获取图片剪裁部分手机异常的解决方法
- Android 部分手机adapter的notifyDataSetChanged()无效
- Android多媒体--MediaCodec 中文API文档
- Android开发中遇到的问题(四)——Android中WARNING: Application does not specify an API level requirement!的解决方法
- Android 用MediaCodec实现视频硬解码
- android-support-vXXX.jar 支持包(老版本使用新API) (部分新API做成第三方包) 向前兼容,低版本跑新API (提供低版本没有的新API)
- 部分android手机CCEditBox输入之后键盘输入框不消失得问题
- Android 用MediaCodec实现视频硬解码