Я пытаюсь использовать этот код для получения видеокадров из потока RTSP:
// Open the initial context variables that are needed
SwsContext *img_convert_ctx;
AVFormatContext* format_ctx = avformat_alloc_context();
AVCodecContext* codec_ctx = NULL;
int video_stream_index;
// Register everything
av_register_all();
avformat_network_init();
if (avformat_open_input(&format_ctx, argv[1],
NULL, NULL) != 0) {
return EXIT_FAILURE;
}
if (avformat_find_stream_info(format_ctx, NULL) < 0) {
return EXIT_FAILURE;
}
//search video stream
for (int i = 0; i < format_ctx->nb_streams; i++) {
if (format_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
video_stream_index = i;
}
AVPacket packet;
av_init_packet(&packet);
//open output file
AVFormatContext* output_ctx = avformat_alloc_context();
AVStream* stream = NULL;
//start reading packets from stream and write them to file
av_read_play(format_ctx); // <-- program is frozen in this API call
// Get the codec
AVCodec *codec = NULL;
cout << "avcodec_find_decoder" <<endl;
codec = avcodec_find_decoder(AV_CODEC_ID_H264);
// some more important stuff below ...
Когда я запускаю свою программу с файлом MP4, она работает правильно. Если я использую его с потоком RTSP H264, он go не удаляет av_read_play. Исходный двоичный файл ffmpeg также корректно работает с потоком RTSP. В чем может быть причина этого?