2012-10-11 2 views
2

마지막으로 저는 스트림 비디오 레코더 플래시 응용 프로그램과 간단한 Red5 백엔드를 만들었지 만 Red5는 다시 저에게 농담을합니다. 대부분의 경우 기록 된 비디오가 손상되어 무작위로 멈추지 않고 다시 재생할 수 없습니다. 다시 시작하여 플레이어와 어울리고 있습니다. 왜이 일을하는거야?Red5 비디오 스트림 레코딩이 끊어졌습니다

인터넷을 조사한 결과이 문제가 발견되었지만 해결책이 없습니다.

오류 실행 전화 : 나는 비디오를 녹화하는 대신 살을 전환하고 더러운 일을하기는 FFmpeg를 연결하지만, 자연적으로는 FFmpeg은 RED5의 출력에 다음과 같은 오류 메시지와 함께 연결할 수 없습니다하지 않으려 고 노력 서비스 : 널 (null) 방법 : 1 : 0 : my_little_stream ... blabla 즐

내가 무엇을해야할지, 물어 내가 진정으로 원하지 않는 무엇 Xuggler 물건을 통합 시도하기 전에, 내가 첨부 할 수 있습니다 민에 Params를 재생 어떻게 든 ffmpeg 또는 red5 서버에서 구성을 변경해야합니다 .. 아니면 아무것도! 감사!

편집 : 나는 Red5의 1.0 RC2를 사용하고

편집 # 2 : RED5의 1.0.0rc2 서버 파일이 다음 간단한 플렉스 응용 프로그램과 함께 라이브 스트림을 생성하여 나는 트렁크 소스의 oflaDemo 응용 프로그램을 컴파일 ffmpeg 레코더가 작동하는지 시험해보기 만하면됩니다. 이제 red5에 연결할 수 있지만 결과는 같습니다! 비디오가 손상된 것 같습니다 ...

+0

http://code.google.com/p/red5/issues/detail?id=42#c8이 버그가 수정 될 말한다,하지만 난 그것에 대해 많이 알고하지 않습니다. – nalply

+0

이것을 해결할 수 있었습니까? 나는 똑같은 문제를 겪고 있으며 당신이 겪었던 모든 단계 (seba.wagner와 함께)를 아무런 수정없이 따라갔습니다! – crazyphoton

답변

3

*하지만이 packetReceived() 함수에 투입해야하는지? *

나는이 올바르게 강조하기 위해 분리 된 대답에 추가 :

디스크에 패킷을 작성하려면 다음이 필요합니다 1) 패킷, 2) itag 기준 3 패킷을 변환)을 얻기 ITagWriter

1)의 예는 패킷 데이터 선 (50) 주위 http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/listener/StreamVideoListener.java?view=markup

public void packetReceived(IBroadcastStream broadcastStream, 
    IStreamPacket streampacket) { 

} 

streampacket => 디스크에 쓰려는 패킷.

2) 광고 90ff 주위 라이터

http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/listener/async/BaseStreamWriter.java?view=markup 의 인스턴스를 획득

 IoBuffer data = streampacket.getData().asReadOnlyBuffer(); 

     if (data.limit() == 0) { 
      return; 
     } 

     if (startTimeStamp == -1) { 
      // That will be not bigger then long value 
      startTimeStamp = streampacket.getTimestamp(); 
     } 

     timeStamp -= startTimeStamp; 

     ITag tag = new Tag(); 
     tag.setDataType(streampacket.getDataType()); 

     // log.debug("data.limit() :: "+data.limit()); 
     tag.setBodySize(data.limit()); 
     tag.setTimestamp(timeStamp); 
     tag.setBody(data); 

     writer.writeTag(tag); 

3) 광고 90ff 주위 itag 기준

http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/listener/async/StreamVideoWriter.java?view=markup 로 변환함으로써 패킷을 작성

protected ITagWriter writer = null; 

private void init() throws IOException { 
    file = new File(OmFileHelper.getStreamsSubDir(this.scope.getName()), this.streamName + ".flv"); 

    IStreamableFileFactory factory = (IStreamableFileFactory) ScopeUtils 
      .getScopeService(this.scope, IStreamableFileFactory.class, 
        StreamableFileFactory.class); 

    if (!this.file.isFile()) { 
     // Maybe the (previously existing) file has been deleted 
     this.file.createNewFile(); 

    } else if (!file.canWrite()) { 
     throw new IOException("The file is read-only"); 
    } 

    IStreamableFileService service = factory.getService(this.file); 
    IStreamableFile flv = service.getStreamableFile(this.file); 
    this.writer = flv.getWriter(); 

} 

이것은 거친 산책입니다. 그런 의미에서 당신은 그 다음에 나아갈 수 있습니다.

http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/listener/async/BaseStreamWriter.java?view=markup

클래스

는 패킷을 수집하는 큐를 포함한다.

IStreamPacket.getType == 9는 비디오이며 8은 오디오라고 생각합니다.하지만 확인해야합니다.

세바스찬

+0

좋아, 잘 작동합니다! 나는 당신의 지시 사항과 flvrecord 패키지를 기반으로 만들었습니다. – haxpanel

+0

패킷의 타임 스탬프를 계속 확인하십시오. 문제는 누군가가 대역폭 문제가있을 때 타임 스탬프가 잘못되었다는 것입니다. VNC 뷰어로 녹화 된 FLV를 간단히 확인할 수 있습니다. –

+0

더 많은 지침이 있습니까? 기본적으로 나는 청취자와 작가 클래스를 복사하고 Dao와 다른 데이터베이스 관련 자료를 잘라 냈다. FilenameGenerator 빈으로 전환하여 파일 이름을 생성합니다. – haxpanel

0

지금 어떤 녹음 방법을 사용하십니까? Record5에는 실제로 두 가지 메서드가 있습니다. 1) NetStream.record => 이것은 매우 간단합니다. 2) NetStream을 "실시간"으로 수행하지만 스트림에 첨부 한 다음 스트림을 작성하는 서버 쪽 StreamListener가 있습니다. 디스크에.

두 솔루션을 모두 성공적으로 구현했습니다. http://incubator.apache.org/openmeetings/ 고르지 않은 비디오 또는 임의 정지/일시 중지가 없습니다.

Red5로 간단한 녹음을하기 위해 FFMPEG 또는 Xuggler를 통합 할 필요가 없습니다! FFMPEG는 결과 비디오를 수정하고 워터 마크를 추가하려는 경우 유용 할 수 있습니다. 오디오 편집의 경우 SoX와 같은 도구를 사용할 수 있습니다. 그러나 ... 단순한 기록 및 재생은 그 도구가 전혀 필요하지 않습니다!

세바스찬

+0

답변 주셔서 감사합니다.하지만 두 번째 해결 방법에 대해 자세히 설명해 주시겠습니까? 그것을 라이브 스트림에 연결하여 ffmpeg로 시도하는 것과 비슷하지 않습니까? – haxpanel

+0

아니요, 전혀 아닙니다. 두 번째 해결책은 여기에 예를 들어 설명되어 있습니다. http://sziebert.net/posts/server-side-stream-recording-with-red5/ –

+0

두 번째 방법으로 앱을 수정했습니다. 나는 그것이 문제를 해결하지 못했고 또 다른 문제가있을 것이라고 생각한다. 아마 이것은이 문제의 뿌리이다. [다른 주제] (http://stackoverflow.com/questions/12893159/red5-communication-delay) 체크 아웃 해 주시겠습니까? – haxpanel