Библиотека avcodec не извлекает все кадры из видео - PullRequest
0 голосов
/ 22 ноября 2018

Я написал библиотеку, которую можно использовать с 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

Я не передаю правильные параметры кодека?Пожалуйста, дайте мне знать, как решить эту проблему.Большое спасибо.

...