1

現在、UDP マルチキャスト RTSP ストリームをデコードする必要があるアプリケーションを開発しています。現時点では、ffplay を使用して RTP ストリームを表示できます。

ffplay -rtsp_transport udp_multicast rtsp://streamURLGoesHere

ただし、FFMPEGを使用してUDPストリームを開こうとしています(簡潔にするためにエラーチェックとクリーンアップコードを削除しました)。

AVFormatContext* ctxt = NULL;
av_open_input_file(
    &ctxt,
    urlString,
    NULL,
    0,
    NULL
);

av_find_stream_info(ctxt);

AVCodecContext* codecCtxt;

int videoStreamIdx = -1;
for (int i = 0; i < ctxt->nb_streams; i++)
{
    if (ctxt->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
    {
        videoStreamIdx = i;
        break;
    }
}

AVCodecContext* codecCtxt = ctxt->streams[videoStreamIdx]->codec;
AVCodec* codec = avcodec_fine_decoder(codecCtxt->codec_id);
avcodec_open(codecCtxt, codec);

AVPacket packet;
while(av_read_frame(ctxt, &packet) >= 0)
{
    if (packet.stream_index == videoStreamIdx)
    {
        /// Decoding performed here
        ...
    }
}

...

このアプローチは、未加工のエンコードされたビデオ ストリームで構成されるファイル入力では正常に機能しますが、UDP マルチキャスト RTSP ストリームの場合は、で実行されるエラー チェックに失敗しますav_open_input_file()。お知らせ下さい...

4

1 に答える 1

6

マルチキャスト UDP RTSP ストリームを開くには、次の方法を使用できます。

AVFormatContext* ctxt = avformat_alloc_context();

AVDictionary* options = NULL;
av_dict_set(&options, "rtsp_transport", "udp_multicast", 0);
avformat_open_input(
    &ctxt,
    urlString,
    NULL,
    &options
);

...

avformat_free_context(ctxt);

avformat_open_input()の代わりにこの方法で使用するav_open_input_file()と、目的の動作が得られます。私はそれav_open_input_file()が非推奨であるか、この方法で使用されることを意図していなかったと推測しています-おそらく後者です;)

于 2012-04-24T19:55:42.213 に答える