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