Найти, есть ли в видео файле аудио

Я пытаюсь выяснить, есть ли в видео аудио, чтобы извлечь 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
Другие вопросы по тегам