Найти, есть ли в видео файле аудио
Я пытаюсь выяснить, есть ли в видео аудио, чтобы извлечь mp3 с помощью ffmpeg. Когда видео не содержит аудиоканалов, ffmpeg создает пустой mp3-файл, который я использую, чтобы выяснить, присутствовал ли звук в видео в первую очередь. Я уверен, что есть лучший способ определить, присутствует ли звук в видео. Поможет ли в этом avprobe? Может кто-нибудь указать мне на ресурс или, возможно, решение?
Изменить: Удивительно, но та же команда на моем сервере с последней сборкой ffprobe не выполняется. Выдает ошибку, говоря
Нераспознанная опция select_stream
Не удалось установить значение "a" для опции "select_stream"
Есть идеи, как это исправить?
5 ответов
Я бы использовал FFprobe (он поставляется вместе с FFMPEG):
ffprobe -i INPUT -show_streams -select_streams a -loglevel error
В случае отсутствия звука он ничего не выводит. Если есть аудиопоток, вы получите что-то вроде:
[ПОТОК]
Индекс = 0
codec_name = mp3
codec_long_name = MP3 (аудио слой MPEG 3)
Профиль = неизвестно
codec_type = аудио
codec_time_base=1/44100
так далее
так далее...
[/ПОТОК]
Это должно быть достаточно просто для анализа независимо от языка, который вы используете для автоматизации этого процесса.
Если это обычный видеофайл с локального пути, вы можете сделать что-то вроде этого, чтобы узнать, есть ли у видео аудиофайл или нет.
Вам нужно заглянуть в MediaMetadataRetriever
Используя METADATA_KEY_HAS_AUDIO
Вы можете проверить, есть ли у видео аудио или нет.
private boolean isVideoHaveAudioTrack(String path) {
boolean audioTrack =false;
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(path);
String hasAudioStr = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_AUDIO);
if(hasAudioStr.equals("yes")){
audioTrack=true; }
else{
audioTrack=false; }
return audioTrack;
}
Здесь путь - ваш путь к видеофайлу.
PS: Поскольку это старый вопрос, я пишу этот ответ, чтобы помочь другим людям, которым он может помочь.
Нашли раунд, чтобы решить эту проблему. Кажется, это отвечает на вопрос, который я задал.
ffprobe -i input.mp4 -show_streams 2>&1 | grep 'Stream #0:1'
Если вы хотите узнать, есть ли звук, и вам не нужны подробности о потоке, вы можете выполнить следующую команду, которая извлечет длительность аудиопотока из входного файла. Если ответ нуль / пробел, во входном файле нет звука.
Команда:
ffprobe -v error -of flat=s_ -select_streams 1 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1
ffprobe -v fatal # set log level to fatal
-of default=nw=1:nk=1 # use default format and hide wrappers and keys
-show_streams # show info about media streams
-select_streams a # show only audio streams
-show_entries stream=codec_type # show only stream.codec_type entries
video.mp4 # input file
Медиа-файл содержит аудиопоток:
audio
1
0
0
0
0
0
0
0
0
0
0
0
und
SoundHandler
Медиа-файл не содержит аудиопоток, повторно возвращает пустой результат.
Не медиа-файл также возвращает пустой результат. Если вы хотите вернуть сообщение об ошибке для файлов, не относящихся к мультимедиа, и для любого другого случая ошибки, используйте -v error
вместо:
ffprobe -v error # set log level to error
-of default=nw=1:nk=1 # use default format and hide wrappers and keys
-show_streams # show info about media streams
-select_streams a # show only audio streams
-show_entries stream=codec_type # show only stream.codec_type entries
video.mp4 # input file
Итак, вы берете это вместо пустого результата:
non-media-file.zip: Invalid data found when processing input