2012-04-24 1 views
1

В настоящее время я разрабатываю приложение, которое должно декодировать поток RTSP многоадресной передачи UDP. На данный момент, я могу просматривать поток RTP, используя ffplay черезЧтение из UDP Multicast RTSP Video Stream

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(). Пожалуйста посоветуйте ...

ответ

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() либо устарел, либо никогда не предназначался для использования таким образом - более чем вероятно последний;)