`

JMF ,RTP流的录音保存问题?

 
阅读更多
package gov.nist.applet.phone.media.messaging;

import java.awt.FileDialog;
import java.awt.Frame;
import java.io.IOException;

import javax.media.CannotRealizeException;
import javax.media.ConfigureCompleteEvent;
import javax.media.ControllerEvent;
import javax.media.ControllerListener;
import javax.media.DataSink;
import javax.media.Format;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.NoDataSinkException;
import javax.media.NoProcessorException;
import javax.media.NotConfiguredError;
import javax.media.Player;
import javax.media.Processor;
import javax.media.ProcessorModel;
import javax.media.RealizeCompleteEvent;
import javax.media.control.TrackControl;
import javax.media.format.AudioFormat;
import javax.media.format.VideoFormat;
import javax.media.protocol.DataSource;
import javax.media.protocol.FileTypeDescriptor;


//import jmapps.util.StateHelper;

public class SaveAudioVideo2File {

    /**
     * @param args
     */
    Processor processor;
    DataSource dataSource;
    DataSink dataSink;
    StateHelper state;
    MediaLocator mediaLocator;
    boolean encodingOK = false;


    public boolean record(DataSource ds)
    {
       
        try {
   
            this.processor = Manager.createProcessor(ds);
           
        } catch (Exception e1)
        {
            System.err.println("no such processor exception");
            e1.printStackTrace();
            return false;
        }
        this.state = new StateHelper(processor);
             if(!state.configure(1000))
        {
            System.out.println("configure error :");
            return false;
        }

//      // 设置存储录像文件的格式为 .QUICKTIME 
      processor.setContentDescriptor(new FileTypeDescriptor(FileTypeDescriptor.QUICKTIME)); 

        // realize the processor,让 processor 进入 realized 状态 
      if (!state.realize(1000)) { 
          System.out.println("realize error!"); 
          return false;
      } 
   
        boolean encodingOK = false;

        encodingOK = setTracks(processor, encodingOK);
        if(!encodingOK)
        {
            System.err.println("encoding error!");
            return false;
        }
       
        try
        {
            this.dataSink = Manager.createDataSink(processor.getDataOutput(), getMediaLocator());
        } catch (NoDataSinkException e1)
        {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
       
        try
        {
            dataSink.open();
            dataSink.start();
        } catch (SecurityException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        } catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }
       
        processor.start();
        return true;
    }
   
    private MediaLocator getMediaLocator()
    {

         Frame saveVideoFrame = new Frame("保存视频文件"); 
         FileDialog saveVideoFileDialog = new FileDialog(saveVideoFrame, "保存视频文件", FileDialog.SAVE); 
         saveVideoFileDialog.setFile(".mov"); 
         saveVideoFileDialog.setVisible(true); 
         String videoFileSavePath = saveVideoFileDialog.getDirectory(); 
         String videoFileSaveName = saveVideoFileDialog.getFile(); 
                 if (videoFileSaveName != null) { 
             videoFileSavePath = videoFileSavePath.replace("\\", "/"); 
             String destinationString = "file:///" + videoFileSavePath + videoFileSaveName;   
             MediaLocator mediaLocator = new MediaLocator(destinationString); 
             return mediaLocator;
         }
         //if a user not choose a file path,then
         return new MediaLocator("file://d:/media.mov");
    }
    public void stopRecord()
    {
   
            dataSink.close();
            processor.close();
            processor.deallocate();//回收内存
            processor = null;
           
       

    }
    public void setDataSource(DataSource ds)
    {
        this.dataSource = ds;
    }
    /**
     * save the position you wanted to save this file
     * @param ml
     */
    public void setMediaLocator(MediaLocator ml)
    {
        this.mediaLocator = ml;
    }
    private static boolean setTracks(Processor p, boolean encodingOK)
            throws NotConfiguredError
    {
        TrackControl tracks[] = p.getTrackControls();
        for(int i=0;i<tracks.length;i++)
        {
            if(tracks[i].getFormat() instanceof AudioFormat)
            {
                tracks[i].setFormat(new AudioFormat(AudioFormat.IMA4));
                encodingOK = true;
            }
            else if(tracks[i].getFormat() instanceof VideoFormat)
            {
                tracks[i].setFormat(new VideoFormat(VideoFormat.H263));
                encodingOK = true;
            }
            else
                tracks[i].setEnabled(false);
        }
        return encodingOK;
    }
   
      public class StateHelper implements ControllerListener { 
            Player xplayer = null; 
            boolean configured = false; 
            boolean realized = false; 
            // boolean prefetched = false; 
            // boolean eom = false;// End of media. 
     
            boolean failed = false; 
            boolean closed = false; 
     
            public StateHelper(Player p) { 
                xplayer = p; 
                p.addControllerListener(this); 
            } 
     
            public boolean configure(int timeOutMillis) { 
                // RealizeCompleteEvent 发生了的话使 ce 事件与之比较,若相等,那么 realized 为 true。 
                /*
                 * 监听 ConfigureCompleteEvent 和 ConfigureCompleteEvent 事件的发生。
                 * 如 ConfigureCompleteEvent 事件发生,那么就会赋给 configured 为 ture, 使得 public
                 * boolean configure 方法中的 while (!configured && !failed){} 这个循环退出。
                 */ 
                long startTime = System.currentTimeMillis(); 
                synchronized (this) { 
                    if (xplayer instanceof Processor) { 
                        ((Processor) xplayer).configure(); 
                    } else { 
                        return false; 
                    } 
                    while (!configured && !failed) { 
                        try { 
                            wait(timeOutMillis); 
                        } catch (InterruptedException ex) { 
                            ex.printStackTrace(); 
                        } 
                        if (System.currentTimeMillis() - startTime > timeOutMillis) { 
                            break; 
                        } 
                    } 
                } 
                return configured; 
            } 
     
            public boolean realize(int timeOutMillis) { 
                long startTime = System.currentTimeMillis(); 
                synchronized (this) { 
                    xplayer.realize(); 
                    while (!realized && !failed) { 
                        try { 
                            wait(timeOutMillis); 
                        } catch (InterruptedException ie) { 
                            ie.printStackTrace(); 
                        } 
                        if (System.currentTimeMillis() - startTime > timeOutMillis) { 
                            break; 
                        } 
                    } 
                } 
                return realized; 
            } 
     
            public synchronized void controllerUpdate(ControllerEvent ce) { 
                if (ce instanceof RealizeCompleteEvent) { 
                    realized = true; 
                } else if (ce instanceof ConfigureCompleteEvent) { 
                    configured = true; 
                } else { 
                    return; 
                } 
                notifyAll(); 
            } 
        } 

}


调用这个类的时候,我传过来的参数是通过RTPManager 管理接收的RTP流,通过update()方法中监听NewReceiverStream事件,当收到一个NewStream的时候,stream=((NewStreamEvent)event).getReceiveStream().DataSource ds = stream.getDataSource();

我建立了2个RTP流,一个是视频,一个是音频的。

                if (ctl.getFormat() instanceof VideoFormat)
                {
                    PlayerWindow pw = new PlayerWindow(p, stream);
                    playerWindows.addElement(pw);
                    videoDataSource = ((SourceCloneable)clonedSource).createClone();      
                }
               
                else if(ctl.getFormat() instanceof AudioFormat)
                {
                    DataSource clonedDataSource3 = ((SourceCloneable)clonedSource).createClone();
                    audioDataSource = clonedDataSource3;
                }







    saveMedia = new SaveAudioVideo2File();
             if(videoDataSource!=null&&audioDataSource!=null)
                {
                    try
                    {
                        mergeDataSource = Manager.createMergingDataSource(
                                new DataSource[]{audioDataSource,videoDataSource,});
                        saveMedia.record(mergeDataSource);
                    } catch (IncompatibleSourceException e)
                    {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }   
                }
                else if(videoDataSource!=null)
                {
                    saveMedia.record(videoDataSource);
                }
                else if(audioDataSource!=null)
                {
                    saveMedia.record(audioDataSource);
                }





通过Debug调试可以看到创建的是克隆的混合的DataSource,当录音的时候,就会出现不可以Configure the processor 的异常。我一直找不到为什么不可以configure,请问哪位大侠可以指点一二不?急急!!1111111111111
分享到:
评论

相关推荐

    jmf rtp 传输视频例子

    对于视频传输,JMF提供了对RTP的支持,使得视频流可以在网络上进行实时传输。 RTP是一种应用层协议,它与RTCP(实时传输控制协议)一起工作,以确保数据的可靠传输。RTP负责传输媒体数据,而RTCP则负责监控传输质量...

    jmf rtp 视频音频传输聊天

    Java Media Framework (JMF) 和 Real-Time Transport Protocol (RTP) 是在开发视频音频传输聊天应用时常用的技术。本文将详细介绍这两个技术以及如何利用它们实现一个聊天应用。 **Java Media Framework (JMF)** ...

    测试JMF发送和接受RTP流,纯java编写

    标题“测试JMF发送和接受RTP流,纯java编写”涉及到两个关键概念:JMF的流化能力和RTP协议的使用。在这个场景下,开发者可能创建了一个Java程序,利用JMF将本地多媒体文件转化为RTP流,并通过网络发送出去,然后接收...

    JMF-rtp.zip_JMF RTP_JMF_RTP_java rtp 摄像头_jmf_视频传输 java

    利用jmf进行rtp传输,在本地测试调用摄像头进行视频通讯 . 在Sender和Receiver中的main函数中,我把本地地址和远端地址都设置成本机的地址,自己传给自己,用来试验用的。 其中用到 StateHelper类 。 Sender的前两...

    基于jmf的rtp传输demo

    【基于jmf的rtp传输demo】是一个演示项目,展示了如何使用Java Media Framework (JMF) 实现RTP(Real-time Transport Protocol)进行音频文件的实时传输。JMF 是一个开源框架,它允许开发者处理多媒体内容,如音频和...

    JMF的rtp视频音频聊天

    JMF的rtp视频音频聊天,供大家一起共同分享学习。

    JMF-RTP.rar_jmf_rtp java_rtp 语音视频_视频传输_视频语音

    4. **接收与解码**: 在接收端,RTP包被接收并解封,JMF会根据接收到的RTP数据进行解码,恢复原始的音频或视频流。 5. **播放**: 解码后的数据被送到JMF播放器,用户可以听到声音或看到视频。 6. **质量控制与同步**:...

    jmf实现流媒体播放

    ### jmf实现流媒体播放 #### 重要知识点概述 本文主要介绍了如何使用Java Media Framework (JMF) 来实现流媒体播放。文章首先简要介绍了流媒体的基本概念和技术原理,随后详细阐述了基于JMF的流媒体播放器设计与...

    论文:基于RTP流媒体实时传输的Java实现

    ### 基于RTP流媒体实时传输的Java实现 #### 引言 随着信息技术的迅猛发展,网络应用已经从单纯的信息浏览和电子邮件等...未来,随着5G等高速网络技术的普及,RTP和JMF在流媒体实时传输领域的应用将会更加广泛和深入。

    关于解决JMF与win7不兼容问题?

    由于JMF可能需要与硬件设备交互,特别是在处理来自摄像头的实时流媒体时,因此“usbvideo”可能与JMF在Windows 7上的不兼容问题有关。解决这个问题可能需要更新驱动程序,或者寻找替代的媒体框架,比如OpenCV、VLCj...

    基于RTP流媒体实时传输的Java实现

    本文将重点介绍如何使用JMF实现基于RTP的流媒体实时传输。 #### 二、实时传输协议RTP ##### 2.1 RTP概述 RTP是为交互式的语音、视频、仿真数据等实时多媒体应用而设计的一种传输协议。它主要支持一对一或多对一的...

    java_rtp 实现视频播放与保存

    Java RTP(Real-time Transport Protocol)是Java编程语言中用于实现实时数据传输,特别是音频和视频流的一种协议。RTP通常与RTCP(Real-time Transport Control Protocol)一起使用,为实时多媒体通信提供服务质量...

    基于RTP实时传输协议的JMF多媒体传输 源代码

    RTPManager是JMF中的一个核心组件,负责管理RTP会话和流媒体的传输。RTPManager可以创建、管理和控制RTP会话,并提供了接口来处理RTP数据包。 知识点4: ReceiveStreamListener ReceiveStreamListener是一个JMF中的...

    基于RTP协议及JMF框架的视屏实时传输源码

    提供的源码包含了解决这个问题的具体实现,对于学习和理解RTP与JMF结合的视频实时传输非常有价值。通过源码,开发者可以深入研究如何使用JMF进行多媒体处理,以及如何利用RTP协议进行数据传输。源码中的注释应该能...

    java rtp 接受发送声音

    可以使用JMF的缓冲机制来缓解这个问题。 2. 同步:使用RTCP进行媒体同步,确保多个音视频流的正确对齐。 3. QoS:考虑实施QoS策略,如DiffServ或 RSVP,确保音频数据的优先传输。 六、实战示例 在实际项目中,可以...

    java版rtp视频流客户端

    8. **网络流控制**: 对于带宽管理、丢包重传等网络层面的优化也是RTP客户端需要考虑的问题,可能需要实现自己的错误恢复策略。 9. **安全性**: 考虑到网络安全,可能需要实现加密机制,如SRTP(Secure RTP),来...

    jmf流媒体播放器软件

    JMF(Java Media Framework)流媒体播放器软件是一种基于Java技术的多媒体处理框架,主要用于处理音频、视频和动画等内容。这个软件在IT领域,尤其是开发P2P流媒体系统时,扮演着重要的角色。JMF为开发者提供了一个...

Global site tag (gtag.js) - Google Analytics