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