1. H264视频的RTP封包

  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<data + len - 3; 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<data+len-3;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. }
  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<data + len - 3; 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<data+len-3;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封包

  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. }
  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

/* au header

+---------------------------------------+

|     AU-size                           |

+---------------------------------------+

|     AU-Index / AU-Index-delta         |

+---------------------------------------+

|     CTS-flag                          |

+---------------------------------------+

|     CTS-delta                         |

+---------------------------------------+

|     DTS-flag                          |

+---------------------------------------+

|     DTS-delta                         |

+---------------------------------------+

|     RAP-flag                          |

+---------------------------------------+

|     Stream-state                      |

+---------------------------------------+

*/

分享一段H264视频和AAC音频的RTP封包代码的更多相关文章

  1. C#音视频网络流解码:H264视频和ACC音频

    下面两种方式是直接翻译过来的,还有问题,比如指针的使用和值的传入.考虑C#和C++的差异,还是要抱着怀疑的态度去看待,不一定是对的. H264视频解码网络流: using FFmpeg.AutoGen ...

  2. 屏幕录制H.264视频,AAC音频,MP4复,LibRTMP现场活动

    上周完成了一个屏幕录制节目,实时屏幕捕获.记录,视频H.264压缩,音频应用AAC压缩,复用MP4格公式,这使得计算机和ios设备上直接播放.支持HTML5的播放器都能够放,这是标准格式的优点.抓屏也 ...

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

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

  4. 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码

    ffmpeg开源库,实现将bmp格式的图片编码成x264文件,并将编码好的H264文件解码保存为BMP文件. 实现将视频文件yuv格式保存的图片格式的測试,图像格式png,jpg, gif等等測试均O ...

  5. 采集音频和摄像头视频并实时H264编码及AAC编码[转]

    0. 前言 我在前两篇文章中写了DirectShow捕获音视频然后生成avi,再进行264编码的方法.那种方法有一些局限性,不适合实时性质的应用,如:视频会议.视频聊天.视频监控等.本文所使用的技术, ...

  6. 采集音频和摄像头视频并实时H264编码及AAC编码

    转自:http://www.cnblogs.com/haibindev/archive/2011/11/10/2244442.html 0. 前言 我在前两篇文章中写了DirectShow捕获音视频然 ...

  7. 分享一段视频关于SQL2014 Hekaton数据库的

    分享一段视频关于SQL2014 Hekaton数据库的 Microsoft SQL Server In-Memory OLTP Project "Hekaton": App Dev ...

  8. 分享macOS平台好用的视频分割、合并视频、提取音频、分离音频、音频转码的工具CCVideo

    CCVideo 是一款运行在macOS上可分割视频(可多段分割).合并视频.提取音频.分离音频.音频转码的工具,操作方便,只需简单几步,便可轻松完成. 下载地址

  9. 音视频编解码技术(二):AAC 音频编码技术

    一.AAC编码概述 AAC是高级音频编码(Advanced Audio Coding)的缩写,出现于1997年,最初是基于MPEG-2的音频编码技术,目的是取代MP3格式.2000年,MPEG-4标准 ...

随机推荐

  1. jQuery+css+div一些值得注意的常用语句

    一.div页面布局 一个好的页面布局很重要,这会让你写代码的时候层次分明: 以2列左侧固定右侧自适应宽度为例子: 这是HTML代码: <!DOCTYPE html PUBLIC "-/ ...

  2. cookie中转注入实战

    随着网络安全技术的发展,SQL注入作为一种很流行的攻击方式被越来越多的人所知晓.很多网站也都对SQL注入做了防护,许多网站管理员的做法就是添加一个防注入程序.这时我们用常规的手段去探测网站的SQL注入 ...

  3. linux杀掉80端口线程命令

    80端口被其他程序占用, fuser -k -n tcp 80

  4. 如何用 ANTLR 4 实现自己的脚本语言?

    ANTLR 是一个 Java 实现的词法/语法分析生成程序,目前最新版本为 4.5.2,支持 Java,C#,JavaScript 等语言,这里我们用 ANTLR 4.5.2 来实现一个自己的脚本语言 ...

  5. Public, Private and Protect

    public 意味着在其后声明的所有成员对所有的人都可以取. private 意味着除了该类型的创建者和类的内部成员函数之外,任何人都不能存取这些成员. protect 它与private基本相似,只 ...

  6. hdu 2112 HDU Today (最短路,字符处理)

    题目 题目很简单,只是多了对地名转化为数字的处理,好吧,这我也是参考网上的处理办法,不过大多数的人采用map来处理 注意初始化注意范围,不然会wa!!!(这是我当时wa的原因org) 大家容易忽视的地 ...

  7. hdu 1242 Rescue(BFS,优先队列,基础)

    题目 /******************以下思路来自百度菜鸟的程序人生*********************/ bfs即可,可能有多个’r’,而’a’只有一个,从’a’开始搜,找到的第一个’r ...

  8. IOS:利用dispatch_once创建单例

    在之前有一篇学习笔记中,记载了一篇如何在OC中实现单例的文章:<IOS学习笔记4—Objective C—创建单例>自苹果引入了Grand Central Dispatch (GCD)(M ...

  9. apache common-io.jar FileUtils

    //复制文件  void copyFile(File srcFile, File destFile)   //将文件内容转化为字符串 String readFileToString(File file ...

  10. hdu 1978 How many ways

    #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int ...