2014-01-10 14 views
11

xuggler를 사용하여 Java에서 RTSP 스트리밍 서버를 구축하고 있지만 올바른 RTP 패킷을 구현하는 방법을 모르겠습니다.Xuggler로 RTP 패킷으로 미디어 파일을 인코딩하는 방법

내 현재의 접근법은 입력 컨테이너 ReadNextPacket(packet) 전화 packet.getData() 적절한 헤더 보내 (스트림 인덱스 getTimestamp() 의해 설정된 타임 스탬프 등을 기반으로 페이로드 타입)에 의해 충전 된 페이로드를 함께 RTP 패킷을 정교하게하기위한 것이다.

IPacket을 올바른 rtp 페이로드로 인코딩하는 방법에 대한 실제적인 예를 가장 많은 입력 형식의 방식으로 제공 할 수 있습니까? 설명서가 조금 부족합니다.

+0

@streak 링크가 끊어졌습니다. –

+0

죄송합니다. 도메인이 옮겨졌습니다. – streak

+1

나는 이것이 입력 형식에 달려 있다고 생각한다. 예 : MP3 파일 용 RTP 페이로드를 설정하는 방법은 https://tools.ietf.org/html/rfc5219를 참조하십시오. 다른 RFC의 다른 형식을 문서화하고 있습니다. 어쨌든 입력 형식은 매우 중요합니다. 예를 들어, 두 개의 패킷 사이에서 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) { 
    } 
} 
} 
관련 문제