2013-11-20 87 views
1

我正在使用此代碼將音頻發佈到red5服務器,並通過發佈商演示測試它,看看我是否能夠聽到我在公開發布的內容。 數據包逐漸發送但無法聽到音頻。請幫助我,我無法弄清楚錯誤。無法播放使用XUGGLER編碼的音頻

package testx; 


import com.xuggle.ferry.IBuffer; 
import com.xuggle.xuggler.*; 
import com.xuggle.xuggler.IAudioSamples.Format; 

import javax.sound.sampled.*; 
public class Testx{ 

private static IContainer outContainer; 
private static IContainerFormat outContainerFormat; 
private static IStreamCoder outAudioCoder; 
private static IStream outAudioStream; 


public static void main(String args[]) 
{ 
    String urlOut ="rtmp://localhost:1935/oflaDemo/xxx"; 
    outContainer = IContainer.make(); 
    outContainerFormat = IContainerFormat.make(); 
    outContainerFormat.setOutputFormat("flv", urlOut, null); 
    int retVal = outContainer.open(urlOut, IContainer.Type.WRITE, outContainerFormat); 
    if (retVal < 0) { 
     System.out.println("Could not open output container"); 
     return; 
    } 



    outAudioStream = outContainer.addNewStream(1); 


    outAudioCoder = outAudioStream.getStreamCoder(); 
    ICodec cdc = ICodec.findEncodingCodec(ICodec.ID.CODEC_ID_AAC); 
    outAudioCoder.setCodec(cdc); 
    outAudioCoder.setSampleRate(44100); 
    outAudioCoder.setChannels(1); 

    outAudioCoder.setFrameRate(IRational.make(44100,1)); 
    outAudioCoder.setSampleFormat(Format.FMT_S16); 
    outAudioCoder.setBitRate(64000); 

    retVal = outAudioCoder.open(null,null); 
    if (retVal < 0) { 
     System.out.println("Could not open audio coder"); 
     return; 
    } 

    retVal = outContainer.writeHeader(); 
    if (retVal < 0) { 
     System.out.println("Could not write output FLV header: "); 
     return ; 
    } 






    AudioFormat audioFormat = new AudioFormat(44100, 

      (int)16, 

      1, 

      true, /* xuggler defaults to signed 16 bit samples */ 

      false); 



    TargetDataLine line = null; 

    DataLine.Info info = new DataLine.Info(TargetDataLine.class, audioFormat); 

    if (!AudioSystem.isLineSupported(info)) { 

     return; 



    } 

    // Obtain and open the line. 

    try { 

     line = (TargetDataLine) AudioSystem.getLine(info); 

     line.open(audioFormat); 

    } catch (LineUnavailableException ex) { 

     return; 

    } 



    // Begin audio capture. 

    line.start(); 


    long lastPos_out=0; 

    long audtioTime =0; 
    long startTime = System.nanoTime(); 
    while(1) 
    { 
     byte[] data = new byte[line.getBufferSize()/5]; 
     int sz = line.read(data, 0, data.length); 

    if(sz>0) 
    { 

      long nanoTs = System.nanoTime()-startTime; 
       IBuffer iBuf = IBuffer.make(null,data,0,sz); 
       System.out.println(iBuf.toString()); 
       IAudioSamples smp = IAudioSamples.make(iBuf, 1,IAudioSamples.Format.FMT_S16); 
       smp.setComplete(true,sz/2,44100,1,Format.FMT_S16, nanoTs/1000); 


       int samplesConsumed = 0; 
     while(samplesConsumed<smp.getNumSamples()){ 
       IPacket packet= IPacket.make(); 
       samplesConsumed +=outAudioCoder.encodeAudio(packet, smp, samplesConsumed); 

       if (packet.isComplete()) { 

        // packet.setKeyPacket(true); 
     packet.setPosition(lastPos_out); 
        packet.setStreamIndex(1); 
        lastPos_out+=packet.getSize(); 
        outContainer.writePacket(packet); 
       } 
      } 
     } 
    // try { 
    //  Thread.sleep((long)10000); 
     //} catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
     // e.printStackTrace(); 
    // } 



     } 
    } 

}

+0

需要一些幫助與此有關。我已經啓動了Red5服務器,並且當我運行代碼時,它會不斷髮出錯誤'ERROR com.xuggle.xuggler - 錯誤:正在寫入不存在的數據包(../../../。 ./../../../ csrc/com/xuggle/xuggler/Container.cpp:759)' 您是否知道問題所在? – wrahool

+0

無法發表評論,除非我看到您的代碼。 – Dapu

回答

0

解決了這個問題,我的麥克風音量非常低,價格爲16kHz,