Использование ffprobe для проверки аудиофайлов

Есть ли команда ffprobe, которую я могу запустить, чтобы увидеть, есть ли у меня файл mov только для аудио или также содержит видео? У меня есть различные файлы MOV, некоторые из которых являются аудио-дабами, а некоторые - полноценными видео.

5 ответов

Решение

Вы можете вывести информацию о потоке в формате JSON или XML:

ffprobe -show_streams -print_format json input.mov

Вы получите массив потоков с codec_type атрибут со значениями как audio, video и т.п.

Для вывода codec_type

ffprobe -loglevel error -show_entries stream=codec_type -of default=nw=1 input.foo

Пример результата:

codec_type=video
codec_type=audio

Если у вас есть несколько аудио или видео потоков, на выходе будет отображаться несколько видео или аудио записей.


То же, что и выше, но выведите только значения

ffprobe -loglevel error -show_entries stream=codec_type -of default=nw=1=nk=1 input.foo

или же:

ffprobe -loglevel error -show_entries stream=codec_type -of csv=p=0 input.foo

Пример результата:

video
audio

Включить индекс потока

ffprobe -loglevel error -show_entries stream=index,codec_type -of csv=p=0 input.foo

Пример результата:

0,video
1,audio

В этом примере видео является первым потоком, а аудио - вторым потоком, что является нормой, но не всегда так.


Ничего не выводить, если нет звука

ffprobe -loglevel error -select_streams a -show_entries stream=codec_type -of csv=p=0 input.foo

Пример результата для ввода со звуком:

audio

Если на входе нет звука, то не будет вывода (нулевой вывод), который может быть полезен для использования по сценарию.


Другие выходные форматы

Если вам нужно другое форматирование вывода (json, ini, flat, csv, xml), смотрите документацию FFprobe: Writers.

используя ffprobe с json, например:

      ffmpeg -v quiet -print_format json -show_format -show_streams {FILENAME}

поиск индекса [длительность] в потоках index. Если числовое значение && > 0, я думаю, что это ВИДЕО.

Проблема с поиском только по слову «видео» заключается в том, что в JPG есть поток «видео», так что это неплохая идея. Для меня я использую поиск по значению продолжительности... Работает очень хорошо!

Чтобы программно узнать, есть ли у видеофайла аудио, используйте avformat_open_input() как показано здесь ниже - если audio_index больше или равно нулю, тогда видеофайл содержит аудио.

if (avformat_open_input(&pFormatCtx, filename, nullptr, nullptr) != 0) {
    fprintf(stderr, "Couldn't open video file!\n");
    return -1;
}

if (avformat_find_stream_info(pFormatCtx, nullptr) < 0) {
    fprintf(stderr, "Couldn't find stream information!\n");
    return -1;
}

av_dump_format(pFormatCtx, 0, videoState->filename, 0);

for (i = 0; i < pFormatCtx->nb_streams; i++) {

    if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO && video_index < 0)
        video_index = i;

    if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO && audio_index < 0)
        audio_index = i;
}

Один из быстрых способов сделать это - проверить, есть ли на выходе слово "Видео". Вот пример:

>>> cmd = shlex.split('%s -i %s' % (FFPROBE, video_path))
>>> p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> output = p.communicate()[1]
>>> 'Video' in output
True

Я попробовал это для нескольких разных файлов, и, похоже, он работал на тех, которые я пробовал, хотя я уверен, что есть гораздо лучшее решение.

Другие вопросы по тегам