日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

解决解码H264视频黑屏问题

發布時間:2025/4/5 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解决解码H264视频黑屏问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

android底層沒任何報錯視頻就是黑屏無法進行解碼。
保證有I幀時進行解碼操作即可

boolean hasI = false;try {int i = msg[4] & 0x1f;if (i == 7) {Log.d(TAG, "dataBack: 收到I幀");hasI = true;}if (hasI) {//解碼mediaCodecUtil.onFrame(msg, 0, msg.length);}} catch (Exception e) {}

解碼用到的工具類

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视频黑屏问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。