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

Я пытаюсь выяснить, есть ли в нем аудио, чтобы извлечь mp3, используя ffmpeg. Когда видео не содержит аудиоканалов, ffmpeg создает пустой mp3 файл, который я использую, чтобы выяснить, присутствует ли в видео звук. Я уверен, что есть лучший способ определить, присутствует ли звук в видео. Сможет ли это помочь? Может ли кто-нибудь указать мне ресурс или, возможно, решение?

Изменить: Удивительно, что та же самая команда на моем сервере, на которой запущена последняя сборка ffprobe, не запускается. Он выдает сообщение об ошибке

Нераспознанная опция 'select_stream'

Не удалось установить значение 'a' для опции 'select_stream'

Любые идеи, как исправить это?

Ответ 1

Я бы использовал FFprobe (он поставляется вместе с FFMPEG):

ffprobe -i INPUT -show_streams -select_streams a -loglevel error

В случае отсутствия звука ничего не получается. Если есть аудиопоток, вы получаете что-то вроде:

[ПОТОК]

индекс = 0

codec_name = mp3

codec_long_name = MP3 (MPEG audio layer 3)

Профиль = неизвестен

= codec_type аудио

codec_time_base = 1/44100

и т.д.

и т.д...

[/ПОТОК]

Это должно быть достаточно простым для анализа независимо от языка, который вы используете, чтобы автоматизировать этот процесс.

Ответ 2

Нашел раунд решения этой проблемы. Кажется, это ответ на вопрос, который я задал.

ffprobe -i input.mp4 -show_streams 2 > & 1 | grep 'Stream # 0: 1'

Ответ 3

Если вы хотите узнать только, есть ли звук и не заботятся о деталях потока, вы можете запустить следующую команду, которая будет извлекать продолжительность аудиопотока во входном файле. Если ответ имеет значение null/whitespace, входной файл не содержит аудио.

Команда:

ffprobe -v error -of flat=s_ -select_streams 1 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1

Ответ 4

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

Ответ 5

Если это обычный видеофайл из локального пути, вы можете сделать что-то подобное, чтобы найти, есть ли у видео аудиофайл или нет.

Вам нужно посмотреть 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: Поскольку это старый вопрос, я пишу этот ответ, чтобы помочь другим людям, которым он может помочь.