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

代码其实很简单,主要是要知道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){//h264int nalType=frame[4]&0x1f;//判断I帧,然后根据具体情况获取sps,ppsif(nalType==7){//[Start Code]:Start Code 用于标示这是一个NALU 单元的开始(也称分隔符),必须是”00 00 00 01” 或”00 00 01”。//关键帧是00 00 00 01for (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.mzph.cn/news/73199.shtml

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

相关文章

RT-Thread UART

UART 简介 UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;通用异步收发传输器&#xff0c;UART 作为异步串口通信协议的一种&#xff0c;工作原理是将传输数据的每个字符一位接一位地传输。是在应用程序开发过程中使用频率最高的数据总线。 UART …

【已解决】uniapp使用vant-ui中的tab标签页的时候,发现底下红色的切换线不见了

问题截图 解决办法 按F12查看vant-ui源码你会发现他的Tab标签页里面有个width&#xff0c;但是我们引入到uniapp之后发现width没有了&#xff08;不知道什么情况&#xff0c;可能是兼容问题吧&#xff09; 所以我们解决的办法&#xff0c;只需要在App.vue中给全局.van-tabs__l…

ARM+Codesys标准通用型控制器

整机工业级设计&#xff0c;通讯外设经过隔离保护 电源宽电压设计(9~36V DC ) 丰富的通讯接口&#xff0c;满足多种场合控制和通讯需求 四核工业级处理器&#xff0c;高性能&#xff0c;低功耗&#xff0c;高可靠性 机身无风扇设计&#xff0c;外壳小巧 搭载内核 100% 自主…

数学建模之圈养湖羊的空间利用率

数学建模之圈养湖羊的空间利用率 D题最新最全思路已出&#xff0c;欢迎后台私信咨询~~~~ 1.问题&#xff1a; 规模化的圈养养殖场通常根据牲畜的性别和生长阶段分群饲养&#xff0c;适应不同种类、不同阶段的牲畜对空间的不同要求&#xff0c;以保障牲畜安全和健康&#xff…

掌动智能国产化测试工具的重要性与优势

在信息技术领域的快速发展下&#xff0c;对于软件和硬件产品的质量和性能要求也日益提高。同时针对信创要求&#xff0c;国产化测试工具在这个过程中发挥着重要的作用&#xff0c;不仅能够提升产品的可靠性和稳定性&#xff0c;还能够降低测试成本和提高测试效率。作为国内领先…

蓝桥杯官网练习题(三角回文数)

问题描述 对于正整数 n, 如果存在正整数 k 使得n123⋯k(k(k1)/2)​, 则 n 称为三角数。例如, 66066 是一个三角数, 因为 66066123⋯363 。 如果一个整数从左到右读出所有数位上的数字, 与从右到左读出所有数位 上的数字是一样的, 则称这个数为回文数。例如, 66066 是一个回文…

2023高教社杯 国赛数学建模A题思路 - 定日镜场的优化设计

1 赛题 A 题 定日镜场的优化设计 构建以新能源为主体的新型电力系统&#xff0c; 是我国实现“碳达峰”“碳中和”目标的一项重要 措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。 定日镜是塔式太阳能光热发电站(以下简称塔式电站)收集太阳能的基本组件&…

Windows如何设置终端代理?

说明&#xff1a;仅供学习使用&#xff0c;请勿用于非法用途&#xff0c;若有侵权&#xff0c;请联系博主删除 作者&#xff1a;zhu6201976 一、需求 由于Great Firewall of China&#xff0c;可能有些时候对我们探索科研世界增加了一些障碍。比如&#xff0c;我们经常需要通过…

常见项目管理中npm包操作总结

前言 我们在日常工作中&#xff0c;可能需要下载包、创建包、发布包等等。本篇推文将记录日常项目中关于npm包的操作。 引用包 npm仓库公开的包我们都可以通过npm install的命令进行引用下载。 而我们开发的业务公共组件需要在公司内部项目公共引用&#xff0c;而不希望公开为外…

使用 System.exit() 来优雅地终止 Spring Boot 项目

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; 使用 System.exit() 来优雅地终止 Spring Boot 项目 ⏱️ 创作时间&am…

构建普适通用的企业网络安全体系框架

在当今数字化时代&#xff0c;网络安全已成为企业保护信息资产和业务运行的重要任务。恶意攻击、数据泄露、网络病毒等威胁不断演进&#xff0c;给企业和个人带来了巨大风险。为了应对这一挑战&#xff0c;许多企业已经采取了一系列网络安全措施&#xff0c;如制定了网络安全政…

k8s service的一些特性

文章目录 Service分发负载的策略同一端口通过不同协议暴露Headless Service的负载分发策略 Service分发负载的策略 大家都知道&#xff0c;一个service可以对应多个pod&#xff0c;那么一定要有一些方法来把service接收到的请求&#xff08;负载&#xff09;转发到pod上。 一般…

CMU15445 fall 2022/spring 2023 项目环境搭建+选择合适的版本

前言 CMU15445是一门关于数据库管理系统&#xff08;DBMS&#xff09;的设计和实现的优秀课程。由数据库领域大佬Andy主讲&#xff0c;同时还有迟策大佬所设计和维护的BusTub&#xff0c;其名声在外之处更是有着极高质量的作业&#xff08;HOMEWORKS&#xff09;和项目&#x…

nodepad++ txt 转 csv

要将 Notepad 中的文本文件转换为 CSV 文件&#xff0c;您可以按照以下步骤操作&#xff1a; 打开 Notepad。打开您想要转换的文本文件。将文本文件的内容格式化为 CSV 格式。您可以使用逗号 (,) 分隔每个字段&#xff0c;并使用换行符 (\n) 分隔每行。保存文件并将其命名为以…

Java ArrayList扩容机制

来分析一下远吗吧 // 单个元素添加 public boolean add(E e) {modCount;add(e, elementData, size);return true;}// 批量add public boolean addAll(Collection<? extends E> c) {Object[] a c.toArray();modCount;int numNew a.length;if (numNew 0)return false;…

虚函数、纯虚函数、多态

一.虚函数 在基类的函数前加上virtual关键字&#xff0c;在派生类中重写该函数&#xff0c;运行时将会根据所指对象的实际类型来调用相应的函数&#xff0c;如果对象类型是派生类&#xff0c;就调用派生类的函数&#xff0c;如果对象类型是基类&#xff0c;就调用基类的函数。 …

HarmonyOS应用开发者-----高级认证试题及答案

HarmonyOS应用开发者高级认证试题及答案 试题会不定时刷新,本试题仅供大家学习参考 【判断题】 2/2 HarmonyOS应用可以兼容OpenHarmony生态 正确(True)【判断题】 2/2 所有使用@Component修饰的自定义组件都支持onPageShow,onBackPress和onPageHide生命周期函数。 正确(True…

React基础

目录 TODO1 React概述 React的使用 React脚手架的使用 全局安装 npx安装 在脚手架中使用React JSX 1. JSX的基本使用 1.1 为什么用JSX 1.2 JSX简介 1.3 使用步骤 1.4 脚手架中能用JSX 1.5 注意点 2. 在JSX中使用JavaScript表达式 2.1 嵌入js表达式 2.2 注意点 3…

小节3:数据类型

Python的数据类型包括&#xff1a;字符串&#xff08;str&#xff09;、整数&#xff08;int&#xff09;、浮点数&#xff08;float&#xff09;、布尔类型&#xff08;bool&#xff09;、空值类型&#xff08;NoneType&#xff09;、列表&#xff08;list&#xff09;、字典&…

JUC P8 ThreadLocal 基础+代码

JUC P8 ThreadLocal 基础代码 教程&#xff1a;https://www.bilibili.com/video/BV1ar4y1x727?p100 引出问题 ThreadLocal 和 TreadLocalMap 数据结构关系&#xff1f; ThreadLocal 中的 key 是弱引用&#xff0c;为什么&#xff1f; ThreadLocal 内存泄漏问题是什么&#x…