视频发送显示
一、 步骤
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_out与nal关联起来,应该是编码,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、 由fp得到yuv文件的指针
2、 Initial()初始化,传递控件里的数据,并且rgbBuf 视频缓存大小确定,pic也得到一定数据,最后确定了视频窗口位置setwindowpos
注:x264_picture_t pic;所以可以查看x264_picture_t的结构体数据
3、 再由fread将fp指针数据传递给pic.xxx.xxx(pic结构体的成员),再由再将pic.xxx.xxx数据传给YV12_to_RGB24,(实际传给是rgbBuf,并确定rgbBuf的大小),然后bmpshow显示
4、 再由Encode_frame将pic作为实参,h为指针传递。
x264_encoder_encode将pic,nal,i_nal(帧数),pic_out几个数据关联(具体程序看不出来,但是一定相互关联了)
注:encode_frame就是将pic的数据编码,编码结果就是nal了,一帧的数据都在nal中,但是发送时是nal的一截一截的发
5、 然后SendVideoData将nal的数据传递,(具体可看结构体的数据类型)。然后nal的数据由memcpy()将nal的数据传递给pack.data (实际上是data,但nal的数据作为实参传递给了data)。(nal的数据存放在缓存中,buf)
注:1、上一步中已经把pic与nal关联
2、nal的数据给pack.data就相当于将数据打包,然后再去发
3、所以综上,第四步就是将读入的数据pic编码为nal,第五步将nal进行打包(要考虑分段,因为有MTU的问题),最后为pack.data
6、最后打包结果pack由SendTo发送(详细功能由MSDN查看)
注:SendTo中有VIDEO_DATA_HEADER就是视频包头部,如何判断IPB帧应该就要利用头部信息,所以分析应该信息在nal中
7、SendTo一定与Onrecieve存在联系。或者就是自动调用Onrecieve。数据在Onrecieve()中接收,Onrecieve中的ReceiveFrom应该才是调用数据真正函数,pack将会接收并保存数据。而后结构体RecvBuf的一个对象recvbuf,引用成员函数AppendBuf(),将pack.data数据拷贝到recvbuf的一个成员变量pktBuf中保存)
8、 DisplayRemoteFrame调用recvbuf数据,进行解码,解码后在yuv2rgb,在rgbshow显示出来
三、 问题研究
注:问题在”问题及处理”文件夹中解释
1、 Onrecieve与SendTo之间的关系?
是否有内在联系?
2、 视频包头部究竟在哪里体现?
Nal 还是其他?在encode_frame之前还是后(编码前还是后)?nal还是pic_out 还是pic?
3、 如果已知头部如何判断IPB帧?
4、
5、 GOP的概念?