В настоящее время программное обеспечение, которое я поддерживаю, обрабатывает различные потоки в контейнере видео (.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);