1. static int h264_parse(Track *tr, uint8_t *data, size_t len)
  2. {
  3. h264_priv *priv = tr->private_data;
  4. //    double nal_time; // see page 9 and 7.4.1.2
  5. size_t nalsize = 0, index = 0;
  6. uint8_t *p, *q;
  7. if (priv->is_avc) {
  8. while (1) {
  9. unsigned int i;
  10. if(index >= len) break;
  11. //get the nal size
  12. nalsize = 0;
  13. for(i = 0; i < priv->nal_length_size; i++)
  14. nalsize = (nalsize << 8) | data[index++];
  15. if(nalsize <= 1 || nalsize > len) {
  16. if(nalsize == 1) {
  17. index++;
  18. continue;
  19. } else {
  20. fnc_log(FNC_LOG_VERBOSE, "[h264] AVC: nal size %d", nalsize);
  21. break;
  22. }
  23. }
  24. if (DEFAULT_MTU >= nalsize) {
  25. mparser_buffer_write(tr,
  26. tr->properties.pts,
  27. tr->properties.dts,
  28. tr->properties.frame_duration,
  29. 1,
  30. data + index, nalsize);
  31. fnc_log(FNC_LOG_VERBOSE, "[h264] single NAL");
  32. } else {
  33. // single NAL, to be fragmented, FU-A;
  34. frag_fu_a(data + index, nalsize, DEFAULT_MTU, tr);
  35. }
  36. index += nalsize;
  37. }
  38. } else {
  39. //seek to the first startcode
  40. for (p = data; p
  41. if (p[0] == 0 && p[1] == 0 && p[2] == 1) {
  42. break;
  43. }
  44. }
  45. if (p >= data + len) return ERR_PARSE;
  46. while (1) {
  47. //seek to the next startcode [0 0 1]
  48. for (q = p; q
  49. if (q[0] == 0 && q[1] == 0 && q[2] == 1) {
  50. break;
  51. }
  52. }
  53. if (q >= data + len) break;
  54. if (DEFAULT_MTU >= q - p) {
  55. fnc_log(FNC_LOG_VERBOSE, "[h264] Sending NAL %d",p[0]&0x1f);
  56. mparser_buffer_write(tr,
  57. tr->properties.pts,
  58. tr->properties.dts,
  59. tr->properties.frame_duration,
  60. 1,
  61. p, q - p);
  62. fnc_log(FNC_LOG_VERBOSE, "[h264] single NAL");
  63. } else {
  64. //FU-A
  65. fnc_log(FNC_LOG_VERBOSE, "[h264] frags");
  66. frag_fu_a(p, q - p, DEFAULT_MTU, tr);
  67. }
  68. p = q;
  69. }
  70. // last NAL
  71. fnc_log(FNC_LOG_VERBOSE, "[h264] last NAL %d",p[0]&0x1f);
  72. if (DEFAULT_MTU >= len - (p - data)) {
  73. fnc_log(FNC_LOG_VERBOSE, "[h264] no frags");
  74. mparser_buffer_write(tr,
  75. tr->properties.pts,
  76. tr->properties.dts,
  77. tr->properties.frame_duration,
  78. 1,
  79. p, len - (p - data));
  80. } else {
  81. //FU-A
  82. fnc_log(FNC_LOG_VERBOSE, "[h264] frags");
  83. frag_fu_a(p, len - (p - data), DEFAULT_MTU, tr);
  84. }
  85. }
  86. fnc_log(FNC_LOG_VERBOSE, "[h264] Frame completed");
  87. return ERR_NOERROR;
  88. }

2. AAC的RTP封包

[c-sharp] view plaincopy

 
  1. static int aac_parse(Track *tr, uint8_t *data, size_t len)
  2. {
  3. //XXX handle the last packet on EOF
  4. int off = 0;
  5. uint32_t payload = DEFAULT_MTU - AU_HEADER_SIZE;
  6. uint8_t *packet = g_malloc0(DEFAULT_MTU);
  7. if(!packet) return ERR_ALLOC;
  8. // trim away extradata
  9. //    data += AAC_EXTRA;
  10. //    len -= AAC_EXTRA;
  11. packet[0] = 0x00;
  12. packet[1] = 0x10;
  13. packet[2] = (len & 0x1fe0) >> 5;
  14. packet[3] = (len & 0x1f) << 3;
  15. if (len > payload) {
  16. while (len > payload) {
  17. memcpy(packet + AU_HEADER_SIZE, data + off, payload);
  18. mparser_buffer_write(tr,
  19. tr->properties.pts,
  20. tr->properties.dts,
  21. tr->properties.frame_duration,
  22. 0,
  23. packet, DEFAULT_MTU);
  24. len -= payload;
  25. off += payload;
  26. }
  27. }
  28. memcpy(packet + AU_HEADER_SIZE, data + off, len);
  29. mparser_buffer_write(tr,
  30. tr->properties.pts,
  31. tr->properties.dts,
  32. tr->properties.frame_duration,
  33. 1,
  34. packet, len + AU_HEADER_SIZE);
  35. g_free(packet);
  36. return ERR_NOERROR;
  37. }

上面的变量 AU_HEADER_SIZE=4

来自: http://blog.csdn.net/moruite/article/details/6102758

RTP 打包H264与AAC的更多相关文章

  1. 基于RTP的H264视频数据打包解包类

    from:http://blog.csdn.net/dengzikun/article/details/5807694 最近考虑使用RTP替换原有的高清视频传输协议,遂上网查找有关H264视频RTP打 ...

  2. RTP协议解析及H264/H265 音视频RTP打包分析

    一 概述 实时传输协议(Real-time Transport Protocol或简写RTP)是一个网络传输协议,它是由IETF的多媒体传输工作小组1996年在RFC 1889中公布的. RTP协议详 ...

  3. 多媒体开发之---h264 rtp打包

    http://blog.csdn.net/newthinker_wei/article/details/8997440 http://blog.csdn.net/dengzikun/article/d ...

  4. (转)基于RTP的H264视频数据打包解包类

    最近考虑使用RTP替换原有的高清视频传输协议,遂上网查找有关H264视频RTP打包.解包的文档和代码.功夫不负有心人,找到不少有价值的文档和代码.参考这些资料,写了H264 RTP打包类.解包类,实现 ...

  5. AAC头部格式,RTP打包格式

    一共有2种AAC头格式,一种是StreamMuxConfig,另一种是AudioSpecificConfig 1.AudioSpecificConfig 读写header的代码参考    ffmpeg ...

  6. 【FFMPEG】基于RTP的H264视频数据打包解包类

    最近考虑使用RTP替换原有的高清视频传输协议,遂上网查找有关H264视频RTP打包.解包的文档和代码.功夫不负有心人,找到不少有价值的文档和代码.参考这些资料,写了H264 RTP打包类.解包类,实现 ...

  7. (原)从mp4,flv文件中解析出h264和aac,送解码器解码失败

    转载请注明出处:http://www.cnblogs.com/lihaiping/p/5285166.html 今天在做本地文件解码测试,发现从mp4,flv文件中读出来的帧数据,h264和aac帧直 ...

  8. (转) 解密H264、AAC硬件解码的关键扩展数据处理

    出自:http://blog.itpub.net/30168498/viewspace-1576794/       通过上一篇文章,我们用ffmpeg分离出一个多媒体容器中的音视频数据,但是很可能这 ...

  9. 使用librtmp进行H264与AAC直播

    libx264 版本是 128libfaac 版本是 1.28 1.帧的划分 1.1 H.264 帧 对于 H.264 而言每帧的界定符为 00 00 00 01 或者 00 00 01. 比如下面的 ...

随机推荐

  1. swoole创建TCP服务端和客户端

    服务端: server.php <?php //创建Server对象,监听 127.0.0.1:9501端口    $serv = new swoole_server("127.0.0 ...

  2. Redis的主从同步手动执行故障切换

    1.准备三个redis配置文件,通过端口的区分,启动三个redis数据库实例,然后配置主从复制. # a6371.conf port 6371 daemonize yes pidfile /data/ ...

  3. RxJava2 源代码解析(一)

    转载请标明出处: http://blog.csdn.net/zxt0601/article/details/61614799 本文出自:[张旭童的博客](http://blog.csdn.net/zx ...

  4. Js数组的map,filter,reduce,every,some方法

    var arr=[1,2,3,4,5,6]; res = arr.map(function(x){return x*x}) [1, 4, 9, 16, 25, 36] res = arr.filter ...

  5. 【学习】Spring 的 AOP :基于Annotation 的“零配置”方式

    转自:http://www.cnblogs.com/jbelial/archive/2012/07/20/2539123.html AOP(Aspect Orient Programming ) , ...

  6. node-sass 安装失败的解决措施[转]

    转自:http://blog.csdn.net/nzb329/article/details/51935236 在编译一个项目的时候,一直报错 后来发现是因为node-sass没有装成功, 最终的解决 ...

  7. Yii2发送短信验证码完全解决方案

    概述 在做项目的时候,需要用到短信发送验证码功能.不能不说Yii2的牛逼,很容易就搞定了.下面我整理一下具体功能和流程,分享给大家. 主要功能 通过Yii2 rules验证手机号 通过js验证是否为手 ...

  8. Python map,reduce,filter,apply

    map(function, iterable, ...) map()函数接收两个参数,一个是函数,一个是可迭代的对象,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回. 基本等 ...

  9. JAVA中最方便的Unicode转换方法

    在命令行界面用native2ascii工具  1.将汉字转为Unicode:  C:\Program   Files\Java\jdk1.5.0_04\bin>native2ascii  测试 ...

  10. curl常用指令

    curl 发送GET请求获取标准输出 curl -I 显示http请求头 curl -i 显示请求头及输出内容 curl xxx > xxx 将输出重定向到本地文件(本地文件无需已存在,一般不写 ...