2014-01-10 21 views
11

xugglerを使用してJavaでRTSPストリーミングサーバーを構築していますが、正しいRTPパケット化を実装する方法がわかりません。XugglerでRTPパケットにメディアファイルをエンコードする方法

私の現在のアプローチは、その後、入力されたコンテナにReadNextPacket(packet)を呼び出しpacket.getData()、適切なヘッダと、それを送信(ストリームインデックス、getTimestamp()で設定されたタイムスタンプ等に基づいて、ペイロードタイプ)によって充填されたペイロードを有するRTPパケットを作ることです。 を正しいrtpペイロードにエンコードする具体的な例を教えてくださいドキュメントはこれで少し欠けています。

+0

@streakあなたのリンクは壊れています –

+0

申し訳ありませんドメインが移動されています。 – streak

+1

私はそれが入力フォーマットに依存すると信じています。例えばMP3ファイル用にRTPペイロードを設定する方法については、https://tools.ietf.org/html/rfc5219を参照してください。他のRFCの他の形式を文書化しています。いずれの場合でも、入力形式は非常に重要です。たとえば、2つのパケット間でMP3フレームを分割したくない場合などです。 – colti

答えて

0

RTPサーバーの実装にjavax.mediaを使用したコードを見てきました。

class MediaConvertion { 
private MediaLocator mediaLocator = null; 

private DataSink dataSink = null; 

private Processor mediaProcessor = null; 

private static final Format[] FORMATS = new Format[] { new AudioFormat(
     AudioFormat.DVI_RTP) }; 

private static final ContentDescriptor CONTENT_DESCRIPTOR = new ContentDescriptor(
     ContentDescriptor.RAW_RTP); 

public MediaConvertion(String url) throws IOException, 
     NoProcessorException, CannotRealizeException, NoDataSinkException, 
     NoDataSinkException { 
    mediaLocator = new MediaLocator(url); 
} 

public void setDataSource(DataSource ds) throws IOException, 
     NoProcessorException, CannotRealizeException, NoDataSinkException { 

    mediaProcessor = Manager.createRealizedProcessor(new ProcessorModel(ds, 
      FORMATS, CONTENT_DESCRIPTOR)); 
    dataSink = Manager.createDataSink(mediaProcessor.getDataOutput(), 
      mediaLocator); 
} 

public void startTransmitting() throws IOException { 
    mediaProcessor.start(); 
    dataSink.open(); 
    dataSink.start(); 
} 

public void stopTransmitting() throws IOException { 
    dataSink.stop(); 
    dataSink.close(); 
    mediaProcessor.stop(); 
    mediaProcessor.close(); 
} 
} 

public class MediaConverterExample extends Frame implements ActionListener { 

Button st_stream; 
static MediaConvertion mdcon; 

public static void main(String args[]) throws IOException, 
     NoProcessorException, CannotRealizeException, NoDataSinkException, 
     MalformedURLException, NoDataSourceException { 
    Format input1 = new AudioFormat(AudioFormat.MPEGLAYER3); 
    Format input2 = new AudioFormat(AudioFormat.MPEG); 
    Format output = new AudioFormat(AudioFormat.LINEAR); 
    PlugInManager.addPlugIn("com.sun.media.codec.audio.mp3.JavaDecoder", 
      new Format[] { input1, input2 }, new Format[] { output }, 
      PlugInManager.CODEC); 
    File mediaFile = new File(args[1]); 
    DataSource source = Manager.createDataSource(new MediaLocator(mediaFile 
      .toURL())); 
    mdcon = new MediaConvertion(args[0]); 
    mdcon.setDataSource(source); 
    new MediaConverterExample(); 
} 

public MediaConverterExample() { 
    st_stream = new Button("Start Streaming"); 
    add(st_stream); 
    st_stream.addActionListener(this); 
    setVisible(true); 
    setSize(200, 300); 

} 

public void actionPerformed(ActionEvent ae) { 
    try { 
     mdcon.startTransmitting(); 
    } catch (Exception e) { 
    } 
} 
} 
関連する問題