代码编织梦想

播放HLS时,部分TS分片的sps排列是:
0 0 0 1 9 240 0 0 0 1 103 。。。 0 0 0 1 104。。。
其对应的内容是:

  1. 0 0 0 1 9 240 :表示AUD
  2. 接着的 0 0 0 1 :表示 start code
  3. 接着的103 :表示sps类型
  4. 接着的就是sps的数据
  5. 最后的0 0 0 1 104 :104表示是pps数据
  6. 接着的就是pps的数据

这里针对这种情况做了处理,提取出其中的sps数据给到MediaCodec,避免MediaCodec初始化失败。

需要这种视频链接的,我可以发出来,不过视频链接只有24小时有效。

issues如下:

  1. android k0.8.4 某些手机播放视频有声音,无画面(即透明,非黑屏) #4177
  2. 请教下Android播放视频只有声音没有画面? #3544

 

  
ijkmedia/ijkplayer/android/pipeline/ffpipenode_android_mediacodec_vdec.c
@@ -245,24 +245,23 @@ static int recreate_format_l(JNIEnv *env, IJKFF_Pipenode *node)
            SDL_AMediaFormat_setBuffer(opaque->input_aformat, "csd-0", convert_buffer, esds_size);
            free(convert_buffer);
        } else {
            //先只考虑h264的情况,H265这种情况我也没见过
            if(opaque->avctx->codec_id == AV_CODEC_ID_H264  && opaque->avctx->extradata_size > 6){
                //参考 https://blog.csdn.net/chinabinlang/article/details/78181110
                //参考 https://blog.csdn.net/dxpqxb/article/details/7631644
                //这种视频是:AUD+SPS+PPS的情况
           if(opaque->codecpar->codec_id == AV_CODEC_ID_H264  && opaque->codecpar->extradata_size > 6){
                // https://blog.csdn.net/chinabinlang/article/details/78181110
                // https://blog.csdn.net/dxpqxb/article/details/7631644
                // AUD+SPS+PPS的情况
                // 103 代表sps
                // 104 代表pps
                int spsIndex = -1;
                int ppsIndex = -1;
                if(opaque->avctx->extradata[0] == 0 && opaque->avctx->extradata[1] == 0 && opaque->avctx->extradata[2] == 0
                   && opaque->avctx->extradata[3] == 1 && opaque->avctx->extradata[4] == 9 && opaque->avctx->extradata[5] == 240){
                if(opaque->codecpar->extradata[0] == 0 && opaque->codecpar->extradata[1] == 0 && opaque->codecpar->extradata[2] == 0
                   && opaque->codecpar->extradata[3] == 1 && opaque->codecpar->extradata[4] == 9 && opaque->codecpar->extradata[5] == 240){
                    for(int i=6;i<opaque->avctx->extradata_size-4;i++){
                        if(opaque->avctx->extradata[i] == 0 && opaque->avctx->extradata[i+1] == 0 && opaque->avctx->extradata[i+2] == 0
                           && opaque->avctx->extradata[i+3] == 1){
                            if(opaque->avctx->extradata[i+4] == 103){
                        if(opaque->codecpar->extradata[i] == 0 && opaque->codecpar->extradata[i+1] == 0 && opaque->codecpar->extradata[i+2] == 0
                           && opaque->codecpar->extradata[i+3] == 1){
                            if(opaque->codecpar->extradata[i+4] == 103){
                                spsIndex = i;
                                ALOGE("AMediaFormat find sps = %d",spsIndex);
                            }else if(opaque->avctx->extradata[i+4] == 104){
                            }else if(opaque->codecpar->extradata[i+4] == 104){
                                ppsIndex = i;
                                ALOGE("AMediaFormat find pps = %d",ppsIndex);
                            }
@@ -275,11 +274,11 @@ static int recreate_format_l(JNIEnv *env, IJKFF_Pipenode *node)
                    if(ppsIndex > 0 && spsIndex < ppsIndex){
                        length = ppsIndex-spsIndex;
                    }else{
                        length = opaque->avctx->extradata_size-spsIndex;
                        length = opaque->codecpar->extradata_size-spsIndex;
                    }

                    uint8_t *convert_buffer = (uint8_t *)calloc(1, length);
                    memcpy( convert_buffer, opaque->avctx->extradata+spsIndex, length);
                    memcpy( convert_buffer, opaque->codecpar->extradata+spsIndex, length);

                    SDL_AMediaFormat_setBuffer(opaque->input_aformat, "csd-0", convert_buffer, length);
                    free(convert_buffer);

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/andylao62/article/details/127158370

android mediacodec编解码与rtp传输_-无-怨-无-悔-的博客-爱代码爱编程

一、目的 本文的围绕Android的MediaCodec编解码进行展开,将摄像头采集的视频数据编码成H264数据,然后封装成RTP协议,利用UDP进行传输;接收端接收到RTP数据后进行解包成H264数据,然后交给MediaCodec进行解码显示,结构图如下: 二、MediaCodec编码   import java.nio.ByteBuffer

c++编程-2:使用android mediacodec 硬解码延时问题分析_椰果奶茶加冰的博客-爱代码爱编程

      最近做项目用到Android native层的MediaCodec的接口对H264进行解码,通过在解码前和解码后加打印日志,发现解码耗时200多ms,和IOS的解码耗时10ms相比实在是延时好大。后来研究了两周也没能解决延时问题,很悲惨……不过还是将这过程中分析的思路记录下来,说不定以后万一灵感来了就解决了呢。      起初在https:/

mediacodec配置h265解码_htjoy的博客-爱代码爱编程

参考ffmpeg解析vps,sps和pps: 在ffmpeg中可以参考下面的函数是如何解析extradata得到vps,sps,pps的: hevc_decode_extradata() AVCodecContext中 extradata 的 parse aligned(8) class HEVCDecoderConfigurationRecord {

【转】使用android mediacodec 硬解码延时问题分析_小二人的博客-爱代码爱编程_android mediacodec 延迟

      最近做项目用到Android native层的MediaCodec的接口对H264进行解码,通过在解码前和解码后加打印日志,发现解码耗时200多ms,和IOS的解码耗时10ms相比实在是延时好大。后来研究了两周也没能解决延时问题,很悲惨……不过还是将这过程中分析的思路记录下来,说不定以后万一灵感来了就解决了呢。      起初在https:/

使用android mediacodec 硬解码延时问题分析_eastbell的博客-爱代码爱编程_android mediacodec 延迟

使用Android MediaCodec 硬解码延时问题分析 2018年03月29日 09:30:38 珠雨妮儿 阅读数:2492 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n

android ndk mediacodec在ijkplayer中的实践 (media/ndkmediacodec.h)_ljh081231的博客-爱代码爱编程

Android NDK MediaCodec在ijkplayer中的实践  金山视频云 关注  0.9 2018.02.08 15:25* 字数 1449 阅读 3124评论 2喜欢 15 从API 21(Android 5.0)开始Android提供C层的NDK MediaCodec的接口。 Java MediaCodec是对NDK MediaC

Android MediaCodec编码后解析出H264/H265中vps sps pps帧-爱代码爱编程

文章目录 解析的两种方式MediaCodec异步编码具体过程如下:1.配置Camera回调,获取preview的原始数据2.配置encoder和MediaFormat3.开启encoder4.获取到preview数据,并送如编码器5.mediaCodecCallback解析出编码后的vps sps vps帧,两种方式6.解析每个帧的值7.工具byt

Android MediaCodec+OpenGL视频编解码实践笔记-爱代码爱编程

目录 Android MediaCodec+OpenGL视频编解码实践笔记 1.Demo提供的测试功能 2.视频编码与相机本地预览渲染 2.1 初始化编码器与OpenGL环境 2.2 本地预览渲染与编码 3.视频编码与相机本地预览渲染 4.踩坑记录 5.总结   Android MediaCodec+OpenGL视频编解码实践笔记 本

利用MediaCodec 获取视频的sps pps 和视频数据-爱代码爱编程

 获取SPS、PPS ByteBuffer spsb = videoEncodec.getOutputFormat().getByteBuffer("csd-0"); byte[] sps = new byte[spsb.remaining()]; spsb.get(sps, 0, sps.length); ByteBuffer ppsb = vide

NDK中使用mediacodec解码h264-爱代码爱编程

《Ndk中使用Mediacode解码》 《android mediacodec 编码demo(java)》 《NDK中使用mediacodec编码h264》 《Android native 层使用opengl渲染YUV420p和NV12》 《android 使用NativeWindow渲染RGB视频》 《opengl 叠加显示文字》 《android st

关于使用mediacodec绿边问题解决方法尝试-爱代码爱编程

在上一篇文章中提到过关于对于某些机型的安卓手机使用mediacodec时会出现绿条,需要解决绿条的方法或许有很多,同时在网上很多文章都是讲解在解码端来解决这个问题的,在解码端处理YUV数据来实现裁剪来将绿条去掉。 当然本文讲的方法是跟之前网络上不同的,本文的方法是从发送数据端的数据进行处理的,即直接处理源数据的分辨率来适配接收端的mediacodec分辨

获取MediaCodec的SPS和PPS-爱代码爱编程

一、SPS和PPS文档说明二、NALU类型三、获取SPS、PPS两种方式 1、同步方式 ByteBuffer spsb = videoEncodec.getOutputFormat().getByteBuffer("csd-0"); byte[] sps = new byte[spsb.remaining()]; spsb.get(sps, 0, sps

ijkplayer视频解码播放架构分析-爱代码爱编程

ijkplayer是一款跨平台播放器,支持Android与iOS播放,视频渲染使用OpenGL ES。Android端视频解码可以用mediacodec,而iOS端视频解码用VideoToolbox。而软解部分使用FFmpeg的avcodec。 一、iOS视频解码播放 采用pipeline形式创建视频解码器,整体流水线如下:   1、创建IjkMe

【音视频开发(一)】---MediaCodec NDK解码-爱代码爱编程

初始化解码器: void VideoDecoder::Init(int width, int height, int buffNumber) { DM_NATIVE_PRINT("VideoDecoder::Init Start... %dx%d", width, height); imageW = width; image