264摄像分辨率的章程

在利用ffmpeg解码播放TS流的时候(例如以前写过的UDP组播流),在接连时一再需求耗费多量日子。经过debug发现是av_find_stream_info(已抛弃,现在应用的是avformat_find_stream_info)那一个主意13分耗费时间,而且是阻塞的。av_find_stream_info方法重要是赢得相应的流新闻,个中对自个儿的使用最可行的正是摄像的分辨率。在av_find_stream_info中是要不停的读取数据包,解码获得相应的消息,而里面除了分辨率消息以外的东西对本人的采纳中是无用的。所以,考虑本身手动从H.264码流中剖析出录制的分辨率音信。

在运用ffmpeg解码播放TS流的时候(例如在此以前写过的UDP组播流),在连接时多次必要开支大批量时日。经过debug发现是av_find_stream_info(已舍弃,未来应用的是avformat_find_stream_info)这一个措施足够耗时,而且是阻塞的。av_find_stream_info方法首若是收获对应的流新闻,当中对本人的利用最管用的正是录像的分辨率。在av_find_stream_info中是要时时刻刻的读取数据包,解码得到对应的新闻,而内部除了分辨率音讯以外的东西对自家的利用中是对事情没有什么帮助的。所以,考虑本人手动从H.264码流中剖析出录像的分辨率音讯。

   
以下内容首要参照了那篇小说:http://www.myexception.cn/internet/586390.html

   
以下内容首要参照了那篇小说:http://www.myexception.cn/internet/586390.html

       H.264码流的流消息都存款和储蓄在了特殊的组织中,叫做SPS(Sequence
Parameter Set)。要分析SPS就供给知道有些H.264码流的格式音信。

       H.264码流的流信息都存款和储蓄在了超过常规规的结构中,叫做SPS(Sequence
Parameter Set)。要分析SPS就须要知道有个别H.264码流的格式新闻。

    在H.264码流中,都是以0x00 0x00 0x01 也许 0x00 0x00 0x00
0x01为开头码的(在本人的运用中为后任),之后经过检查和测试发轫码后第三个字节的后6位是不是为7(00111)来判定其是或不是为SPS。获得SPS之后,就能够分析出摄像的分辨率。SPS中有三个分子,pic_width_in_mbs_minus1和pic_height_in_map_units_minus_1,分别代表图像的宽和高,不过要留心的是它们都以以16为单位(在面积上就是以16*16的块为单位)再减1,所以实际的宽是(pic_width_in_mbs_minus1

    在H.264码流中,都以以0x00 0x00 0x01 恐怕 0x00 0x00 0x00
0x01为伊始码的(在本人的施用中为后世),之后通过检查和测试开首码后率先个字节的后陆个人是不是为7(00111)来判断其是或不是为SPS。获得SPS之后,就足以分析出录制的分辨率。SPS中有八个成员,pic_width_in_mbs_minus1和pic_height_in_map_units_minus_1,分别代表图像的宽和高,可是要留意的是它们都是以16为单位(在面积上正是以16*16的块为单位)再减1,所以实际上的宽是(pic_width_in_mbs_minus1

  • 1)*16,高为(pic_height_in_map_units_minus_1+1)*16。
  • 1)*16,高为(pic_height_in_map_units_minus_1+1)*16。

 

 

      欢迎转发,转发请注解出处:http://guoyb.com/Tech/34.html

      欢迎转发,转发请评释出处:http://guoyb.com/Tech/34.html

    以下是分析宽高的代码:

    以下是分析宽高的代码:

 

 

转载http://guoyb.com/Tech/34.html

转载http://guoyb.com/Tech/34.html

 

 

以下部分 转自 http://blog.csdn.net/pkueecser/article/details/7367641

以下部分 转自 http://blog.csdn.net/pkueecser/article/details/7367641

 

 

采纳奥迪Q7TP传输H264的时候,供给用到sdp协议描述,在这之中有两项:Sequence
Parameter Sets (SPS) 和Picture
Parameter Set (PPS)须求运用,那么那两项从哪个地方得到呢?答案是从H264码流中获取.在H264码流中,都是以”0x00
0x00 0x01″或然”0x00 0x00 0x00
0x01″为开头码的,找到开始码之后,使用起来码之后的率先个字节的低八人判断是或不是为7(sps)大概8(pps),
及data[4] & 0x1f == 7 || data[4] & 0x1f ==
8.然后对获取的nal去掉初步码之后举办base64编码,得到的音讯就足以用来sdp.sps和pps须要用逗号分隔断来.

使用逍客TP传输H264的时候,供给用到sdp协议描述,在那之中有两项:Sequence
Parameter Sets (SPS) 和Picture
Parameter Set (PPS)需求选拔,那么那两项从哪儿获得呢?答案是从H264码流中获取.在H264码流中,都是以”0x00
0x00 0x01″恐怕”0x00 0x00 0x00
0x01″为开端码的,找到初始码之后,使用起来码之后的首先个字节的低八位判断是还是不是为7(sps)或许8(pps),
及data[4] & 0x1f == 7 || data[4] & 0x1f ==
8.然后对拿到的nal去掉起始码之后展开base64编码,得到的音信就可以用于sdp.sps和pps须求用逗号分隔开来.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

 

什么剖析SDP中包含的H.264的SPS和PPS串

 

http://www.pernet.tv.sixxs.org/thread-109-1-1.html

SDP中的H.264的SPS和PPS串,包蕴了伊始化H.264解码器所须要的新闻参数,包罗编码所用的profile,level,图像的宽和高,deblock滤波器等。
鉴于SDP中的SPS和PPS都以BASE64编码格局的,不便于明白,附属类小部件有二个工具软件能够对SDP中的SPS和PPS进行解析。
用法是在命令行中输入:
spsparser sps.txt pps.txt output.txt

比如sps.txt中的内容为:
Z0LgFNoFglE=
pps.txt中的内容为:
aM4wpIA=

末段分析的到的结果为:

Start dumping SPS:
  profile_idc = 66
  constrained_set0_flag = 1
  constrained_set1_flag = 1
  constrained_set2_flag = 1
  constrained_set3_flag = 0
  level_idc = 20
  seq_parameter_set_id = 0
  chroma_format_idc = 1
  bit_depth_luma_minus8 = 0
  bit_depth_chroma_minus8 = 0
  seq_scaling_matrix_present_flag = 0
  log2_max_frame_num_minus4 = 0
  pic_order_cnt_type = 2
  log2_max_pic_order_cnt_lsb_minus4 = 0
  delta_pic_order_always_zero_flag = 0
  offset_for_non_ref_pic = 0
  offset_for_top_to_bottom_field = 0
  num_ref_frames_in_pic_order_cnt_cycle = 0
  num_ref_frames = 1
  gaps_in_frame_num_value_allowed_flag = 0
  pic_width_in_mbs_minus1 = 21
  pic_height_in_mbs_minus1 = 17
  frame_mbs_only_flag = 1
  mb_adaptive_frame_field_flag = 0
  direct_8x8_interence_flag = 0
  frame_cropping_flag = 0
  frame_cropping_rect_left_offset = 0
  frame_cropping_rect_right_offset = 0
  frame_cropping_rect_top_offset = 0
  frame_cropping_rect_bottom_offset = 0
  vui_parameters_present_flag = 0

Start dumping PPS:
  pic_parameter_set_id = 0
  seq_parameter_set_id = 0
  entropy_coding_mode_flag = 0
  pic_order_present_flag = 0
  num_slice_groups_minus1 = 0
  slice_group_map_type = 0
  num_ref_idx_l0_active_minus1 = 0
  num_ref_idx_l1_active_minus1 = 0
  weighted_pref_flag = 0
  weighted_bipred_idc = 0
  pic_init_qp_minus26 = 0
  pic_init_qs_minus26 = 0
  chroma_qp_index_offset = 10
  deblocking_filter_control_present_flag = 1
  constrained_intra_pred_flag = 0
  redundant_pic_cnt_present_flag = 0
  transform_8x8_mode_flag = 0
  pic_scaling_matrix_present_flag = 0
  second_chroma_qp_index_offset = 10

/////////////////////////////////////////////////////////////////////////////////////////////////
此间需求专门提一下那多个参数
pic_width_in_mbs_minus1 = 21
  pic_height_in_mbs_minus1 = 17
个别代表图像的宽和高,以宏块(16×16)为单位的值减1
为此,实际的宽为 (21+1)*16 = 352
图片 1 spsparser.rar

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

http://krdai.info.sixxs.org/blog/mp4-sps-pps-data.html

方今在做跟 h264 encode/decode 相關的钻研,目標是希望能够從 Android 的
MediaRecorder 當中取出 h264 的資訊。近期問題是在於 SPS 以及 PPS
到底要怎樣获得。由於 MediaRecorder 是寫入 mp4檔案中,所以没办法只可以來去分析一下 mp5 的檔案格式,發現沒有想像中的困難.
首假设參照 ISO/IEC 14496-15 這部份. 在 mp3 的檔案之中, 找到 avcC
這個字串, 之後正是接上 Amp4ecoderConfigurationRecord.
Amp4ecoderConfigurationRecord 的 format 如下:

 

[cpp] view
plain
copy

 

  1. aligned(8) class AVCDecoderConfigurationRecord {  
  2.    unsigned int(8) configurationVersion = 1;  
  3.    unsigned int(8) AVCProfileIndication;  
  4.    unsigned int(8) profile_compatibility;  
  5.    unsigned int(8) AVCLevelIndication;  
  6.   
  7. bit(6) reserved = ‘111111’b;  
  8.    unsigned int(2) lengthSizeMinusOne;  
  9.   
  10. bit(3) reserved = ‘111’b;  
  11.    unsigned int(5) numOfSequenceParameterSets;  
  12.   
  13. for (i=0; i< numOfSequenceParameterSets; i++) {  
  14.       unsigned int(16) sequenceParameterSetLength ;  
  15.       bit(8*sequenceParameterSetLength) sequenceParameterSetNALUnit;  
  16.    }  
  17.    unsigned int(8) numOfPictureParameterSets;  
  18.    for (i=0; i< numOfPictureParameterSets; i++) {  
  19.       unsigned int(16) pictureParameterSetLength;  
  20.       bit(8*pictureParameterSetLength) pictureParameterSetNALUnit;  
  21.    }  
  22. }  

 

對照一下這樣就足以找到 SPS 和 PPS

+++++++++++++++++++++++++++++++++++++++++++++

 

vlc没有接到pps和sps

2010-10-08 16:16

问题 packetizer_h264 packetizer warning: waiting for SPS/PPS

是因为解码器只是在第一次执行编码的时候,才编码出 SPS、PPS、和I_Frame; 

h264 packetizer has set so, that it sends sps/pps only first keyframe,
 I'm trying to figure what breaks if that is changed so sps/pps is written in every keyframe. 
[出自| http://trac.videolan.org/vlc/ticket/1384]

解决办法:

1、编码器编码出每个关键帧都加上SPS、PPS ,据说通常情况编码器编出的 SPS、PPS是一样的,所以这种方法耗费资源。

2、在服务器接收到客户端请求时,发送第一个package 加上 SPS、PPS。

具体如下:

  • 1、在 VideoOpenFileSource 添加一个变量 isFirstFrame;

  • 2、构造时初始化 isFirstFrame = true;
  • 3、在int VideoOpenFileSource::readFromBufferChain() 修改如下:

  •    1         if(isFirstFrame == true)
       2         {
       3                 memcpy(fTo, h264_header, sizeof(h264_header)); /* h264_header = pps +sps*/
       4                 offset = sizeof(h264_header);
       5                 framesize = BufferChain_get(fInput.video_bufs, fTo + offset);
       6                 offset += framesize;
       7                 isFirstFrame = false;
       8                 printf("this is the first fime\n");
       9                 sleep(1);
      10         }
      11         else
      12         {
      13                 framesize = BufferChain_get(fInput.video_bufs, fTo + offset);
      14                 offset += framesize;
      15         }
      1
[http://topic.csdn.net/u/20100801/17/ef35e664-92ff-4144-a35f-3984dcf11da3.html| 参考] 


========================================================================
sdp 关于pps和sps的疑问:
packetization-mode 主要是定义包的模式,单一 NALU单元模式(0);非交错(non-interleaved)封包模式(1);交错(interleaved)封包模式(2)
sprop-parameter-sets 等于H.264 的序列参数集和图像参数 NAL单元,base64转换;(即= sps+pps)
profile-level-id 这个参数用于指示 H.264 流的 profile 类型和级别。这知道这个是啥东东

参考 黑暗长老 www.cppblog.com/czanyou/
ffmpeg decode 关于pps sps问题:
stackoverflow.com/questions/3493742/problem-to-decode-h264-video-over-rtp-with-ffmpeg-libavcodec/3500432#3500432

 

 

 

怎么着用C语言取出H.264ES文件里的nal(sps,pps)新闻。比如width, height,
profile等等

请权威指引引导。。。 http://www.oschina.net/question/225813_35707

浅析sps,pps的代码在ffmpeg里面就有, 抄出来就行了, 笔者在此之前也要好写过…
ffmpeg的libavcodec/h264_parser.c,
h264_ps.c
函数
ff_h264_decode_seq_parameter_set
ff_h264_decode_picture_parameter_set
本身能够看代码.

 

H264参数语法文书档案:
SPS、PPS、ID奇骏 http://blog.csdn.net/heanyu/article/details/6205390

H.264码流首个 NALU 是 SPS(体系参数集Sequence Parameter Set)
对应H264正式文书档案 7.3.2.1 体系参数集的语法举办解析

 

何以剖析SDP中隐含的H.264的SPS和PPS串

 

http://www.pernet.tv.sixxs.org/thread-109-1-1.html

SDP中的H.264的SPS和PPS串,包涵了开始化H.264解码器所要求的音讯参数,包蕴编码所用的profile,level,图像的宽和高,deblock滤波器等。
是因为SDP中的SPS和PPS都以BASE64编码格局的,不不难理解,附件有一个工具软件能够对SDP中的SPS和PPS进行辨析。
用法是在命令行中输入:
spsparser sps.txt pps.txt output.txt

比如说sps.txt中的内容为:
Z0LgFNoFglE=
pps.txt中的内容为:
aM4wpIA=

终极分析的到的结果为:

Start dumping SPS:
  profile_idc = 66
  constrained_set0_flag = 1
  constrained_set1_flag = 1
  constrained_set2_flag = 1
  constrained_set3_flag = 0
  level_idc = 20
  seq_parameter_set_id = 0
  chroma_format_idc = 1
  bit_depth_luma_minus8 = 0
  bit_depth_chroma_minus8 = 0
  seq_scaling_matrix_present_flag = 0
  log2_max_frame_num_minus4 = 0
  pic_order_cnt_type = 2
  log2_max_pic_order_cnt_lsb_minus4 = 0
  delta_pic_order_always_zero_flag = 0
  offset_for_non_ref_pic = 0
  offset_for_top_to_bottom_field = 0
  num_ref_frames_in_pic_order_cnt_cycle = 0
  num_ref_frames = 1
  gaps_in_frame_num_value_allowed_flag = 0
  pic_width_in_mbs_minus1 = 21
  pic_height_in_mbs_minus1 = 17
  frame_mbs_only_flag = 1
  mb_adaptive_frame_field_flag = 0
  direct_8x8_interence_flag = 0
  frame_cropping_flag = 0
  frame_cropping_rect_left_offset = 0
  frame_cropping_rect_right_offset = 0
  frame_cropping_rect_top_offset = 0
  frame_cropping_rect_bottom_offset = 0
  vui_parameters_present_flag = 0

Start dumping PPS:
  pic_parameter_set_id = 0
  seq_parameter_set_id = 0
  entropy_coding_mode_flag = 0
  pic_order_present_flag = 0
  num_slice_groups_minus1 = 0
  slice_group_map_type = 0
  num_ref_idx_l0_active_minus1 = 0
  num_ref_idx_l1_active_minus1 = 0
  weighted_pref_flag = 0
  weighted_bipred_idc = 0
  pic_init_qp_minus26 = 0
  pic_init_qs_minus26 = 0
  chroma_qp_index_offset = 10
  deblocking_filter_control_present_flag = 1
  constrained_intra_pred_flag = 0
  redundant_pic_cnt_present_flag = 0
  transform_8x8_mode_flag = 0
  pic_scaling_matrix_present_flag = 0
  second_chroma_qp_index_offset = 10

/////////////////////////////////////////////////////////////////////////////////////////////////
此地需求专门提一下那五个参数
pic_width_in_mbs_minus1 = 21
  pic_height_in_mbs_minus1 = 17
分别代表图像的宽和高,以宏块(16×16)为单位的值减1
从而,实际的宽为 (21+1)*16 = 352
图片 2 spsparser.rar

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

http://krdai.info.sixxs.org/blog/mp4-sps-pps-data.html

眼前在做跟 h264 encode/decode 相關的研究,目標是期望得以從 Android 的
MediaRecorder 當中取出 h264 的資訊。近期問題是在於 SPS 以及 PPS
到底要怎樣得到。由於 MediaRecorder 是寫入 mp5檔案中,所以不得已只好來去分析一下 mp3 的檔案格式,發現沒有想像中的困難.
主借使參照 ISO/IEC 14496-15 這部份. 在 mp4 的檔案之中, 找到 avcC
這個字串, 之後正是接上 Amp5ecoderConfigurationRecord.
Amp3ecoderConfigurationRecord 的 format 如下:

 

  1. aligned(8) class AVCDecoderConfigurationRecord {  
  2.    unsigned int(8) configurationVersion = 1;  
  3.    unsigned int(8) AVCProfileIndication;  
  4.    unsigned int(8) profile_compatibility;  
  5.    unsigned int(8) AVCLevelIndication;  
  6.   
  7. bit(6) reserved = ‘111111’b;  
  8.    unsigned int(2) lengthSizeMinusOne;  
  9.   
  10. bit(3) reserved = ‘111’b;  
  11.    unsigned int(5) numOfSequenceParameterSets;  
  12.   
  13. for (i=0; i< numOfSequenceParameterSets; i++) {  
  14.       unsigned int(16) sequenceParameterSetLength ;  
  15.       bit(8*sequenceParameterSetLength) sequenceParameterSetNALUnit;  
  16.    }  
  17.    unsigned int(8) numOfPictureParameterSets;  
  18.    for (i=0; i< numOfPictureParameterSets; i++) {  
  19.       unsigned int(16) pictureParameterSetLength;  
  20.       bit(8*pictureParameterSetLength) pictureParameterSetNALUnit;  
  21.    }  
  22. }  

 

對照一下這樣就能够找到 SPS 和 PPS

+++++++++++++++++++++++++++++++++++++++++++++

 

vlc没有接过pps和sps

2010-10-08 16:16

问题 packetizer_h264 packetizer warning: waiting for SPS/PPS

是因为解码器只是在第一次执行编码的时候,才编码出 SPS、PPS、和I_Frame; 

h264 packetizer has set so, that it sends sps/pps only first keyframe,
 I'm trying to figure what breaks if that is changed so sps/pps is written in every keyframe. 
[出自| http://trac.videolan.org/vlc/ticket/1384]

解决办法:

1、编码器编码出每个关键帧都加上SPS、PPS ,据说通常情况编码器编出的 SPS、PPS是一样的,所以这种方法耗费资源。

2、在服务器接收到客户端请求时,发送第一个package 加上 SPS、PPS。

具体如下:

  • 1、在 VideoOpenFileSource 添加一个变量 isFirstFrame;

  • 2、构造时初始化 isFirstFrame = true;
  • 3、在int VideoOpenFileSource::readFromBufferChain() 修改如下:

  •    1         if(isFirstFrame == true)
       2         {
       3                 memcpy(fTo, h264_header, sizeof(h264_header)); /* h264_header = pps +sps*/
       4                 offset = sizeof(h264_header);
       5                 framesize = BufferChain_get(fInput.video_bufs, fTo + offset);
       6                 offset += framesize;
       7                 isFirstFrame = false;
       8                 printf("this is the first fime\n");
       9                 sleep(1);
      10         }
      11         else
      12         {
      13                 framesize = BufferChain_get(fInput.video_bufs, fTo + offset);
      14                 offset += framesize;
      15         }
      1
[http://topic.csdn.net/u/20100801/17/ef35e664-92ff-4144-a35f-3984dcf11da3.html| 参考] 


========================================================================
sdp 关于pps和sps的疑问:
packetization-mode 主要是定义包的模式,单一 NALU单元模式(0);非交错(non-interleaved)封包模式(1);交错(interleaved)封包模式(2)
sprop-parameter-sets 等于H.264 的序列参数集和图像参数 NAL单元,base64转换;(即= sps+pps)
profile-level-id 这个参数用于指示 H.264 流的 profile 类型和级别。这知道这个是啥东东

参考 黑暗长老 www.cppblog.com/czanyou/
ffmpeg decode 关于pps sps问题:
stackoverflow.com/questions/3493742/problem-to-decode-h264-video-over-rtp-with-ffmpeg-libavcodec/3500432#3500432

 

 

 

怎么用C语言取出H.264ES文件里的nal(sps,pps)音讯。比如width, height,
profile等等

请大师辅导辅导。。。 http://www.oschina.net/question/225813_35707

解析sps,pps的代码在ffmpeg里面就有, 抄出来就行了, 作者原先也自身写过…
ffmpeg的libavcodec/h264_parser.c,
h264_ps.c
函数
ff_h264_decode_seq_parameter_set
ff_h264_decode_picture_parameter_set
温馨能够看代码.

 

H264参数语法文书档案:
SPS、PPS、ID奔驰M级 http://blog.csdn.net/heanyu/article/details/6205390

H.264码流第一个 NALU 是 SPS(系列参数集Sequence Parameter Set)
对应H264规范文档 7.3.2.1 系列参数集的语法进行解析