Библиотека avcodec не извлекает все кадры из видео
Я написал библиотеку, которую можно использовать с Python для извлечения кадров из видео в буфер для некоторой обработки. Я использовал примеры из ffmpeg для сборки своей библиотеки с использованием libavcodec. Это и, кажется, работает нормально для большинства видео. Но я вижу на некоторых видео, где моя библиотека не извлекает все кадры (намного меньше, чем FPS).
Кажется, что пакеты как-то вышли из строя, и докодер не может их обработать. Я продолжаю получать много следующих ошибок
pid = 100 pes_code = 0x1e0
nal_unit_type: 9, nal_ref_idc: 0
nal_unit_type: 1, nal_ref_idc: 2
deblocking_filter_idc 7 вне диапазона
Ошибка decode_slice_header
без рамки!
Я использую следующие шаги для настройки декодера.
//open input file, allocate context if ((ret = avformat_open_input(&format_ctx, in_filename, 0, 0)) < 0) { PyErr_SetString(ExtractorError, "Could not open input file!"); goto end; } if ((ret = avformat_find_stream_info(format_ctx, 0)) < 0) { PyErr_SetString(ExtractorError, "Failed to retrieve input stream information!"); goto end; } av_dump_format(format_ctx, 0, in_filename, 0); // Get the video index from the stream for(int i=0; i<format_ctx->nb_streams ;i++ ) { if( format_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ) { video_stream_index = i; break; } } /* if video stream not availabe */ if((video_stream_index) == -1) { PyErr_SetString(ExtractorError, "video stream to retreive fps is not found!"); return NULL; } long duration = format_ctx->duration + (format_ctx->duration <= INT64_MAX - 5000 ? 5000 : 0); float duration_in_secs = (float)duration / AV_TIME_BASE; stream_mapping_size = format_ctx->nb_streams; stream_mapping = av_mallocz_array(stream_mapping_size, sizeof(*stream_mapping)); if (!stream_mapping) { ret = AVERROR(ENOMEM); goto end; } AVCodec *pCodec = NULL; AVCodecParameters *in_codecpar = NULL; for (i = 0; i < format_ctx->nb_streams; i++) { AVStream *in_stream = format_ctx->streams[i]; in_codecpar = in_stream->codecpar; if (in_codecpar->codec_type != AVMEDIA_TYPE_AUDIO && in_codecpar->codec_type != AVMEDIA_TYPE_VIDEO && in_codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE) { stream_mapping[i] = -1; continue; } if (in_codecpar->codec_type == AVMEDIA_TYPE_VIDEO){ pCodec = avcodec_find_decoder(in_codecpar->codec_id); stream_mapping[i] = stream_index++; break; } } if(!pCodec){ PyErr_SetString(ExtractorError, "error, no pCodec!"); return NULL; } // convert CodecParam to CodecCtx AVCodecContext *pCodecCtx = avcodec_alloc_context3(pCodec); if (!pCodecCtx) { PyErr_SetString(ExtractorError, "Failed to convert codecParam to CodecCtx!"); return NULL; } ret = avcodec_parameters_to_context(pCodecCtx, in_codecpar); if (ret < 0) goto end; //open video decoder if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) { logging("EXTRACTOR: failed to open codec through avcodec_open2\n"); return NULL; }
Чтобы проверить это, я использовал следующую команду из ffmpeg, чтобы извлечь кадры из того же видео, и она работала нормально.
ffmpeg -i ~ / thuuz / extractor / 03000.ts -f image2 -qscale: v 7 ffmpeg-detect -% 03d.jpg -hide_banner -v quiet
Я не передаю правильные параметры кодека? Пожалуйста, дайте мне знать некоторые входные данные о том, как отладить эту проблему. Большое спасибо.
0 ответов на вопрос
Похожие вопросы
-
9
В чем разница между командами "su -s" и "sudo -s"?
-
4
Требуется хороший бесплатный образ Ubuntu Server VMWare
-
4
Каковы различия между основными дистрибутивами Linux? Я замечу?
-
-
2
Ограничить использование процессора для Flash в Firefox?
-
2
Как мне заставить мой микрофон работать под Debian GNOME?
-
2
Конки установки - образцы / идеи?
-
3
Каковы различия между оконными менеджерами Linux?
-
2
ThunderBird / Синхронизация освещения с SE k770i
-
4
Файловая система Linux
-
6
Полноэкранная медленная вспышка в KDE 4