Вопрос или проблема
ffmpeg
ffmpeg версия 3.1.1 Copyright (c) 2000-2016 разработчики FFmpeg
собран с помощью gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-4)
конфигурация: --enable-libmfx --enable-nonfree
libavutil 55. 28.100 / 55. 28.100
libavcodec 57. 48.101 / 57. 48.101
libavformat 57. 41.100 / 57. 41.100
libavdevice 57. 0.101 / 57. 0.101
libavfilter 6. 47.100 / 6. 47.100
libswscale 4. 1.100 / 4. 1.100
libswresample 2. 1.100 / 2. 1.100
Гипер быстрый аудио и видео кодировщик
использование: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
Я знаю, как конвертировать из одного формата в другой, используя команды, такие как:
ffmpeg -i M.avi -c:v h264_qsv -look_ahead 0 -strict -2 -preset:v fast M.mp4
Теперь мне нужно сделать преобразования, такие как M.avi в M.h264, а затем из M.h264 в M.mp4
ffmpeg -i M.avi -c:v h264_qsv -look_ahead 0 -strict -2 -preset:v fast M.h264
ffmpeg -i M.h264 -c:v h264_qsv -look_ahead 0 -strict -2 -preset:v fast M.mp4
При выполнении этого все работало нормально, но M.mp4 воспроизводится без звука.
Согласно ссылке,
https://stackoverflow.com/questions/5725958/ffmpeg-conversion-skips-audio
Я даже попробовал с -acodec copy
, как:
ffmpeg -i M.avi -c:v h264_qsv -look_ahead 0 -strict -2 -preset:v fast -acodec copy M.h264
ffmpeg -i M.h264 -c:v h264_qsv -look_ahead 0 -strict -2 -preset:v fast -acodec copy M.mp4
При использовании команды ffmpeg -i M.mp4 -c:v h264_qsv -look_ahead 0 -strict -2 -preset:v fast -acodec copy n.h264
результат:
ffmpeg версия 3.1.1 Copyright (c) 2000-2016 разработчики FFmpeg
собран с помощью gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-4)
конфигурация: --enable-libmfx --enable-nonfree
libavutil 55. 28.100 / 55. 28.100
libavcodec 57. 48.101 / 57. 48.101
libavformat 57. 41.100 / 57. 41.100
libavdevice 57. 0.101 / 57. 0.101
libavfilter 6. 47.100 / 6. 47.100
libswscale 4. 1.100 / 4. 1.100
libswresample 2. 1.100 / 2. 1.100
Ввод #0, mov, mp4, m4a, 3gp, 3g2, mj2, из 'M.mp4':
Метаданные:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2016-01-31 09:44:22
Продолжительность: 00:03:28.38, начало: 0.000000, битрейт: 2120 kb/s
Поток #0:0(und): Видео: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], 1925 kb/s, 24 fps, 24 tbr, 24 tbn, 48 tbc (по умолчанию)
Метаданные:
handler_name : VideoHandler
Поток #0:1(und): Аудио: aac (LC) (mp4a / 0x6134706D), 44100 Hz, стерео, fltp, 191 kb/s (по умолчанию)
Метаданные:
creation_time : 2016-01-31 09:44:23
handler_name : IsoMedia File Produced by Google, 5-11-2011
Файл 'n.h264' уже существует. Перезаписать? [y/N] y
libva info: VA-API версия 0.35.0
libva info: va_getDriverName() возвращает 0
libva info: Пользователь запросил драйвер 'iHD'
libva info: Попытка открыть /opt/intel/mediasdk/lib64/iHD_drv_video.so
libva info: Найдена функция инициализации __vaDriverInit_0_32
libva info: va_openDriver() возвращает 0
[h264 @ 0x2fd4940] Использование AVStream.codec для передачи параметров кодека в мультиплексоры устарело, используйте AVStream.codecpar вместо этого.
Вывод #0, h264, в 'n.h264':
Метаданные:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
encoder : Lavf57.41.100
Поток #0:0(und): Видео: h264 (h264_qsv), nv12, 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 1000 кбит/с, 24 fps, 24 tbn, 24 tbc (по умолчанию)
Метаданные:
handler_name : VideoHandler
encoder : Lavc57.48.101 h264_qsv
Дополнительные данные:
cpb: битрейт max/min/avg: 0/0/1000000 размер буфера: 0 vbv_delay: -1
Сопоставление потоков:
Поток #0:0 -> #0:0 (h264 (native) -> h264 (h264_qsv))
Нажмите [q] для остановки, [?] для получения справки
frame= 5001 fps=284 q=-0.0 Lsize= 23221kB time=00:03:28.33 bitrate= 913.1kbits/s speed=11.8x
video:23221kB audio:0kB subtitle:0kB другие потоки:0kB глобальные заголовки:0kB накладные расходы мультиплексирования: 0.000000%
Все еще без звука. Может кто-нибудь мне помочь с этим?
Я не знаю способа извлечь аудио и видео за один шаг, но вы можете легко извлечь и то, и другое с помощью короткого скрипта.
Предполагая, что аудио – это AAC, как в вашем посте:
#! /bin/bash
###################################################################
i="" # отредактируйте с именем входного AVI файла, включая расширение
###################################################################
ffmpeg -i "$i" -c:v h264_qsv -look_ahead 0 -strict -2 -preset:v fast -an "${i%.*}.".h264
ffmpeg -i "$i" -vn -acodec copy "${i%.*}.".aac
done
Чтобы объединить их в контейнер MP4, вы можете сделать:
#! /bin/bash
###################################################################
i="" # отредактируйте с именем входного h264 файла, включая расширение
###################################################################
ffmpeg -i "$i" -i "${i%.*}.".aac -vcodec copy -acodec copy "${i%.*}.".mp4
done
Это не идеальное решение, так как оно создает дополнительный шаг (как отмечено в комментариях). Но, по крайней мере, это даст вам отправную точку 🙂
Надеюсь, это поможет! 🙂
.h264 – это сырой видеоформат контейнера. Он ничего не знает об аудио. ffmpeg ведет себя абсолютно правильно. Если вы хотите h264 – вы его получите. Без звука.
Как утверждали другие, нет никакой причины делать это в несколько шагов, и формат h264 не может содержать аудио, так что именно на этом дополнительном шаге вы теряете звук.
Также стоит отметить, что вы выполняете полную повторную кодировку видео на втором этапе, что является пустой тратой времени и является потерянной операцией (вы потеряете качество видео).
Чтобы конвертировать в h264+aac за один шаг, сделайте что-то вроде этого:
ffmpeg -i M.avi -c:v h264_qsv -c:a aac out.mp4
(Команды, которые я даю, в их самой базовой форме. Вы должны все равно добавить свои дополнительные флаги для качества и т.д.)
Чтобы конвертировать в несколько шагов, вам нужно создать отдельные видео и аудиофайлы, а затем объединить их в контейнер. Чтобы выяснить, какой формат использует AVI, просто выполните ffmpeg без каких-либо флагов или вывода:
ffmpeg -i M.avi
и он покажет вам детали всех каналов в контейнере AVI.
Если форматы в контейнере AVI поддерживаются mp4, вы можете просто извлечь видео и аудио в mp4 без повторной кодировки (это предотвратит потерю качества).
ffmpeg -i M.avi -c copy M.mp4
Или вы можете закодировать их в отдельные видео и аудио, а затем объединить:
ffmpeg -i M.avi -c:v h264_qsv M.h264
ffmpeg -i M.avi -c:a aac M.aac
ffmpeg -i M.h264 -i M.aac -map 0:v -map 1:a -c copy M.mp4
Обратите внимание, что вы должны копировать кодеки на последнем шаге вместо повторной кодировки.
Ответ или решение
Для того чтобы конвертировать видео с аудио в формат H.264 с использованием FFmpeg, вам необходимо понимать, что формат .h264 является "сырым" видеопотоком и не поддерживает аудио. Поэтому, если вы хотите сохранить и видео, и аудио, вам лучше использовать контейнер, который поддерживает оба потока, например, MP4.
Вот полное и правильное решение вашей задачи, состоящее из нескольких шагов:
-
Прямой конверсия из AVI в MP4 с использованием H.264 для видео и AAC для аудио. Это самый эффективный способ, который позволит вам избежать лишних шагов с потерей качества:
ffmpeg -i M.avi -c:v h264_qsv -c:a aac -preset:v fast M.mp4
Здесь
-c:v h264_qsv
указывает на использование кодека H.264 с аппаратным ускорением Intel Quick Sync Video (если доступно), а-c:a aac
указывает на кодек аудио AAC. -
Если вам действительно нужно сохранить отдельные видео и аудиофайлы, а затем объединить их, делайте это следующим образом:
Сначала извлеките видеопоток в файл .h264 без аудио:
ffmpeg -i M.avi -c:v h264_qsv -an M.h264
Затем извлеките аудиопоток в файл .aac:
ffmpeg -i M.avi -vn -acodec aac M.aac
После этого вы можете объединить оба потока в MP4:
ffmpeg -i M.h264 -i M.aac -map 0:v -map 1:a -c copy M.mp4
Обратите внимание, что мы используем
-c copy
, чтобы избежать повторного кодирования (что может привести к потере качества). -
Запуск команд FFmpeg: Убедитесь, что у вас установлена последняя версия FFmpeg, так как функциональность может варьироваться в зависимости от версии. Чтобы проверить вашу текущую версию, выполните:
ffmpeg -version
-
Проверка входных файлов: Иногда проблема с отсутствием звука может касаться кодировки аудиофайлов. Чтобы просмотреть информацию о вашем файле, выполните:
ffmpeg -i M.avi
Это поможет вам понять, какие кодеки используются для аудио и видео.
Таким образом, если вы следуете вышеприведённым шагам, вы сможете успешно конвертировать ваши видеофайлы и избежать проблем с отсутствующим аудиопотоком.