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. [转]Unity Shader 学习总结

    1.先来一段单张纹理贴图的shader示例代码: // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClip ...

  2. #region的作用和注释快捷键

    让函数在编辑器中收起来,简洁 #region All MenuItems [@MenuItem("xxx")] public static void Init() { XXXXX; ...

  3. TP5.0中的小知识总结

    2017年6月26日15:01:231.input    获取输入数据 支持默认值和过滤:接收用户在前台输入的数据,可以是get方式也可以是post方式.2.ThinkPHP5.0内置了分页实现,要给 ...

  4. Tomcat的目录结构(tomcat 7)

    /bin                存放在Windows平台以及Linux平台上启动和关闭Tomat的脚本文件 /conf              存放关于Tomcat服务器的全局配置. /li ...

  5. iptables的例子1

      练习1:实现主机防火墙   设置主机防火墙策略为DROP: iptables -t filter -P INPUT DROP iptables -t filter -P OUTPUT DROP i ...

  6. zookeeper(二): Curator vs zkClient

    目录 zookeeper Curator zkClient 客户端对比 写在前面 1.1. zookeeper应用开发 1.1.1. ZkClient简介 1.1.2. Curator简介 写在最后 ...

  7. Learning string similarity measures for gene/protein name dictionary look-up using logistic regression

    Yoshimasa Tsuruoka1,*, John McNaught1,2, Jun’ichi Tsujii1,2,3 and Sophia Ananiadou1,2 1 School of Co ...

  8. 【译】常见 Java 异常解释(恶搞版)

    常见 Java 异常解释:(译者注:非技术角度分析.阅读有风险,理解需谨慎o(╯□╰)o) java.lang ArithmeticException 你正在试图使用电脑解决一个自己解决不了的数学问题 ...

  9. linux c编程:文件夹操作

    创建目录: 用mkdir函数创建目录: mkdir(const char *pathname, mode_t mode) 参数mode有下列的组合: S_ISUID 04000 文件的执行时设置用户I ...

  10. android ui篇 自己写界面

    对于一些较为简单的界面则自己进行写. 在这里就需要了解xml文件中一些基本的属性以及android手机的知识. 一.目前手机屏幕像素密度基本有5种情况.(以下像素密度简称密度) 密度 ldpi mdp ...