为什么JMF没有使用Mjsip进行音频流传输?

时间:2012-01-28 05:38:28

标签: java audio-streaming rtp jmf

我正在使用Mjsip来创建一个软电话。在代码中有三种类型的音频绑定选项。

  1. 使用JMF(Java Media Framework)
  2. 使用Java音频
  3. 使用RAT(强大的音频工具)
  4. 我没有使用RAT。它的价值被我自己弄错了。这是调用JMF的代码:

    public JMFAudioLauncher(int local_port, String remote_addr, int remote_port, int direction, Log logger)
    {  
        log=logger;
        localport=local_port;
        remoteport=remote_port;
        remoteaddr=remote_addr;
        // Patch for working with JMF with local streams
        if (remote_addr.startsWith("127."))
        {  
            printLog("Patch for JMF: replaced local destination address "+remote_addr+" with 255.255.255.255");
            remote_addr="255.255.255.255";
        }
        dir=direction;
        if (dir>=0) sender=new JMediaSender("audio",null,remote_addr,remote_port);
        if (dir<=0) receiver=new JMediaReceiver("audio",local_port,null);
    }
    
    /** Starts media application */
    public boolean startMedia()
    {  
        printLog("launching JMF-Audio...");
        String err1=null, err2=null;
    
        if (sender!=null) err1=sender.start();
        if (err1!=null) printLog("Error trying to send audio stream: "+err1);    
    
        if (receiver!=null) err2=receiver.start();
        if (err2!=null) printLog("Error trying to receive audio stream: "+err2);    
    
        return (err1==null && err2==null);      
    }
    
    /** Stops media application */
    public boolean stopMedia()
    {  
        String err1=null, err2=null;
    
        if (sender!=null) err1=sender.stop();      
        if (err1!=null) printLog("Error stopping audio sender: "+err1);    
    
        if (receiver!=null) err2=receiver.stop();      
        if (err2!=null) printLog("Error stopping audio receiver: "+err2);    
    
        return (err1==null && err2==null);      
    }
    

    但它尚未推出。我仍然可以和我的软电话交谈。但在日志中显示......

    UA: REGISTRATION
    UA: Registration success: 200 OK
    UA: INCOMING
    UA: CONFIRMED/CALL
    UA: Error trying to create the JMFAudioLauncher
    AudioInput: TargetDataLine: com.sun.media.sound.DirectAudioDevice$DirectTDL@239525
    AudioOutput: SourceDataLine: com.sun.media.sound.DirectAudioDevice$DirectSDL@f942c4
    AudioLauncher: starting java audio..
    

    但是对于user_agent_profile使用JMF值是正确的,并且从该代码生成错误。

    if (user_profile.audio && local_audio_port!=0 && remote_audio_port!=0)
         {  
             if (user_profile.use_rat)
             // create an audio_app and start it
             {  
                audio_app=new RATLauncher(user_profile.bin_rat,local_audio_port,remote_media_address,remote_audio_port,log);
             }
             else if (user_profile.use_jmf)
            {  
                // check if JMF is supported
                try
                {  
                    Class myclass=Class.forName("local.ua.JMFAudioLauncher");
                    Class[] parameter_types={ Class.forName("int"), Class.forName("java.lang.String"),Class.forName("int"), Class.forName("int"), Class.forName("org.zoolu.tools.Log") };
                    Object[] parameters={ new Integer(local_audio_port), remote_media_address, new Integer(remote_audio_port), new Integer(dir), log };
                    java.lang.reflect.Constructor constructor=myclass.getConstructor(parameter_types);
                    audio_app=(MediaLauncher)constructor.newInstance(parameters);
    
                }
                catch (Exception e)
                {  
                    printException(e,LogLevel.HIGH);
                    printLog("Error trying to create the JMFAudioLauncher",LogLevel.HIGH);
                }
            }
            // else
            if (audio_app==null)
            {  
                // for testing..
                String audio_in=null;
                if (user_profile.send_tone) audio_in=JAudioLauncher.TONE;
                else if (user_profile.send_file!=null) audio_in=user_profile.send_file;
                String audio_out=null;
                if (user_profile.recv_file!=null) audio_out=user_profile.recv_file;        
    
                //audio_app=new JAudioLauncher(local_audio_port,remote_media_address,remote_audio_port,dir,log);
                audio_app=new JAudioLauncher(local_audio_port,remote_media_address,remote_audio_port,dir,audio_in,audio_out,user_profile.audio_sample_rate,user_profile.audio_sample_size,user_profile.audio_frame_size,log);
            }
            audio_app.startMedia();
        }
    

    如何启用JMF?

1 个答案:

答案 0 :(得分:2)

您能否花一些时间在这部分代码中查找错误行?

// check if JMF is supported
try{  
    Class myclass=Class.forName("local.ua.JMFAudioLauncher");
    Class[] parameter_types={ Class.forName("int"), Class.forName("java.lang.String"),Class.forName("int"), Class.forName("int"), Class.forName("org.zoolu.tools.Log") };
    Object[] parameters={ new Integer(local_audio_port), remote_media_address, new Integer(remote_audio_port), new Integer(dir), log };
    java.lang.reflect.Constructor constructor=myclass.getConstructor(parameter_types);
    audio_app=(MediaLauncher)constructor.newInstance(parameters);
    }
catch (Exception e){  
    printException(e,LogLevel.HIGH);
    printLog("Error trying to create the JMFAudioLauncher",LogLevel.HIGH);
    }