RTP 打包H264与AAC
- static int h264_parse(Track *tr, uint8_t *data, size_t len)
- {
- h264_priv *priv = tr->private_data;
- // double nal_time; // see page 9 and 7.4.1.2
- size_t nalsize = 0, index = 0;
- uint8_t *p, *q;
- if (priv->is_avc) {
- while (1) {
- unsigned int i;
- if(index >= len) break;
- //get the nal size
- nalsize = 0;
- for(i = 0; i < priv->nal_length_size; i++)
- nalsize = (nalsize << 8) | data[index++];
- if(nalsize <= 1 || nalsize > len) {
- if(nalsize == 1) {
- index++;
- continue;
- } else {
- fnc_log(FNC_LOG_VERBOSE, "[h264] AVC: nal size %d", nalsize);
- break;
- }
- }
- if (DEFAULT_MTU >= nalsize) {
- mparser_buffer_write(tr,
- tr->properties.pts,
- tr->properties.dts,
- tr->properties.frame_duration,
- 1,
- data + index, nalsize);
- fnc_log(FNC_LOG_VERBOSE, "[h264] single NAL");
- } else {
- // single NAL, to be fragmented, FU-A;
- frag_fu_a(data + index, nalsize, DEFAULT_MTU, tr);
- }
- index += nalsize;
- }
- } else {
- //seek to the first startcode
- for (p = data; p
- if (p[0] == 0 && p[1] == 0 && p[2] == 1) {
- break;
- }
- }
- if (p >= data + len) return ERR_PARSE;
- while (1) {
- //seek to the next startcode [0 0 1]
- for (q = p; q
- if (q[0] == 0 && q[1] == 0 && q[2] == 1) {
- break;
- }
- }
- if (q >= data + len) break;
- if (DEFAULT_MTU >= q - p) {
- fnc_log(FNC_LOG_VERBOSE, "[h264] Sending NAL %d",p[0]&0x1f);
- mparser_buffer_write(tr,
- tr->properties.pts,
- tr->properties.dts,
- tr->properties.frame_duration,
- 1,
- p, q - p);
- fnc_log(FNC_LOG_VERBOSE, "[h264] single NAL");
- } else {
- //FU-A
- fnc_log(FNC_LOG_VERBOSE, "[h264] frags");
- frag_fu_a(p, q - p, DEFAULT_MTU, tr);
- }
- p = q;
- }
- // last NAL
- fnc_log(FNC_LOG_VERBOSE, "[h264] last NAL %d",p[0]&0x1f);
- if (DEFAULT_MTU >= len - (p - data)) {
- fnc_log(FNC_LOG_VERBOSE, "[h264] no frags");
- mparser_buffer_write(tr,
- tr->properties.pts,
- tr->properties.dts,
- tr->properties.frame_duration,
- 1,
- p, len - (p - data));
- } else {
- //FU-A
- fnc_log(FNC_LOG_VERBOSE, "[h264] frags");
- frag_fu_a(p, len - (p - data), DEFAULT_MTU, tr);
- }
- }
- fnc_log(FNC_LOG_VERBOSE, "[h264] Frame completed");
- return ERR_NOERROR;
- }
2. AAC的RTP封包
- static int aac_parse(Track *tr, uint8_t *data, size_t len)
- {
- //XXX handle the last packet on EOF
- int off = 0;
- uint32_t payload = DEFAULT_MTU - AU_HEADER_SIZE;
- uint8_t *packet = g_malloc0(DEFAULT_MTU);
- if(!packet) return ERR_ALLOC;
- // trim away extradata
- // data += AAC_EXTRA;
- // len -= AAC_EXTRA;
- packet[0] = 0x00;
- packet[1] = 0x10;
- packet[2] = (len & 0x1fe0) >> 5;
- packet[3] = (len & 0x1f) << 3;
- if (len > payload) {
- while (len > payload) {
- memcpy(packet + AU_HEADER_SIZE, data + off, payload);
- mparser_buffer_write(tr,
- tr->properties.pts,
- tr->properties.dts,
- tr->properties.frame_duration,
- 0,
- packet, DEFAULT_MTU);
- len -= payload;
- off += payload;
- }
- }
- memcpy(packet + AU_HEADER_SIZE, data + off, len);
- mparser_buffer_write(tr,
- tr->properties.pts,
- tr->properties.dts,
- tr->properties.frame_duration,
- 1,
- packet, len + AU_HEADER_SIZE);
- g_free(packet);
- return ERR_NOERROR;
- }
上面的变量 AU_HEADER_SIZE=4
来自: http://blog.csdn.net/moruite/article/details/6102758
RTP 打包H264与AAC的更多相关文章
- 基于RTP的H264视频数据打包解包类
from:http://blog.csdn.net/dengzikun/article/details/5807694 最近考虑使用RTP替换原有的高清视频传输协议,遂上网查找有关H264视频RTP打 ...
- RTP协议解析及H264/H265 音视频RTP打包分析
一 概述 实时传输协议(Real-time Transport Protocol或简写RTP)是一个网络传输协议,它是由IETF的多媒体传输工作小组1996年在RFC 1889中公布的. RTP协议详 ...
- 多媒体开发之---h264 rtp打包
http://blog.csdn.net/newthinker_wei/article/details/8997440 http://blog.csdn.net/dengzikun/article/d ...
- (转)基于RTP的H264视频数据打包解包类
最近考虑使用RTP替换原有的高清视频传输协议,遂上网查找有关H264视频RTP打包.解包的文档和代码.功夫不负有心人,找到不少有价值的文档和代码.参考这些资料,写了H264 RTP打包类.解包类,实现 ...
- AAC头部格式,RTP打包格式
一共有2种AAC头格式,一种是StreamMuxConfig,另一种是AudioSpecificConfig 1.AudioSpecificConfig 读写header的代码参考 ffmpeg ...
- 【FFMPEG】基于RTP的H264视频数据打包解包类
最近考虑使用RTP替换原有的高清视频传输协议,遂上网查找有关H264视频RTP打包.解包的文档和代码.功夫不负有心人,找到不少有价值的文档和代码.参考这些资料,写了H264 RTP打包类.解包类,实现 ...
- (原)从mp4,flv文件中解析出h264和aac,送解码器解码失败
转载请注明出处:http://www.cnblogs.com/lihaiping/p/5285166.html 今天在做本地文件解码测试,发现从mp4,flv文件中读出来的帧数据,h264和aac帧直 ...
- (转) 解密H264、AAC硬件解码的关键扩展数据处理
出自:http://blog.itpub.net/30168498/viewspace-1576794/ 通过上一篇文章,我们用ffmpeg分离出一个多媒体容器中的音视频数据,但是很可能这 ...
- 使用librtmp进行H264与AAC直播
libx264 版本是 128libfaac 版本是 1.28 1.帧的划分 1.1 H.264 帧 对于 H.264 而言每帧的界定符为 00 00 00 01 或者 00 00 01. 比如下面的 ...
随机推荐
- Mysql主从复制,实现数据同步
大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...
- 转载 【iOS开发】网页JS与OC交互(JavaScriptCore) OC ----->JS
目标 本文介绍利用苹果在iOS7时发布的JavaScriptCore.framework框架进行js与OC的交互.我们想要达到的目标是: OC调用网页上的js方法 网页js调用APP中的OC方法 ...
- 通讯录链表实现之C++
前言 在mooc上学习了链表中的顺序表和单链表,并使用单链表数据结构跟着老师完成通讯录创建.通过这次链表练习使用,做一些总结. 自顶向下设计探索. 功能需求 在功能实现上,通讯录主要包括,创建联系人, ...
- Xshell调节字体大小和样式
有时候没有看着字体太小的,好难受, 调节字体大小: ALT+P快捷键打开
- nginx学习之进程控制篇(三)
1. 进程 nginx有一个master进程和一个或多个工作进程. master process worker process or master process worker process wor ...
- 【python】-- GIL锁、线程锁(互斥锁)、递归锁(RLock)
GIL锁 计算机有4核,代表着同一时间,可以干4个任务.如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让看上去是并发的.但是单核永远肯定时串行的,它肯定是串行的, ...
- CentOS查看和修改MySQL字符集
通过以下命令查看了MySQL的字符集 连接上mysql服务,输入以下命令 mysql>show variables like 'character_set%'; 显示如下: 为了让MySQL支持 ...
- js 数组的所有操作
js的数组操作有很多,这里记录了常用的和不常用的数组操作方法. 一.数组的创建 数组的创建有两种方法,一种是通过字面量,另一种是通过Array构造函数. 1.字面量 var num1 = [1,2,3 ...
- java入门了解之快捷键
IDE(Integrated Development Environment ): 集成开发环境,集合开发.运行.调试于一体的一个软件 Eclipse 是一个开放源代码的.基于Java的可扩展开发平台 ...
- 51nod 1513 && CF570D
题意:给定一棵树,每个节点有一个字母.给定若干个询问,询问某个子树内某一深度的节点是否能将这些节点组合成一个回文串.(深度是以根节点为基准的,不是当前子树根.)数据规模10^5. 神犇题解 子树问题, ...