探查单个klv流以获取特定的签名/标头

时间:2019-06-17 18:55:56

标签: ffmpeg stream key-value

当前,我支持的软件可以处理视频容器中的不同流(.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;

我的想法是添加另一个||。到上面复杂的if {},但我无法弄清楚如何进行所需的比较(查找标头字节)。

我研究了现有文档,并认为访问AVFormatContext结构中包含的AVStream中的probe_data结构将为我提供流的前几个字节。运气不好,因为即使我们已经对文件本身进行了探测,probe_data结构还是空的。

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

0 个答案:

没有答案