Использование 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
Я попробовал это для нескольких разных файлов, и, похоже, он работал на тех, которые я пробовал, хотя я уверен, что есть гораздо лучшее решение.