程序笔记

视频发送显示

  1. 一、   步骤

OnBnClickedBtnsendvideofile():

{

initial()编码器

{

主要初始化参数,包括控件值传入、

LocateMemory()分配图片缓存到rgbBuf(仅仅是分配了缓存)、后面sendvideofile()会讲如何丢进缓存的

SetWindowPos()设置发送视频的显示位置信息、

套接字?;

}                                   ThreadSendVideo()开启新线程:

{

Sendvideofile()

{

 fread(pic.img.plane[0],1,luma_size*3/2,fp);这一步将视频文件放进数组中、

conv.YV12_to_RGB24(pic.img.plane[0],..,rgbBuf…);将视频文件转换格式并且丢进缓存rgbBuf中(rgbBuf预先在LocateMemory()中预留了空间)、

 RGB2BMP_show()转换为BMP并显示rgbBuf中图像数据;

 Encode_frame():

{

  X264_encode_():程序上看不出来,但是应该是将pic_outnal关联起来,应该是编码,nal很大,一个一个包的发。

//for循环发送nal

SendVideoData():

     {

         Memcpy():将nal的数据传给pack.data(完成打包)

         SendTo():将packet发送(由内在的Onrecieve接收)

        Onrecieve():

         {

            ReceiveFrom():数据被接收并存放于pack

            AppendBuf():(recvbuf的成员函数)将pack数据拷贝到recvbuf

            DisplayRemoteFrame():

              {

                 这里面有解码,程序看不出。但是解码后将数据转化为yuv并显示

}

}

 

 

:     Onrecieve中的AppendBuf中接收拷贝缓存,这里包含头部(因为要减去头部,所以一定在这里面)

       所以帧的头部处理(IPB帧识别)应该在此处,然后处理,最后由rgbshow一系列的显示出来

       

}

}最后依次返回,for循环nal中的包,在循环帧制造nal

}

Endthread()

}

}

 

  1. 二、      数据处理及传递过程

1、        fp得到yuv文件的指针

2、        Initial()初始化,传递控件里的数据,并且rgbBuf 视频缓存大小确定,pic也得到一定数据,最后确定了视频窗口位置setwindowpos

注:x264_picture_t pic;所以可以查看x264_picture_t的结构体数据

3、        再由freadfp指针数据传递给pic.xxx.xxxpic结构体的成员),再由再将pic.xxx.xxx数据传给YV12_to_RGB24,(实际传给是rgbBuf,并确定rgbBuf的大小),然后bmpshow显示

4、        再由Encode_framepic作为实参,h为指针传递。

x264_encoder_encodepicnali_nal(帧数),pic_out几个数据关联(具体程序看不出来,但是一定相互关联了)

注:encode_frame就是将pic的数据编码,编码结果就是nal了,一帧的数据都在nal中,但是发送时是nal的一截一截的发

5、        然后SendVideoDatanal的数据传递,(具体可看结构体的数据类型)。然后nal的数据由memcpy()将nal的数据传递给pack.data (实际上是data,但nal的数据作为实参传递给了data)。(nal的数据存放在缓存中,buf

注:1、上一步中已经把picnal关联

    2nal的数据给pack.data就相当于将数据打包,然后再去发

    3、所以综上,第四步就是将读入的数据pic编码为nal,第五步将nal进行打包(要考虑分段,因为有MTU的问题),最后为pack.data

6、最后打包结果packSendTo发送(详细功能由MSDN查看)

注:SendTo中有VIDEO_DATA_HEADER就是视频包头部,如何判断IPB帧应该就要利用头部信息,所以分析应该信息在nal

7SendTo一定与Onrecieve存在联系。或者就是自动调用Onrecieve。数据在Onrecieve()中接收,Onrecieve中的ReceiveFrom应该才是调用数据真正函数,pack将会接收并保存数据。而后结构体RecvBuf的一个对象recvbuf,引用成员函数AppendBuf(),将pack.data数据拷贝到recvbuf的一个成员变量pktBuf中保存)

8 DisplayRemoteFrame调用recvbuf数据,进行解码,解码后在yuv2rgb,在rgbshow显示出来

  1. 三、   问题研究

注:问题在问题及处理文件夹中解释

1、        OnrecieveSendTo之间的关系?

是否有内在联系?

                                             

2、        视频包头部究竟在哪里体现?

Nal 还是其他?在encode_frame之前还是后(编码前还是后)?nal还是pic_out 还是pic

3、        如果已知头部如何判断IPB帧?

4、       

5、        GOP的概念?


你可能感兴趣的:(程序笔记)