文档章节

程序笔记

草域之王
 草域之王
发布于 2015/03/21 19:43
字数 1008
阅读 30
收藏 0

视频发送显示

  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的概念?


© 著作权归作者所有

下一篇: X264
草域之王
粉丝 1
博文 4
码字总数 2397
作品 0
塔城
程序员
私信 提问
Golang学习笔记目录

Golang 介绍 Go语言是谷歌2009发布的第二款开源编程语言。 Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。...

ChainZhang
2017/12/26
0
0
Kindle笔记导出工具--KindleNote

[TOC] KindleNote 简介 KindleNote 可以使你 KindleNote 阅读器中的笔记变得更易阅读。 我们通过对 KindleNote的笔记文件进行整理、分析,使得笔记片段合并为完整笔记。 你可以用 KindleNote...

杜小豆
2016/05/15
762
0
可扩展桌面笔记客户端 - AlephNote

AlephNote AlephNote 是一个用于多个后端的可扩展,轻量级桌面笔记客户端。 Standard Note 使用 StandardNotePlugin,用户的笔记将同步到 Standard File server,笔记将在本地加密,只有用户...

匿名
2018/05/29
0
0
安装Office OneNote 2007

Office OneNote 2007 是什么,微软说:“ 简单来说,OneNote 就是纸质笔记本的电子版本,您可以在其中记录笔记、想法、创意、涂鸦、提醒以及所有类型的其他信息。与其他程序(例如文字处理程...

彭博
2012/03/09
241
0
Onenote Class Notebook Ctreator,协作教学的利器

OneNote Class Notebook Creator是一个帮助您建立班级笔记的SharePoint 在线程序,这个应用程序可以创建一个班级笔记本,其中包括三种类型的子笔记本。 1、 学生笔记本 — — 每个老师和学生...

dhqlx
2018/06/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java8

package com.shi.lambda;import java.util.Arrays;import java.util.List;import org.junit.Test;import com.shi.model.Employee;/** * 初始化案例 * @author xiaosh......

小小小施爷
35分钟前
1
0
c# 动态编译代码

有时候做计算一些东西时候,算法一直变更,写在程序需要一直调整,因此算法写在cs文件,然后动态调用内部的方法去计算判断,只需变更cs文件即可。 using Microsoft.CSharp; using System; us...

朝如青丝暮成雪
35分钟前
4
0
好程序员技术分享html5和JavaScript的区别

好程序员技术分享html5和JavaScript的区别,HTML5广义上讲是前端开发学科的代名词,包含HTML5、CSS3及JavaScript三个重要的部分,是运行在浏览器上应用的统称。如PC端网站、管理系统、手机网...

好程序员IT
38分钟前
2
0
tomcat 与 spring boot 设置虚拟路径

tomcat 设置虚拟路径 <Context path="/uploadDir" docBase="/data"/>path是请求访问的路径docBase是服务器存储文件的路径,Linux 根目录下 data spring boot 虚拟路径设置 registry.addRe......

kdy1994
41分钟前
1
0
var ,let ,const 的区别和共同点

一、let和var区别 1.关于变量提升,var能变量提升,let不能 // 关于var 如下所示console.log(a); //输出undefined,此时就是变量提升var a = 2; console.log(a); //2 //相当于下面...

MrBoyce
46分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部