Android获取 H264视频流中的SPS和PPS

news2025/1/22 9:16:11

代码其实很简单,主要是要知道H264帧数据结构。分析H264码流结构的文章一大把,自己网上搜索一下就知道了。
在这里插入图片描述

背景:

h264+aac封装mp4格式的时候,需要获取视频流的sps,pps。

封装mp4文件格式的大体方案
使用 MediaExtractor 和 MediaMuxer API 解析和封装 mp4 文件(硬解码的方式) (纯java)
使用MP4v2将H264/H265码流以及AAC音频封装成MP4格式(软解码的方式)(JNI+C)
使用FFmpeg将H264/H265码流以及AAC音频封装成MP4格式(软解码的方式)(JNI+C)

“csd-0” 和 “csd-1” 是什么,对于 H264 视频的话,它对应的是 sps 和 pps,对于 AAC 音频的话,对应的是 ADTS,做音视频开发的人应该都知道,它一般存在于编码器生成的 IDR 帧之中。

创建并配置 codec。配置 codec 时,若手动创建 MediaFormat 对象的话,一定要记得设置 “csd-0” 和 “csd-1” 这两个参数。 “csd-0” 和 “csd-1” 这两个参数一定要和接收到的帧对应上。

   /**
    * 判断I针中有没有sps pps
    * @param type  0==264  1==265
    * @param data
    * @return
    */
   public static boolean ISIFrameData(int type, byte[] data) {
      int nalType;
      if (type == 0) {
         int FF_H264_SPS_NAL = 7;
         int FF_H264_PPS_NAL = 8;
         nalType = data[4] & 0x1f;
         XLog.e("","h264 nalType=== "+nalType);
         if (FF_H264_SPS_NAL == nalType ||
                 FF_H264_PPS_NAL == nalType
         ) {
            return true;
         }
      } else  if (type == 1){
         int FF_HEVC_VPS_NAL = 32;
         int FF_HEVC_PPS_NAL = 34;
         int FF_HEVC_SPS_NAL = 33;
         nalType = (data[4] & 0x7e) >> 1;
         XLog.e("","h265 nalType=== "+nalType);
         if (FF_HEVC_VPS_NAL == nalType ||
                 FF_HEVC_PPS_NAL == nalType ||
                 FF_HEVC_SPS_NAL == nalType){
            return true;
         }
      }
      return false;
   }



  /**
    * 获取I帧里面的 sps pps 信息
    * @param type  0==264  1==265
    * @param frame  帧数据
    * @return
    */
   public static List<byte []> getPPSByKeyFrameData(int type , byte[] frame){
      Map<Integer,Integer> map=new HashMap<>();
      int save_x=0;
      List<byte[]> list=new ArrayList<>(2);
      byte[]sps,pps;
      if(type==0){//h264
         int nalType=frame[4]&0x1f;//判断I帧,然后根据具体情况获取sps,pps
         if(nalType==7){
            //[Start Code]:Start Code 用于标示这是一个NALU 单元的开始(也称分隔符),必须是”00 00 00 01” 或”00 00 01”。
            //关键帧是00 00 00 01
            for (int i = 0; i < frame.length-3; i++) {
               if(frame[i]==0&&frame[i+1]==0&&frame[i+2]==0&&frame[i+3]==1){
                   map.put(save_x,i);
                   save_x++;
               }
            }
            int spsLength=map.get(1)-map.get(0)-4;
            int spsOffset=map.get(0)+3;
            sps=new byte[spsLength];
            System.arraycopy(frame,spsOffset,sps,0,spsLength);

            int ppsLength=map.get(2)-map.get(1)-4;
            int ppsOffset=map.get(1)+3;
            pps=new byte[ppsLength];
            System.arraycopy(frame,ppsOffset,pps,0,ppsLength);

            list.add(sps);
            list.add(pps);
         }
      }
      return list;
   }



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/991015.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python实现机器学习(上)— 基础知识介绍及环境部署

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本门课程将介绍人工智能相关概念&#xff0c;重点讲解机器学习原理机器基本算法&#xff08;监督学习及非监督学习&#xff09;。使用python&#xff0c;结合sklearn、jupyter-notebook进行编程&#xff0c;介绍iris、匹马…

【Mysql系列】(二)日志系统:一条更新语句是如何执行的

有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top 这篇文章是从Github ReadMe拷贝的&#xff0c;内容实践下载是没问题的&#xff0c;能够正常发送短信&#xff0c;而且也不需要服务器&#xff0c;本地…

语言基础篇14——Python源文件组织结构,模块与包、命名空间与作用域的奥秘

源文件组织结构 模块与包 模块&#xff0c;module 一个文件&#xff0c;包含Python源码&#xff0c;以.py为后缀 包&#xff0c;package 结构化模块&#xff0c;一个文件夹&#xff0c;包含__init__.py文件、若干.py文件和若干文件夹 module对象 模块和包被导入后为modu…

保姆级-微信小程序开发教程

一&#xff0c;注册微信小程序 如果你还没有微信公众平台的账号&#xff0c;请先进入微信公众平台首页&#xff0c;点击 “立即注册” 按钮进行注册。注册的账号类型可以是订阅号、服务号、小程序以及企业微信&#xff0c;我们选择 “小程序” 即可。 接着填写账号信息&#x…

洗衣洗鞋小程序干洗店洗衣店上门取衣门店管理系统开发定制

校园洗衣洗鞋软件是一款非常优质的校园洗护服务软件&#xff0c;软件功能非常强大&#xff0c;学生们可以通过软件预约洗衣服务&#xff0c;支持上门取送&#xff0c;还能够浏览洗衣产品商城&#xff0c;操作非常便捷&#xff0c;感兴趣的朋友快来体验吧&#xff01; 后台管理…

开发板插入sd/tf卡后自动挂载

测试平台-hisi-dv500 要在Linux系统上实现TF卡&#xff08;Micro SD卡&#xff09;插入后自动挂载&#xff0c;类似于SD卡/TF卡插入也会触发内核事件,你可以使用udev工具来监控并处理这些事件,创建一个udev规则文件来捕获TF卡插入事件. 1:创建一个udev规则文件&#xff0c;例…

飞书即时消息无需API开发连接Cohere,打造飞书AI智能问答助手

飞书即时消息用户使用场景&#xff1a; 许多企业都在使用飞书系统进行协同办公&#xff0c;而现在有了Cohere大语言模型技术&#xff0c;能够根据用户的提问来自动产生回答&#xff0c;无需人为干预。对于企业负责人来说&#xff0c;他们认为如果将Cohere技术融入到飞书机器人中…

SpringBoot+jSerialComm实现Java串口通信 读取串口数据以及发送数据

记录一下使用SpringBootjSerialComm实现Java串口通信&#xff0c;使用Java语言开发串口&#xff0c;对串口进行读写操作,在win和linux系统都是可以的&#xff0c;有一点好处是不需要导入额外的文件。 案例demo源码&#xff1a;SpringBootjSerialComm实现Java串口通信 读取串口…

easypoi导入数值精度丢失

记录一下easypoi导入数值,精度丢失的解决方案 1.导入的excel字段如图 2.easypoi解析CellValueService部分源码: 这个方法拿到的原始数据如图&#xff1a; 解决方法&#xff1a; 1.统一处理方式&#xff1a;在解析的时候使用DecimaFormat进行数据格式化 //格式化为6为小数 De…

Day57|leetcode 647. 回文子串、516.最长回文子序列

leetcode 647. 回文子串 题目链接&#xff1a;647. 回文子串 - 力扣&#xff08;LeetCode&#xff09; 视频链接&#xff1a;动态规划&#xff0c;字符串性质决定了DP数组的定义 | LeetCode&#xff1a;647.回文子串_哔哩哔哩_bilibili 题目概述 给你一个字符串 s &#xff0c;…

使用动态住宅代理还能带来哪些好处?

一、什么是动态住宅代理ip 动态住宅代理是一种代理技术&#xff0c;它利用代理服务器中转用户和目标服务器之间的网络流量&#xff0c;实现用户真实位置的屏蔽。代理提供商会有自己的ip大池子&#xff0c;当你通过代理服务器向网站发送请求时&#xff0c;服务器会从池子中选中…

Spring系列文章:Spring6集成MyBatis3.5

1、引入依赖 <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.2</version></dependency><dependency><groupId>org.mybatis</groupId><artif…

jsp页面出现“String cannot be resolved to a type”错误解决办法

篇首语&#xff1a;小编为大家整理&#xff0c;主要介绍了jsp页面出现“String cannot be resolved to a type”错误解决办法相关的知识&#xff0c;希望对你有一定的参考价值。 jsp页面出现“String cannot be resolved to a type”错误解决办法 解决办法&#xff1a; 右键项目…

软考高级架构师下篇-14面向服务架构设计理论

目录 1. 引言2. SOA的相关概念3. SOA的发展历史4. SOA的参考架构5. SOA 主要协议和规范6. SOA设计的标准要求7. SOA的作用与设计原则8. SOA的设计模式9. SOA构建与实施10. 前文回顾1. 引言 在面向服务的体系结构(Service-Oriented Architecture,SOA)中,服务的概念有了延伸…

详解:API开发【电商API封装商品数据SKU接口的开发接入】

电商API开发8.1 RESTful API的设计8.2 API的路由和控制器8.3 API的认证和授权 RESTful API的设计 RESTful API是一种通过HTTP协议发送和接收数据的API设计风格。它基于一些简单的原则&#xff0c;如使用HTTP动词来操作资源、使用URI来标识资源、使用HTTP状态码来表示操作结果等…

Java多线程(四)锁策略(CAS,死锁)和多线程对集合类的使用

锁策略&#xff08;CAS&#xff0c;死锁&#xff09;和多线程对集合类的使用 锁策略 1.乐观锁VS悲观锁 2.轻量级锁VS重量级锁 3.自旋锁VS挂起等待锁 4.互斥锁VS读写锁 5.可重入锁vs不可重入锁 死锁的第一种情况 死锁的第二种情况 死锁的第三种情况 CAS 1.实现原子类 …

苹果发布会:iPhone15系列

苹果将在北京时间9月13日凌晨1点召开发布会&#xff0c;本次发布会的主角是iPhone 15系列&#xff0c;包含四款机型&#xff1a;iPhone 15、iPhone 15 Plus、iPhone 15 Pro 以及 iPhone 15 Pro Max&#xff0c;本次发布会快科技全程视频直播&#xff0c;有关产品的细节也会在新…

四川百幕晟科技:抖音新店怎么快速起店?

抖音作为全球最大的短视频平台&#xff0c;拥有庞大的用户基础和强大的影响力&#xff0c;成为众多商家宣传产品、增加销量的理想选择。那么&#xff0c;如何快速开店并成功运营呢&#xff1f;下面描述了一些关键步骤。 1、如何快速开新店&#xff1f; 1、确定产品定位&#x…

系列一、前言

本系列文章是参考B站尚硅谷老师讲的 "尚硅谷Nginx教程由浅入深&#xff08;一套打通丨初学者也可掌握&#xff09;"系列课程&#xff0c;然后结合自己真实的操作而总结的系列文章。我也把自己学习、实操过程中的详细笔记以脑图的形式分享了出去&#xff0c;发现大家对…

SpringMVC实战crud增删改查

一.公共页面的跳转 1.编写页面跳转控制类 package com.YU.web;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping;/*** author YU* create …