Java网络流媒体播放器分析.docx
- 文档编号:8417200
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:16
- 大小:23.05KB
Java网络流媒体播放器分析.docx
《Java网络流媒体播放器分析.docx》由会员分享,可在线阅读,更多相关《Java网络流媒体播放器分析.docx(16页珍藏版)》请在冰豆网上搜索。
Java网络流媒体播放器分析
Java网络流媒体播放器分析
本节利用上面介绍的利用JMF框架开发开发视频和音频捕捉程序,以及如何发送和接收捕捉到的流媒体数据的开发过程来设计一个视频,音频捕捉综合处理系统,本程序主要实现的功能有:
(1)读取系统中己安装的音频和视频设置,然后区分设置类型,添加到设置列表中。
(2)根据所选择的设备,捕捉视频和音频数据并播放捕捉到的媒体数据。
(3)对正在播放的视频数据正进拍照并保存为图片。
(4)保存捕捉到的视频和音频数据到一个媒体文件,其格式可以是AVI或MOV。
(5)发送实时媒体数据到网络中。
(6)接收一个实时媒体流数据并播放。
(7)同时接收多个实时数据流并播放。
程序运行主界面如图14-11所示。
图14-11视频和音频捕捉程序运行主界面
当选择同时接收多个实时数据流时,系统会自动弹出收到的每个媒体流的播放窗口,这样就以同时查看多个媒体流的视频数据。
多个媒体流视频播放窗口如图14-12所示。
图14-12多个媒体流视频播放窗口
14.4.2媒体设备捕捉和发送类
实现媒体设备捕捉和发送类CaptureAudio代码如清单14-6。
清单14-6
packagecom.javapp.ch14;
importjavax.media.*;
importjavax.media.bean.playerbean.MediaPlayer;
importjavax.media.control.*;
importjavax.media.format.*;
importjavax.media.protocol.*;
importjavax.media.util.BufferToImage;
importcom.sun.image.codec.jpeg.*;
publicclassCaptureAudio{
VectordeviceList=newVector();//用于保存设备
Vector
Vector
MediaPlayeraudioplayer=null;//音频播放器
MediaPlayervideoplayer=null;//视频播放器
PlayerdualPlaye=null;//能同时播放音频和视频
MediaLocatoraudiolocator=null;//音频设备的位置信息
MediaLocatorvideolocator=null;//视频设备的位置信息
javax.media.Processorvprocessor=null;//媒体处理器,用于保存视频
DataSinkfilewriter=null;//保存视频数据池
CaptureDeviceInfoaudiocaptureInfo,videocaptureInfo;//设备信息
{
audioplayer=newMediaPlayer();//初始化播发器
videoplayer=newMediaPlayer();
}
publicProcessorgetVprocessor(){
returnthis.vprocessor;
}
publicPlayergetDualPlaye(){
returnthis.dualPlaye;
}
publicMediaPlayergetVideoplayer(){
returnthis.videoplayer;
}
publicMediaPlayergetAudioplayer(){
returnthis.audioplayer;
}
publicCaptureAudio(){//读取设备列表
deviceList=CaptureDeviceManager.getDeviceList(null);
if(deviceList!
=null&deviceList.size()>0){
intdeviceCount=deviceList.size();
Format[]formats;
for(inti=0;i CaptureDeviceInfocdi=(CaptureDeviceInfo)deviceList .elementAt(i); formats=cdi.getFormats(); System.out.println(cdi.getName()); for(intj=0;j if(formats[j]instanceofAudioFormat){ audioDevices.addElement(cdi);//音频设备 break; }elseif(formats[j]instanceofVideoFormat){ videoDevices.addElement(cdi);//视频设备 break; } } } } } publicVector returnthis.audioDevices; } publicVector returnthis.videoDevices; } publicvoidplay(intaudio,intvideo){//开如捕捉视频 Manager.setHint(Manager.LIGHTWEIGHT_RENDERER,newBoolean(true)); audiocaptureInfo=audioDevices.get(audio); videocaptureInfo=videoDevices.get(video); audiolocator=audiocaptureInfo.getLocator(); videolocator=videocaptureInfo.getLocator(); videoplayer.setMediaLocator(videolocator); videoplayer.start(); audioplayer.setMediaLocator(audiolocator); audioplayer.start(); } publicvoidstop(){//停止捕捉 videoplayer.stop(); videoplayer.close(); audioplayer.stop(); audioplayer.close(); } publicvoidplayandsave(intaudio,intvideo){//能同时播放音频和视频 DataSource[]dataSources=newDataSource[2]; audiocaptureInfo=audioDevices.get(audio); videocaptureInfo=videoDevices.get(video); audiolocator=audiocaptureInfo.getLocator(); videolocator=videocaptureInfo.getLocator(); try{ Manager.setHint(Manager.LIGHTWEIGHT_RENDERER,newBoolean(true)); dataSources[0]=Manager.createDataSource(audiolocator); dataSources[1]=Manager.createDataSource(videolocator); DataSourceds=Manager.createMergingDataSource(dataSources); dualPlaye=Manager.createPlayer(ds); dualPlaye.start(); }catch(NoDataSourceExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); }catch(IncompatibleSourceExceptione){ e.printStackTrace(); }catch(NoPlayerExceptione){ e.printStackTrace(); } } publicvoidsavevideo(Stringtype){//保存视频 try{ Formatformats[]=newFormat[2]; FileTypeDescriptoroutputType=null; if(type.equals("avi")){//判断输出的文件类型格式 formats[0]=newAudioFormat(AudioFormat.IMA4_MS); formats[1]=newVideoFormat(VideoFormat.CINEPAK);//设置为AVI格式 outputType=newFileTypeDescriptor(FileTypeDescriptor.MSVIDEO); }elseif(type.equals("mov")){ formats[0]=newAudioFormat(AudioFormat.IMA4); formats[1]=newVideoFormat(VideoFormat.CINEPAK); outputType=newFileTypeDescriptor(FileTypeDescriptor.QUICKTIME);//QuickTime格式 } //创建ProcessorModel,参数为数据轨道输出格式和文件输出类型 //由ProcessorModel对象创建Processor对象 this.vprocessor=Manager.createRealizedProcessor(newProcessorModel(formats,outputType)); this.vprocessor.configure(); System.out.println("正在配置处理器,请稍后......"); this.vprocessor.realize(); //获取Processor的输出 DataSourcesource=vprocessor.getDataOutput(); Fileff=newFile("d: /vidio."+type); //建立一个记录保存文件的MediaLocator MediaLocatordest=newMediaLocator(ff.toURL()); //创建数据池 filewriter=Manager.createDataSink(source,dest); filewriter.open(); //设置Processor控制生成文件的大小,只要调用Processor的StreamWriterControl StreamWriterControlswc=(StreamWriterControl)vprocessor .getControl("javax.media.control.StreamWriterControl"); //设置生成文件大小最大5M if(swc! =null) swc.setStreamSizeLimit(5000000); filewriter.start();//开始保存数据文件,启动处理器 this.vprocessor.start(); System.out.println(this.vprocessor.getControlPanelComponent()); }catch(NoProcessorExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); }catch(NoDataSinkExceptione){ e.printStackTrace(); }catch(CannotRealizeExceptione){ e.printStackTrace(); } } publicvoidsaveaspic(){//摄像头拍照,保存为图片 FrameGrabbingControlfgc=(FrameGrabbingControl)this.getVideoplayer() .getControl("javax.media.control.FrameGrabbingControl"); Bufferbuf=fgc.grabFrame(); //获取当前祯并存入Buffer类 BufferToImagebio=newBufferToImage((VideoFormat)buf.getFormat()); Imageimg=bio.createImage(buf); //创建image图像缓冲区 BufferedImagebi=newBufferedImage(img.getWidth(null),img .getHeight(null),BufferedImage.TYPE_INT_RGB); //根据BufferedImage对象创建Graphics2D对象 Graphics2Dg2=bi.createGraphics(); g2.drawImage(img,null,null); FileOutputStreamout=null; java.util.Randomrand=newjava.util.Random();//随机产生文件名 Filefout=newFile("d: /Cameravideo"+rand.nextInt()+".jpg"); try{ out=newFileOutputStream(fout); //转换成JPEG图像格式 JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(out); JPEGEncodeParamparam=encoder.getDefaultJPEGEncodeParam(bi); param.setQuality(1f,false);//不压缩图像 encoder.setJPEGEncodeParam(param); encoder.encode(bi); out.close(); }catch(FileNotFoundExceptione){ e.printStackTrace(); }catch(ImageFormatExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } } publicvoidsetRTP(Stringtype,intdrive,Stringip){//发送实时媒体数据 DataSource[]dataSources=newDataSource[1]; videocaptureInfo=videoDevices.get(drive); videolocator=videocaptureInfo.getLocator(); try{ dataSources[0]=Manager.createDataSource(videolocator); DataSourceds=dataSources[0]; this.vprocessor=Manager.createProcessor(ds); this.vprocessor.configure(); while(this.vprocessor.getState()! =this.vprocessor.Configured) System.out.println("正在配置处理器,请稍后......"); ContentDescriptorcd=newContentDescriptor( ContentDescriptor.RAW_RTP); vprocessor.setContentDescriptor(cd); //列出所有的和数据轨道相关的控制器 TrackControltrack[]=vprocessor.getTrackControls(); booleanprogrammed=false; //遍历这些控制器,找到可以控制输出格式的控制器 for(inti=0;i Formatformat=track[i].getFormat(); if(track[i].isEnabled()&&formatinstanceofVideoFormat&&! programmed){ //找到了数据轨道的格式控制器之后,设置输出格式,输出格式输出为VideoFormat.JPEG_RTP>。 Dimensionsize=((VideoFormat)format).getSize(); floatframeRate=((VideoFormat)format).getFrameRate(); intw=(size.width%8==0? size.width: (int)(size.width/8)*8); inth=(size.height%8==0? size.height: (int)(size.height/8)*8); VideoFormatjpegFormat=newVideoFormat( VideoFormat.JPEG_RTP,newDimension(w,h), Format.NOT_SPECIFIED,Format.byteArray,frameRate); track[i].setFormat(jpegFormat); System.err.println("Videotransmittedas: "); System.err.println(""+jpegFormat); programmed=true; }else track[i].setEnabled(false); } while(this.vprocessor.getState()! =this.vprocessor.Realized){ System.out.println("正在配置处理器,请稍后......"); this.vprocessor.realize(); } //获取Processor的输出 DataSourcesource=vprocessor.getDataOutput(); //可以把这个数据源作为参数传递给manager,通过manager创建一个RTP的数据池。 //先设置一个发送数据流的多播目的网址 Stringurl="rtp: //"+ip+": 49150/audio"; MediaLocatormDest=newMediaLocator(url); //确定了数据源和发送地址,可以建立数据池DataSink了,建立成功后调用 //open()和start()方法,就可以在网上以多播方式发送捕获的内容了。 filewriter=Manager.createDataSink(source,mDest);//创建数据池 filewriter.open(); filewriter.start();//启动处理器 source.start(); vprocessor.start(); System.out.println(this.vprocessor.getControlPanelComponent()); }catch(NoProcessorExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); }catch(NoDataSinkExceptione){ e.printStackTrace(); }catch(NoDataSourceExceptione){ e.printStac
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 网络 流媒体 播放 分析