事情是这样的,我把摄像头实时编码后,存成文件,用ffplay播放是完全正常的,现在要用RTP往外发送sps给vlc。所以要取到h->sps,但是我把它存成一个二进制文件,打开查看发现里面的值很少,所以想确认一下是不是取的是对的。
但是存储下来,发现里面绝大多数是00,而我打开一个正确编码的xxxx.264,却发现全是乱七八糟的(针对同一个摄像头,同一次编码),所以让我非常的不安,怎么就知道上面存下来的sps是不是对的了?一时非常担忧。
从头到尾都是这样子,根本没有与最开始的存下的sps类似的东西,所以很是让人担忧啊。难道我存下的sps是错的吗?
但是,我用如下代码来检验,对个别值,却是相符的:
CString str;
str.Format("sps->i_mb_width = %u ;sps->i_mb_height = %u ",h->sps->i_mb_width,h->sps->i_mb_height);//20,15
AfxMessageBox(str);//弹出来的是20,15,倒是和算下的值吻合(320/16 == 20 240/16 == 15)
而存储用的是如下代码,也没有错啊,上面的弹出检验和这是一个函数里的。
//写入一个文件检验是否正确
CFile file1(strFilePath, CFile::modeWrite|CFile::modeCreate);
file1.SeekToEnd();
file1.Write(h->sps,sizeof(x264_sps_t));
file1.Close();
是不是编码得到的xxx.264里,是经过某种压缩编码,所以看到的sps和自己单独存出来的sps不一样了?因为20的十六进制是14 00,15的十六进制是0F 00,这个在最上面的图里都有,而且也是挨着的。
为了测试一下,int i_sar_height;后面是int b_overscan_info_present,把b_overscan_info_present设置个值试试,如果二进制文件里发现有变化,好像会意味着某些事啊。
试了,发现不论设置0或1,都不变,哎。
h = x264_encoder_open( ¶m );
h->sps->vui.b_overscan_info_present = 1;
打开x264源码找了下,好像它是用 x264_sps_write( &h->out.bs, h->sps ); //序列参数集_写入
里面用了好多 bs_write_ue,说是指数哥伦布编码,我看到的乱码和自己存的二进制文件不一样好像是这个原因吧,因为我是直接存的
评论