2

KxMovie を使用しています: https://github.com/kolyvan/kxmovie

ストリームを停止し、[一時停止] を使用する必要があるビュー コントローラーを閉じるように見えます。ただし、ストリームが適切に閉じられていない場合にメモリ リークが発生する gstreamer のバージョンからストリームを受信しようとしています (ハングしたままです)。

ですから、ただ [一時停止] するという選択肢はありません。

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;
     }
}

ただし、通常、[closeFile] が avformat_close_input を発行した後、av_read_frame から EXC_BAD_ACCESS を取得します。

ffmpeg を使用して RTSP ストリームをきれいにシャットダウンする方法について誰かアドバイスをもらえますか?

ありがとう!

4

3 に答える 3

0

私もこれに戸惑いましたが、あなたの解決策がよくわかりません。

以下のように修正しましたが、アドバイスをいただけますか?

_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];
        }
    });

}
于 2016-11-29T03:11:10.330 に答える
-1

av_read_frame に割り込むために割り込みコールバックを使用する必要がありました

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

コールバックが呼び出されるのを待ち、0 以外を返します。コールバックが割り込み値を返した後、av_close_input を安全に呼び出すことができます (使用されているコーデックを閉じた後)。

于 2013-10-10T14:50:57.660 に答える