Как конвертировать видео вместе со звуком в h264 с помощью ffmpeg?

Вопрос или проблема

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.

Вот полное и правильное решение вашей задачи, состоящее из нескольких шагов:

  1. Прямой конверсия из 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.

  2. Если вам действительно нужно сохранить отдельные видео и аудиофайлы, а затем объединить их, делайте это следующим образом:

    Сначала извлеките видеопоток в файл .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, чтобы избежать повторного кодирования (что может привести к потере качества).

  3. Запуск команд FFmpeg: Убедитесь, что у вас установлена последняя версия FFmpeg, так как функциональность может варьироваться в зависимости от версии. Чтобы проверить вашу текущую версию, выполните:

    ffmpeg -version
  4. Проверка входных файлов: Иногда проблема с отсутствием звука может касаться кодировки аудиофайлов. Чтобы просмотреть информацию о вашем файле, выполните:

    ffmpeg -i M.avi

    Это поможет вам понять, какие кодеки используются для аудио и видео.

Таким образом, если вы следуете вышеприведённым шагам, вы сможете успешно конвертировать ваши видеофайлы и избежать проблем с отсутствующим аудиопотоком.

Оцените материал
Добавить комментарий

Капча загружается...