2013-10-09 120 views
1

av_read_frame碰撞我使用KxMovie:https://github.com/kolyvan/kxmovieFFMPEG:閉RTSP流乾淨 - 上avformat_close_input

它似乎停止流和關閉一個應該使用視圖控制器[停頓]。 但是,我試圖從一個版本的gstreamer接收一個流,如果流沒有正確關閉,它就會發生內存泄漏(它只是懸在裏面)。

所以,只是[暫停] ing不適合我。

我想在KxMovie解碼器使用[closeFile]:

-(void) closeFile 
{ 

[self closeAudioStream]; 
[self closeVideoStream]; 
[self closeSubtitleStream]; 

_videoStreams = nil; 
_audioStreams = nil; 
_subtitleStreams = nil; 

    if (_formatCtx) { 
     _formatCtx->interrupt_callback.opaque = NULL; 
     _formatCtx->interrupt_callback.callback = NULL; 
     avformat_close_input(&_formatCtx); 
     _formatCtx = NULL; 
    } 
} 

不過,我通常會從av_read_frame後[closeFile]問題EXC_BAD_ACCESS avformat_close_input。

任何人都可以給我一些關於如何使用ffmpeg徹底關閉RTSP流的建議嗎?

謝謝!

回答

0

需要使用中斷回調中斷av_read_frame

 _formatCtx->interrupt_callback.opaque 
     _formatCtx->interrupt_callback.callback 

等待回調被稱爲並返回非零。 回調返回中斷值後,可以安全地調用av_close_input(在關閉使用的任何編解碼器之後)。

+1

您能提供更多關於此的信息嗎?你在回調中做了什麼,方法簽名是什麼?我想幹淨地關閉一個rtsp流,但我必須發佈什麼?如何? – Daneo

-1

我也被這個困惑了,我不太明白你的解決方案。

我修正了下面的問題,你能給點建議嗎?

_dispatchQueue與asyncDecodeFrames的工作方式相同。

- (void)unSetup { 

    _buffered = NO; 
    _interrupted = YES; 

    dispatch_async(_dispatchQueue, ^{ 
     if (_decoder) { 

      [self pause]; 
      [self freeBufferedFrames]; 

      if (_moviePosition == 0 || _decoder.isEOF) 
       [gHistory removeObjectForKey:_decoder.path]; 
      else if (!_decoder.isNetwork) 
       [gHistory setValue:[NSNumber numberWithFloat:_moviePosition] 
          forKey:_decoder.path]; 

      [_decoder closeFile]; 
     } 
    }); 

}