исследование отдельных потоков KLV для конкретной подписи / заголовка - PullRequest
1 голос
/ 17 июня 2019

В настоящее время программное обеспечение, которое я поддерживаю, обрабатывает различные потоки в контейнере видео (.ts, .mp4, .mpg и т. Д.) Без каких-либо проблем, если существует только один (1) тип каждого потока кодека.

Недавно я столкнулся с образцом видео, который на самом деле содержит три (3) идентифицированных потока AV_CODE_ID_SMPTE_KLV. Когда я перебираю три потока, один из них - это поток, который мне нужен. Мне не удалось найти простой способ выполнить конкретный запрос, который мне нужен (проверить наличие известных байтов заголовка в потоке).

    ...
    for (i = 0; i < nb_streams; i++) {
       int real_stream_index = program ? program[i] : i;
       AVStream *st          = ic->streams[real_stream_index];
       AVCodecParameters *par = st->codecpar;
       if (par->codec_type != type)
          continue;
       if (id != AV_CODEC_ID_NONE) {
          if (par->codec_id != id)
             continue;
       }
       if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
          continue;
       if (type == AVMEDIA_TYPE_AUDIO && !(par->channels && par->sample_rate))
          continue;
       disposition = !(st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED | AV_DISPOSITION_VISUAL_IMPAIRED));
       count = st->codec_info_nb_frames;
       bitrate = par->bit_rate;
       multiframe = FFMIN(5, count);
       if ((best_disposition >  disposition) ||
           (best_disposition == disposition && best_multiframe >  multiframe) ||
           (best_disposition == disposition && best_multiframe == multiframe && best_bitrate >  bitrate) ||
           (best_disposition == disposition && best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
          continue;
       best_disposition = disposition;
       best_count   = count;
       best_bitrate = bitrate;
       best_multiframe = multiframe;
       ret          = real_stream_index;

Я думал добавить еще одну || к сложному, если {} выше, но я не смог выяснить, как сделать сравнение, которое мне нужно (ища байты заголовка).

Я изучил существующую документацию и подумал, что доступ к структуре probe_data внутри AVStream, содержащейся в структуре AVFormatContext, даст мне первые несколько байтов потока. Не повезло, так как структура probe_data пуста, хотя мы провели проверку самого файла.

fprintf(stderr, "Filename: %s\t buf_size: %d\n", st-> probe_data.filename, st-> probe_data.buf_size);
...