关于音频视频的网络传输
偶现在已经实现开启本地视频,搞不明白视频的采集 压缩 传输 解压 播放,请高人指点迷津
希望达人讲得具体点
问题点数:20、回复次数:16Top
1 楼i_love_pc(杰子)(欢迎加入技术交流QQ群:23640432)回复于 2006-08-23 08:40:14 得分 0
同样的问题,期待中Top
2 楼iec(bcbtovs)回复于 2006-08-27 00:24:52 得分 0
一幅图像先采集到内存,进行压缩编码,然后进行传输 接收端接收图像流 解码 进行播放Top
3 楼woainihaha(笨笨)回复于 2006-08-27 01:07:38 得分 0
采用DirectShow
建议看看陆其明老大的2本书Top
4 楼tanlim(sunsos.net sunsos.cn)回复于 2006-08-27 05:56:52 得分 0
就简单来讲,就是内存流的操作,但是对于视频的解编码,是有特定算法的,这方面的资料很少,我也期待有朋友能提供这方面的资料,像MPEG等等Top
5 楼flyfeel(图灵)回复于 2006-09-06 08:57:23 得分 5
视音频是流特性业务,数据量很大未压缩的视频在Internet/Intranet上传输的效果是无法容忍的,而且会很容易地将网络资源吞没,造成网络拥塞甚至崩溃。因此,IP视频通信的第一步就是视频压缩。
视频压缩编码的理论基础是信息论。压缩就是从时域、空域两方面去除冗余信息,即将可推知的确定信息去掉。编码方法大致可分为三类:
1.考虑到图像信源的统计特性采用的预测编码方法、变换编码方法、矢量量化编码方法、子带-小波编码方法及神经网络编码方法等;
2.考虑到视觉特性采用的基于方向滤波的图像编码方法、基于图像轮廓/纹理的编码方法;
3.考虑到图像传递的景物特征,采用的分形编码、基于模块的编码方法。
在IP视音频通信应用中,编码方法的选择不但要考虑到压缩比、信噪比,还要考虑到算法的复杂性。太复杂的编码算法可能会产生较高的压缩比,但也会带来较大的计算开销,软件实现时会影响通信的实时性。目前,在众多视频编码算法中,影响最大并被广泛应用的算法标准是IOS/IEC MPEG和ITU-T H.26x。
Top
6 楼cnjsnt1995()回复于 2006-09-10 10:46:33 得分 5
到百度贴吧上去,搜陆其明,他是DirectShow方面专家.他经常到他的贴吧上去,回答网友提出的象你一样的音频视频网络传输等方面的问题.
DirectShow是Direct X家族的成员之一,它是Windows平台上的流媒体开发包。与Direct X开发包一起发布。DirectShow提供了从本地文件和网络上播放、传输和捕获多媒体流的能力,它广泛支持各种媒体文件,包括MPEG、ASF、AVI、MP3、WAV等等。DirectShow是基于COM的.Top
7 楼VirtualDesktop(^_^)回复于 2006-09-29 19:04:44 得分 5
用VFW就可以了
你搜索一下,有例子的Top
8 楼xtgmd168(张天)回复于 2006-11-10 17:34:34 得分 0
在DELPHI园地里面有DIVX的网络传输组件Top
9 楼rockcmc2000(很多东西不是能有你决定的,如果不能反抗,就享受吧!)回复于 2006-12-05 21:34:49 得分 5
我也遇到同样的问题,
按道理先是截取位图,,
差点的方法是压缩为jpg,好点是压缩为H264,H264的码流量为10K/妙
有段deiphl的程序,有完整的源代码压缩为jpg,我不知道jpg的码流量是多少,但是算一下每秒25帧,一张jpg算它50k,网络码流量也不小啊!
unit Unit1;
interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls,VFW, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient,jpeg;type TForm1 = class(TForm) Panel1: TPanel;
Button1: TButton;
Button2: TButton;
IdUDPClient1: TIdUDPClient;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private { Private declarations }
public { Public declarations }
end;
var Form1: TForm1;
CapWnd:THandle; //定义捕捉窗句柄
CapParms:TcaptureParms; //用于设置设备属性的结构变量
BMPINFO:TBitmapInfo; //BMP图像信息
implementation{$R *.dfm}
function FrameCallBack(hWnd: HWND; lpVHdr: PVIDEOHDR): LongInt;stdcall;
var hd:Thandle;
jpg:TJpegImage;
memStream :TMemoryStream;
Bitmap:TBitmap;
begin //将数据显在Image,
Bitmap:=TBitmap.Create;
Bitmap.Width :=BMPINFO.bmiHeader.biWidth;
// New size of Bitmap
Bitmap.Height:=BMPINFO.bmiHeader.biHeight;
hd:= DrawDibOpen;
DrawDibDraw(hd,Bitmap.canvas.handle,0,0,BMPINFO.BmiHeader.biwidth,BMPINFO._
bmiheader.biheight,@BMPINFO.bmiHeader,_
lpVHdr^.lpData,0,0,BMPINFO.bmiHeader.biWidth,BMPINFO.bmiHeader.biheight,0);
DrawDibClose(hd);
//发送数据
memStream := TMemoryStream.Create;
jpg := TJpegImage.Create; jpg.Assign(Bitmap);
jpg.CompressionQuality := 10;
//jpg压缩质量
jpg.JPEGNeeded;
jpg.Compress;
jpg.SaveToStream(memStream);
jpg.Free;
//因为UDP数据包有大小限制,这里如果超出部分,就没有传输,完全可以发几次发出去
Form1.IdUDPClient1.BroadcastEnabled:=true;//用广播功能
if memStream.Size>Form1.IdUDPClient1.BufferSize then
//向192.168.0.X网段广播,端口 9001
Form1.IdUDPClient1.SendBuffer('192.168.0.255',9001,memStream.Memory^,Form1.IdUDPClient1.BufferSize)
else
Form1.IdUDPClient1.SendBuffer('192.168.0.255',9001,memStream.Memory^,memStream.Size);
memStream.Free;
Bitmap.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
CapWnd := capCreateCaptureWindow('我的窗口', WS_VISIBLE or WS_CHILD,//窗口样式
0, //X坐标
0, //Y坐标
panel1.Width, //窗口宽
panel1.Height, //窗口高
panel1.handle, //窗口句柄
0); //通常为0
if CapWnd = 0 then exit; //定义帧捕捉回调函数
CapSetCallbackOnFrame(CapWnd,FrameCallBack);
CapParms.dwRequestMicroSecPerFrame:=1;
CapParms.fLimitEnabled:=FALSE;
CapParms.fCaptureAudio:=FALSE;
CapParms.fMCIControl:=FALSE;
CapParms.fYield:=TRUE;
CapParms.vKeyAbort:=VK_ESCAPE;
CapParms.fAbortLeftMouse:=False;
CapParms.fAbortRightMouse:=FALSE; //让设置生效
CapCaptureSetSetup(capWnd,@CapParms,sizeof(TCAPTUREPARMS));
CapPreviewRate(capWnd,33); //设置预览视频的频率
CapCaptureSequenceNoFile(capWnd); //如果要捕捉视频流,则要使用函数来指定不生成文件,不然会自动生成AVI文件
CapDriverConnect(CapWnd,0); //连接摄像头设备,第二个参数是个序号,当系统中装有多个显示驱动程序时,其值分别依次为0到总个数如果有多个摄像头,那么就是0->1->2 capGetVideoFormat(capWnd, @BMPINFO,sizeof(TBitmapInfo)); //取得视频图像数据头
CapPreviewScale(capWnd,TRUE); //是否缩放
CapOverlay(capWnd,true); //指定是否使用叠加模式,true为使用,否则为false CapPreview(capWnd,true);end;procedure TForm1.Button2Click(Sender: TObject);
begin capCaptureAbort(CapWnd); //停止捕捉
capDriverDisconnect(CapWnd); //将捕捉窗同驱动器断开
end;
end.
本人是在用BCB,,到hd:= DrawDibOpen;这句的时候,,出了问题,按原理通过使用DrawDibOpen函数初始化DrawDib函数组。DrawDibOpen负责装载动态连接库(DLL),申请内存资源,DrawDib设备环境(DC),并且维持初始化相关的设备环境计数。DrawDibOpen同时返回一个其它DrawDib函数所需要使用的新的DC句柄。
但是我不知道dll在那里,,,
那位达人帮忙。。。
Top
10 楼jandyking(痞子o0菜)回复于 2007-01-14 05:30:49 得分 0
如果是传输视频文件呢?
要求边传边放 rm wmv等多种格式
是不是要自己写filter??Top
11 楼VirtualDesktop(^_^)回复于 2007-01-15 16:01:38 得分 0
不需要,filter有得调用的,什么h264啊IUVY啊,DIVX啊,都有现成的调用的,有一组API ICC打头的专门调用压缩器和解压器的Top
12 楼sbkopoky()回复于 2007-02-17 18:48:08 得分 0
有一个香港和悦网络电话的源文件 ,有兴趣妨进入我的BLOG看看
Top
13 楼jandyking(痞子o0菜)回复于 2007-03-08 19:53:52 得分 0
VirtualDesktop(吴滂:欢迎到我的Blog转转 ^_^)
可以说得详细点吗??有例子最好不过了 谢谢Top
14 楼forverlove()回复于 2007-03-08 22:52:52 得分 0
学习Top
15 楼huzhangyou(信仰(http://www.libing.net.cn))回复于 2007-03-09 09:12:57 得分 0
刚好我也在做
经过昨天晚上的构思基本成型
我的博客将在近期详细介绍!
大概的思路:
(视频监控)
客户端使用Indy UDP协议将视频数据报压缩传输到服务器端
服务器开发一个线程类
对于我的具体实现 我需要15个显示
开启15个线程
这个线程里面成员变量未
1:TImage 负责显示图象数据
2:TIndyUdpServer 负责接受数据
在Execute函鼠里面读取数据,并解码显示就可以了
至于视频还有音频可以参卡
H323的部分实现
解码标准如下:
ITU.T H.323v2标准,支持H.225/H.245/RAS/Q.931
音频编码:
iLBC-15k
iLBC-13k
GSM-06.10
MS-GSM
SpeexNarrow-8k-15k
LPC-10{sw}
G.711-uLaw-64k
G.711-ALaw-64k
G.726-16k-40k
G.729A
视频编码:
H.261-QCIF/CIF
H.263-QCIF/CIF
RTP数据传输
音频一般使用G.729
视频 H263
这个H323的项目里面有一个包代码
我现在要去接老婆
晚上我有时间我贴到博客上面
http://www.libing.net.cn
Top
16 楼zjsyw(冰狗)回复于 2007-03-09 10:45:49 得分 0
markTop




