解决解码H264视频黑屏问题
生活随笔
收集整理的這篇文章主要介紹了
解决解码H264视频黑屏问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
android底層沒任何報錯視頻就是黑屏無法進行解碼。
保證有I幀時進行解碼操作即可
解碼用到的工具類
import android.media.MediaCodec; import android.media.MediaFormat; import android.util.Log; import android.view.SurfaceHolder;import java.io.IOException; import java.nio.ByteBuffer;/*** Created by sy012 on 18-4-30.* 用于硬件解碼(MediaCodec)H264的工具*/public class MediaCodecUtil {//解碼后顯示的surface及其寬高private SurfaceHolder holder;private int width, height;//解碼器private MediaCodec mCodec;private boolean isFirst = true;// 需要解碼的類型private final static String MIME_TYPE = "video/avc"; // H.264 Advanced Video/*** 初始化解碼器** @param holder 用于顯示視頻的surface* @param width surface寬* @param height surface高*/public MediaCodecUtil(SurfaceHolder holder, int width, int height) {this.holder = holder;this.width = width;this.height = height;}public MediaCodecUtil(SurfaceHolder holder) {this(holder, holder.getSurfaceFrame().width(), holder.getSurfaceFrame().height());}public void startCodec() {if (isFirst) {//第一次打開則初始化解碼器initDecoder();}}private void initDecoder() {try {//根據需要解碼的類型創建解碼器mCodec = MediaCodec.createDecoderByType(MIME_TYPE);} catch (IOException e) {e.printStackTrace();}//初始化MediaFormatMediaFormat mediaFormat = MediaFormat.createVideoFormat(MIME_TYPE, width, height);//配置MediaFormat以及需要顯示的surfacemCodec.configure(mediaFormat, holder.getSurface(), null, 0);//開始解碼mCodec.start();isFirst = false;}public boolean onFrame(byte[] buf, int offset, int length) {if (mCodec == null) {return false;}try {// 獲取輸入buffer indexByteBuffer[] inputBuffers = mCodec.getInputBuffers();//-1表示一直等待;0表示不等待;其他大于0的參數表示等待毫秒數int inputBufferIndex = mCodec.dequeueInputBuffer(-1);if (inputBufferIndex >= 0) {ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];//清空bufferinputBuffer.clear();//put需要解碼的數據inputBuffer.put(buf, offset, length);//解碼mCodec.queueInputBuffer(inputBufferIndex, 0, length, 0, 0);} else {com.orhanobut.logger.Logger.w("onFrame");return false;}// 獲取輸出buffer indexMediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();int outputBufferIndex = mCodec.dequeueOutputBuffer(bufferInfo, 100); // Logger.w(outputBufferIndex+"");//循環解碼,直到數據全部解碼完成while (outputBufferIndex >= 0) {//true : 將解碼的數據顯示到surface上mCodec.releaseOutputBuffer(outputBufferIndex, true);outputBufferIndex = mCodec.dequeueOutputBuffer(bufferInfo, 0);}} catch (Exception e) {e.printStackTrace();}return true;}/*** 停止解碼,釋放解碼器*/public void stopCodec() {try {if (mCodec != null) {mCodec.stop();mCodec.release();mCodec = null;}isFirst = true;} catch (Exception e) {e.printStackTrace();mCodec = null;}}總結
以上是生活随笔為你收集整理的解决解码H264视频黑屏问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu 安装JDK8
- 下一篇: 江南百景图自动刷水井,附带拼图教程