2013-02-07 2 views
0

안녕하여 결과를 보내, 우리는 우리가 자바 프로젝트에 참여 학생들에게 있습니다병합 웹캠 스트림과 비디오 파일 및 RTP 나 RTSP

:

  1. 캡처 비디오 스트림에서 웹캠
  2. 병합 이론적 비디오 파일이 스트림 (우리는 각 픽셀의 색상의 평균이 걸릴 수 있으므로 두 개의 스트림들이 중첩)
  3. 는 RTP 또는 RTSP를 사용하여 네트워크에 병합의 결과를 송신 (나는 2 개의 Android 태블릿에서 수신합니다.). 매우 중요

것은 이러한 모든 작업을 실시간 (또는 거의)에 을해야한다는 것입니다. 웹캠이 비디오를 캡처하는 것과 동시에 RTP 스트림을 받아야합니다.

이 작업을 수행하기 위해 JMF (Java Media Framework) API를 사용합니다. 첫 번째와 두 번째 요점이 성공적으로 구현되었습니다. 매초마다 30 웹캠의 BufferedImage이 비디오 파일의 30 BufferedImage과 병합됩니다. 결과는 클래식 JFrame에 표시됩니다 (Swing 및 JMF 만 사용). 매우 효과적입니다.

아직 세 번째 사항을 수행해야합니다. RTP를 통한 비디오 스트림 전송은 그리 어렵지 않습니다. 하지만 여기에 문제가 있습니다 : 포인트 1과 2로 인해으로 인해, 우리는 비디오 스트림이 아니라 BufferedImages의 세리에를 갖습니다. 우리는 이러한 BufferedImage에서 비디오 파일을 얻는 방법을 알고 있습니다. 그러나 하드 드라이브에 녹화 된 비디오 파일 일 뿐이므로 네트워크에서 실시간으로 전송할 수 없습니다. 그렇다면 우리는 어떻게 을 실시간으로 스트림에서 만들 수 있습니까? BufferedImage에서 RTP를 통해 직접 전송할 수 있습니까?

미리 도움을 주셔서 감사합니다.

답변

1

답변을 개선하고 싶습니다.

먼저 RTP/RTSP를 사용해야하는지 여부에 대한 질문이 있습니다. 필요가없는 경우, DatagramSocket을 통해 이미지 데이터를 보내고 수신기가 데이터를 디코딩하는 방법을 알고 있다고 가정합니다. 당신이 mjsip 프로젝트를 살펴해야 RTP를 사용하는 경우

DatagramSocket socket = new DatagramSocket(port); 
DatagramPacket packet = new DatagramPacket(new byte[1], 1);  

packet.setAddress(receiver.getAddress()); 
packet.setPort(port); 

while(running) 
{ 
    byte[] data = getMergedImageData(); 

    packet.setData(data); 
    packet.setLength(data.length); 

    socket.send(packet); 
} 

같은 것을 사용합니다. 기본적으로 유효한 RTP 헤더 (예 : 데이터 버퍼의 처음 12 바이트)를 만들어야합니다. 이것은 각 비트가 어디에 속해 있는지 알면 다소 간단합니다.

이미지를 인코딩하는 방법에 따라 추가 요구 사항에주의해야 할 수 있습니다. 예를 들어, RTP를 통해 Jpeg를 보낼 때 완전한 Jpeg 헤더를 제거하고 RTP/Jpeg 헤더를 생성하여 RTP 헤더와 페이로드 사이에 배치해야합니다. 수신기는 약식 헤더에서 Jpeg 헤더를 재생성해야합니다. Jpeg의 경우 이미지에 EOI 표식을 추가하지 않았 으면 추가하십시오. 나는이 점에서 ffmpeg이 당신을 위해 JNI에 뛰어 들기 위해 많은 일을 할 수 있다고 생각합니다.

RTP 페이로드를 조정하는 방법에 대한 자세한 내용은 this을 참조하십시오.

건배 ~