⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 使用jmf进行视频、音频的采集与实时传送 - hangke的专栏 - csdnblog.htm

📁 JMF编程的基础教程。。。 html格式配有源码。。。 非常适合初学者学习
💻 HTM
📖 第 1 页 / 共 3 页
字号:
  <LI class=listitem><A 
  href="http://add.my.yahoo.com/rss?url=http://blog.csdn.net/hangke/Rss.aspx" 
  target=_blank><IMG alt=订阅到Yahoo 
  src="使用JMF进行视频、音频的采集与实时传送 - hangke的专栏 - CSDNBlog.files/rss_yahoo.gif" 
  border=0></A>
  <LI class=listitem><A 
  href="http://rss.gougou.com/find_rss.jsp?url=http://blog.csdn.net/hangke/Rss.aspx" 
  target=_blank><IMG alt=订阅到GouGou 
  src="使用JMF进行视频、音频的采集与实时传送 - hangke的专栏 - CSDNBlog.files/rss_gougou.gif" 
  border=0></A>
  <LI class=listitem><A 
  href="http://www.pageflakes.com/subscribe.aspx?url=http://blog.csdn.net/hangke/Rss.aspx" 
  target=_blank><IMG alt=订阅到飞鸽 
  src="使用JMF进行视频、音频的采集与实时传送 - hangke的专栏 - CSDNBlog.files/rss_pageflakes.gif" 
  border=0></A>
  <LI class=listitem><A 
  href="http://www.rojo.com/add-subscription?resource=http://blog.csdn.net/hangke/Rss.aspx" 
  target=_blank><IMG alt=订阅到Rojo 
  src="使用JMF进行视频、音频的采集与实时传送 - hangke的专栏 - CSDNBlog.files/rss_rojo.gif" 
  border=0></A>
  <LI class=listitem><A 
  href="http://www.newsgator.com/ngs/subscriber/subfext.aspx?url=http://blog.csdn.net/hangke/Rss.aspx" 
  target=_blank><IMG alt=订阅到newsgator 
  src="使用JMF进行视频、音频的采集与实时传送 - hangke的专栏 - CSDNBlog.files/rss_newsgator.gif" 
  border=0></A>
  <LI class=listitem><A 
  href="http://www.netvibes.com/subscribe.php?url=http://blog.csdn.net/hangke/Rss.aspx" 
  target=_blank><IMG alt=订阅到netvibes 
  src="使用JMF进行视频、音频的采集与实时传送 - hangke的专栏 - CSDNBlog.files/rss_netvibes.gif" 
  border=0></A></LI></UL></SPAN><SPAN id=RecentVisitors></SPAN>
<H3 class=listtitle>文章</H3>
<UL class=list></UL>
<H3 class=listtitle>收藏</H3>
<UL class=list></UL>
<H3 class=listtitle>相册</H3><!--category title-->
<UL class=list></UL>
<H3 class=listtitle>存档</H3>
<UL class=list>
  <LI><A href="http://blog.csdn.net/hangke/archive/2008/03.aspx">2008年03月(6)</A>
  <LI><A href="http://blog.csdn.net/hangke/archive/2008/02.aspx">2008年02月(2)</A>
  <LI><A href="http://blog.csdn.net/hangke/archive/2008/01.aspx">2008年01月(7)</A>
  <LI><A href="http://blog.csdn.net/hangke/archive/2007/12.aspx">2007年12月(4)</A>
  <LI><A href="http://blog.csdn.net/hangke/archive/2007/11.aspx">2007年11月(8)</A>
  <LI><A 
  href="http://blog.csdn.net/hangke/archive/2007/10.aspx">2007年10月(30)</A></LI></UL><SPAN 
id=Anthem_RecentComments_ltlComments__><SPAN 
id=RecentComments_ltlComments></SPAN></SPAN><BR><BR></DIV>
<DIV id=main><SPAN class=PreAndNext id=viewpost.ascx_PreviousAndNextEntriesUp>
<DIV align=center><A 
href="http://blog.csdn.net/hangke/archive/2008/01/26/2066525.aspx">上一篇:&nbsp;jmf语音视频流抓取</A>&nbsp;|&nbsp;<A 
href="http://blog.csdn.net/hangke/archive/2008/01/21/2057065.aspx">下一篇:&nbsp;Java网络编程 
socket介绍</A></DIV></SPAN><BR>
<SCRIPT>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</SCRIPT>

<DIV class=post>
<DIV class=postTitle>
<SCRIPT 
src="使用JMF进行视频、音频的采集与实时传送 - hangke的专栏 - CSDNBlog.files/vote.js"></SCRIPT>
<A href="http://blog.csdn.net/hangke/archive/2008/01/24/2063740.aspx"><IMG 
height=13 src="使用JMF进行视频、音频的采集与实时传送 - hangke的专栏 - CSDNBlog.files/zhuan.gif" 
width=15 border=0>&nbsp;使用JMF进行视频、音频的采集与实时传送</A>&nbsp;&nbsp;
<SCRIPT 
src="使用JMF进行视频、音频的采集与实时传送 - hangke的专栏 - CSDNBlog.files/count.htm"></SCRIPT>
 </DIV>
<DIV class=postText>许多朋友在找关于网络视频会议的资料,希望对这方面感兴趣的朋友有所帮助。也真诚希望大家多多交流。 <BR>  一.简介 
<BR>  1.1JMF 体系结构简介 <BR>  在开发JMF 应用程序之前要完全理解JMF 
的体系架构、接口和类。就拿我们的家用摄像机系统作个例子。首先用摄像机拍摄内容,拍摄下来的内容录制在DV带中。DV带可以放在放像机里播放、放像机提供视频信号给电视机,提供音频信号给音箱,这样我们就可以在电视机上看到画面,从音箱里听到声音。JMF 
API 提供的也是同样的模型。 <BR>  JMF 提供的模型可大致分为七类 <BR>  * 数据源(Data source) <BR>  * 
截取设备(Capture Device,包括视频和音频截取设备) <BR>  * 播放器(Player) <BR>  * 处理器(Processor) 
<BR>  * 数据池(DataSink) <BR>  * 数据格式(Format) <BR>  * 管理器(Manager) <BR>  1.2 
如何应用JMF捕获媒体数据 <BR>  可以应用JMF从摄像头和麦克风中采集数据,采集后的数据可以被处理、保存、渲染为以后应用。 
<BR>  捕获媒体数据需要做以下工作。1.定位所需要用的捕获设备,可以通过查询CaptureDeviceManager来定位。2.获取这个捕获设备的信息CaptureDeviceInfo对象。3.从CaptureDeviceInfo对象中获取捕获设备的位置Medialocator。4.利用MediaLocator创建DataSource。5.使用DataSource创建Player或是Processor。6.然后启动Player就开始了媒体的捕获。 
<BR>  如果只是想观看捕获的内容,只需要使用捕获数据源创建播放器Player即可。如果想把捕获的数据发送到网络或者保存起来,就需要创建处理器Processor。 
<BR>  可以从CaptureDeviceManager中获取捕获设备的信息。CaptureDeviceManager是可在JMF中使用的全部捕获设备的注册中心。可以通过调用CaptureDeviceManager的getDeviceList方法获取可用的捕获设备列表。 
<BR>  每个捕获设备都由CaptureDeviceInfo对象代表,要获取一个特定的设备只需要调用CaptureDeviceManager的getDevice方法。 
<BR>  从特定的设备捕获媒体数据,需要从它的CaptureDeviceInfo对象中获取这个设备的位置信息MediaLocator。可以用MediaLocator直接构建一个Player或者Processor。还可以用MediaLocator构建一个DataSource作为Player的输入。当Play开始的播放的时候,就开始捕获过程。 
<BR>  一个捕获设备通常有一系列属性可以进行配置。通常控制分为2种,一种是端口控制PortControl,另一种是监视MonitorControl。可以通过调用捕获DataSource的getControl方法,来获取这两种控制对象。 
<BR>  和其他的控制对象一样,对于PortControl或者MonitorControl都可以通过调用getControlCompent方法来得到它们的可视化组件。这些组件可以添加到Applet中或者应用程序中,这样用户可以和这些控制对象交互。 
<BR>  处理显示控制组件,还可以显示标准的Player控制组件。 <BR>  1.3如何使用RTP接收和发送流媒体数据 <BR>  JMF Player 和 
Processor 可以提供显示、获取、转换RTP 数据流的机制。 <BR>  可以按照标准的方式通过Manger为RTP数据流创建Player。使用包含RTP 
Session的MediaLocator作为参数,调用Manager的createPlayer(MediaLocator)来创建Player。也可以用某个接收数据流的DataSource作为参数来创建Player。 
<BR>  如果用MediaLocator作为参数来创建Player, Player 只会显示Session中检测到的第一个RTP 
数据流。如果想播放Session中的所有视频流,则需要调用SessionManager为每个接收数据流创建一个Player。 
<BR>  当使用MediaLocator为RTP Session 
创建Player,Manager为Session中的第一个数据流创建Player。当检测到数据时,Player发出RealizeCompleteEvent。 
<BR>  通过监听RealizeCompleteEvent,可以确定数据是否到了以及Player是否可以播放任何数据。一旦Player发出这个事件,就可以获取Player的可视组件和控制组件。 
<BR>  要注意的是,如果在没有检测到Session中数据时,Player 是不会结束Realizing状态的。对于Rtp 媒体流Player 
不能试图调用Manager的CreateRealizedPlayer。如果调用,会引起死锁。 <BR>  1.4如何在网络发送流媒体数据 
<BR>  在发送RTP数据流之前,需要应用Processor产生RTP编码的数据源。通过构建一个SessionManager或者是DataSink来控制传输过程。 
<BR>  Processor处理器的输入可以是现有的媒体文件,也可以是实时捕获的数据。对于现有的媒体数据,可以使用MediaLocaotr来代表媒体文件。并根据MediaLocator来创建Processor。对于捕获的媒体数据,一个捕获数据源Capture 
DataSource 会用作Processor的输入。 <BR>  有两种方式来发送RTP数据流,一种是用MediaLocator作为RTP 
session的参数,调用Manager的createDataSink方法来创建一个RTP DataSink。另一种方式是利用session manager 
来创建发送数据流,并控制传输过程。 <BR>  当利用MediaLocator来构建RTP 
DataSink的时候,你只能发送DataSource中的第一个数据流。如果需要在一个进程中发送多个RTP数据流或者需要监控进程的统计状态,就需要直接使用SessionManager。 
<BR>  无论采用哪种方式传输RTP数据流,都需要做如下工作: 
<BR>  1、使用DataSource创建Processor,这个DataSource代表你要传输的数据 <BR>  2、设置Processor的输出为RTP 
编码的数据 <BR>  3、取得Processor的输出作为DataSource <BR>  二.具体的试验-应用JMF开发视频应用 
<BR>  2.1配置开发环境 <BR>  需要J2SDK,JRE1.42, JMF Windows Performance Pack,JMF 的 
下载地址:http://java.sun.com/products/java-media/jmf/2.1.1/setup.html 针对WINDOWS 
用户,可下载Windows Performance Pack。只有安装Windows Performance 
Pack才支持视频、音频捕获。下载后会自动安装,自动配置路径。安装后需去测试一下是否安装成功。测试地址:http://java.sun.com/products/java-media/jmf/2.1.1/jmfdiagnostics.html 
<BR>  2.2用APPLET在浏览器中播放视频短片 <BR>  在浏览器中实现APPLET 视频播放中用到了两个基本概念 manager 
,和player。JMF APPLET 
是播放视频文件的过程是这样的。首先,提供媒体文件的位置作为创建PLAYER的参数。Player创建后会根据媒体文件的格式寻找解码器,并且进行初始化。然后为PLAYER 
添加一个ControllerListener,用来监听PLAYER的状态。通过监听player 的状态采取不同的措施。在Player 
发出RealizeCompleteEvent的时候,可以获取player 的VisualComponent 
宽度,高度,VisualControllpane的宽度,高度。最后一步调用player的start方法,就可以显示媒体文件的内容了。如果不使用PLUGIN,JMF 
只支持标准的AVI,MOV,WAV 文件。对于流行的MPEG4视频文件,MP3并不支持。通过安装解码器,可以播放这些文件。 <BR>  2.3采集摄像头数据 
<BR>  采集摄像头数据,需要两步工作。连接视频设备,然后获取视频设备的数据。视频,音频设备在Jmf Performance Pack 安装时会在JMF 
Registry中注册自己的设备名。需要连接摄像头时,可以通过查找摄像头的设备名来连接摄像头。具体的实现步骤,首先要得到Device的名字,有两种方法可以办到, 
<BR>  方法一 <BR>  通过菜单,把系统支持的Device都列出来,根据客户的选择来确定。 <BR>  方法二 
<BR>  用程序来判断。在第二种方法中,通过传递一个Format 对象到CaptureDeviceManager的getDeviceList 
方法中,获得Device的名字。得到Device 
的名字以后,可以获得CaptureDeviceInfo,从而得到MediaLocator。第一部分连接摄像头的工作就完成了。下一步工作是捕获摄像头视频,并显示出来。有视频设备构成的数据源可分为2种,例如照相机这种设备,属于Pull 
DataSource,用的时候才使用。类似于摄像头这种设备构成的数据源属于Push 
Datasource,源源不断的发送视频数据。以获取的MediaLocator 作为参数构建Player,就可以播放摄像头内容了。 
<BR>  2.4获取摄像头视频数据和麦克风音频数据 
<BR>  基本步骤是首先获取视频、音频捕获设备的信息,然后再根据取得的设备信息确定设备的位置。找到设备的位置以后,调用Manager的CreatePlayer方法创建Player,当Player开始播放的时候,就开始了捕获的过程。 
<BR>  有多种方法获得捕获设备信息,可以通过查询指定的格式,也可以查询特定的设备名字。具体步骤如下: <BR>  1. 先把所有的捕获设备调出来 
<BR>  2. 所有的视频捕获设备的名字都是以vfw开头的,所以取得捕获设备列表中以vfw 开头的设备名字就是视频捕获设备 <BR>  3. 
获取设备的medialocator地址 <BR>  4. 创建Player,当Play开始的时候,就开始了视频捕获的过程 
<BR>  2.5保存摄像头数据为视频文件 
<BR>  首先是找到捕获设备,然后取的捕获设备的位置信息。如果要保存所采集的数据,就要创建一个处理器。然后将处理器的输出作为数据池的输入。当启动数据池的时候,就可以把捕获的数据保存成文件了。具体步骤如下: 
<BR>  1. 获取视频捕获设备的medialocator地址 <BR>  2. 以获取的medialocator为参数,创建Processor 
<BR>  3. 设置Processor,输出类型为AVI格式 <BR>  4. 以Processor的输出为参数,创建数据源 <BR>  5. 
建立一个保存文件位置的MediaLocator <BR>  6. 以输入数据源和输出数据源为参数,建立一个DATASINK <BR>  7. 
调用Processor的StreamWriterControl,设置Processor控制生成文件的大小 <BR>  8. 
设置完毕,可以启动Processor和DataSink来保存捕获数据了 <BR>  2.6 捕获音频、视频数据为QuickTime格式的文件 
<BR>  使用处理器模型来捕获实时的视频、音频数据并且将数据轨道进行编码、混合,最后保存为QuickTime 格式的文件。 
<BR>  首先构建一个处理器模型,设定好特定的数据轨道和输出内容格式。然后使用这个处理器模型来创建一个处理器。处理器会自动连接到符合文件格式要求的捕获设备。具体步骤如下: 
<BR>  1. 设定要输出的音频格式和视频格式 <BR>  2. 设定要输出的文件类型为QuickTime格式 <BR>  3. 
以数据轨道输出格式和文件输出类型为参数,创建ProcessorModel <BR>  4. 由ProcessorModel对象创建Processor对象 
<BR>  5. 以Processor的输出为参数创建数据源 <BR>  6. 建立一个记录保存文件的MediaLocator <BR>  7. 
创建DataSink <BR>  8. 开始保存数据文件,启动处理器 <BR>  9. 当结束捕获视频时,停止处理器,并关掉它 <BR>  10. 
当数据池接到EndOfStream事件时,停止保存文件。 <BR>  2.7 发送实时媒体数据 
<BR>  如果需要将媒体数据发送到网络,首先需要用Processor生成RTP编码的数据源,然后创建SessionManager或者DataSink来控制传输过程。具体步骤如下: 
<BR>  1. 获取视频采集设备 <BR>  2. 创建Processor,连接到视频采集设备 <BR>  3. 
等待,直到processor的状态变成configured,设置输出格式为RAW_RTP <BR>  4. 列出所有的和数据轨道相关的控制器 <BR>  5. 
遍历这些控制器,找到可以控制输出格式的控制器 <BR>  6. 
找到了数据轨道的格式控制器之后,设置输出格式,输出格式输出为VideoFormat.JPEG_RTP <BR>  7. 
准备工作已经做好,可以调用Processor的realize方法 <BR>  8. 
当Processor进出realized状态以后,可以取得Processor的输出作为数据源 <BR>  9. 
可以把这个数据源作为参数传递给manager,通过manager创建一个RTP的数据池。 <BR>  10. 先设置一个发送数据流的多播目的网址 
<BR>  11. 
确定了数据源和发送地址,可以建立数据池DataSink了,建立成功后调用open()和start()方法,就可以在网上以多播方式发送捕获的内容了 
<BR>  2.8 接收实时视频数据 <BR>  接收网上传输的数据流时,首先要构建一个MediaLocator来描述RTP 
进程,Manager为进程中的第一个数据流创建播放器,当从进程中检测到数据时,Player会发出RealizeComplete事件。 
<BR>  通过监听RealizeComplete事件,你可以确定是否有数据到了,还可以确定Player是否准备好播放数据了。当Player发出这个事件时,就可以获取播放器的可视面板和控制面板了。具体实现步骤如下: 
<BR>  1. 确定RTP 数据源的地址,例如:String url= "rtp://224.144.251.104:49150/audio/1" 
<BR>  2. 以RTP数据源地址为参数,创建MediaLocator <BR>  3. 以MediaLocator为参数,创建Player <BR>  4. 
为PLAYER添加监听器,以便监听RealizeComplete事件 <BR>  三. 实验效果总结 <BR>  JMF2.0 
支持媒体捕获,并且考虑到了程序开发者需求。允许程序开发者在媒体处理、媒体控制上添加自己的控制器。JMF 
提供的插件的架构使得直接访问媒体数据成为可能。这样JMF可以更方便的被扩展。JMF的设计目的是使开发简便、支持媒体捕获、支持使用JAVA技术开发媒体传输以及视频会议等应用、支持高级开发者开发插件扩展JMF应用,新的特性还可以和原有的系统很好的融合。允许开发者开发定制的,可下载的编码器、处理器、分离器和组合器。 
<BR>  JMF的类库还可以提供对RTP(实时传输协议)的支持。RTP支持在网上实时的发送、接收媒体流。RTP可以用在开发视频点播、音频点播或者网上的交互内容服务等应用。 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -