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

FFmpeg

ffmpeg version 3.1.1 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-4)
  configuration: --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
Hyper fast Audio and Video encoder
usage: 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 version 3.1.1 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-4)
  configuration: --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
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'M.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2016-01-31 09:44:22
  Duration: 00:03:28.38, start: 0.000000, bitrate: 2120 kb/s
    Stream #0:0(und): Video: 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 (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 191 kb/s (default)
    Metadata:
      creation_time   : 2016-01-31 09:44:23
      handler_name    : IsoMedia File Produced by Google, 5-11-2011
File 'n.h264' already exists. Overwrite ? [y/N] y
libva info: VA-API version 0.35.0
libva info: va_getDriverName() returns 0
libva info: User requested driver 'iHD'
libva info: Trying to open /opt/intel/mediasdk/lib64/iHD_drv_video.so
libva info: Found init function __vaDriverInit_0_32
libva info: va_openDriver() returns 0
[h264 @ 0x2fd4940] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.
Output #0, h264, to 'n.h264':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    encoder         : Lavf57.41.100
    Stream #0:0(und): Video: h264 (h264_qsv), nv12, 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 1000 kb/s, 24 fps, 24 tbn, 24 tbc (default)
    Metadata:
      handler_name    : VideoHandler
      encoder         : Lavc57.48.101 h264_qsv
    Side data:
      cpb: bitrate max/min/avg: 0/0/1000000 buffer size: 0 vbv_delay: -1
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (h264_qsv))
Press [q] to stop, [?] for help
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 other streams:0kB global headers:0kB muxing overhead: 0.000000%

Все еще нет звука. Может кто-то помочь мне с этим?

3 ответа

Я не знаю, как извлечь аудио и видео за один шаг, но вы можете легко извлечь аудио и видео с помощью короткого сценария.

Предполагая, что аудио - AAC, как в вашем посте:

#! /bin/bash
###################################################################
i="" # edit with the input avi file name including extension
###################################################################
  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="" # edit with the input h264 file name including extension
###################################################################
  ffmpeg -i "$i" -i "${i%.*}.".aac -vcodec copy -acodec copy "${i%.*}.".mp4
done

Это не идеальное решение, так как оно создает дополнительный шаг (как отмечено в комментариях). Но, по крайней мере, это даст вам отправную точку:)

Надеюсь, это поможет!:)

Как заявляли другие, нет причин делать это в несколько этапов, а формат 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

Обратите внимание, что на последнем шаге следует копировать кодеки, а не перекодировать.

.h264 - это формат необработанного видео-контейнера. Он не знает об аудио. ffmpeg ведет себя абсолютно корректно. Хотите h264 - получите. Без звука.

Другие вопросы по тегам