Не удалось найти тег для кодека pcm_alaw в потоке #1, кодек в настоящее время не поддерживается в контейнере при объединении 2 файлов с использованием ffmpeg

Я пытаюсь объединить два файла, первый из которых содержит аудио и видео, а второй только видео. Я использую следующее ffmpeg команда:

ffmpeg_command = ["ffmpeg", "-f", "concat", "-safe", "0", "-i", "clips_to_join.txt", "-vcodec", "copy", "-acodec", "copy", output_file_path] # output_filename = ch0X-start_time-end_time
p = subprocess.Popen(ffmpeg_command)
p.communicate()

но я получаю следующую ошибку:

  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Invalid UE golomb code
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x1394700] Auto-inserting h264_mp4toannexb bitstream filter
Invalid UE golomb code
Guessed Channel Layout for  Input Stream #0.1 : mono
Input #0, concat, from 'clips_to_join.txt':
  Duration: N/A, start: 0.000000, bitrate: 5954 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 5894 kb/s, 14.06 fps, 30 tbr, 90k tbn, 180k tbc
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: pcm_alaw (alaw / 0x77616C61), 8000 Hz, 1 channels, s16, 64 kb/s
    Metadata:
      handler_name    : SoundHandler
[mp4 @ 0x13b16e0] Codec for stream 0 does not use global headers but container format requires global headers
[mp4 @ 0x13b16e0] Codec for stream 1 does not use global headers but container format requires global headers
[mp4 @ 0x13b16e0] Could not find tag for codec pcm_alaw in stream #1, codec not currently supported in container
Output #0, mp4, to '/path/ch1-20171109-131750-131949-101000000000-padded.mp4':
  Metadata:
    encoder         : Lavf56.40.101
    Stream #0:0(und): Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1920x1080, q=2-31, 5894 kb/s, 14.06 fps, 30 tbr, 90k tbn, 90k tbc
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: pcm_alaw (alaw / 0x77616C61), 8000 Hz, mono, 64 kb/s
    Metadata:
      handler_name    : SoundHandler
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument

1 ответ

Решение

Вы столкнулись с несколькими проблемами:

codec not currently supported in container

Это сообщение с вашей консоли. ffmpeg не поддерживается pcm_alaw в контейнере MP4.

Кодируйте аудио в поддерживаемый формат, такой как AAC, заменяя -acodec copy с -c:a aacили используйте более гибкий формат выходного контейнера, который поддерживает pcm_alaw, такие как MOV или MKV.

Все входы должны иметь одинаковые потоки

Когда на первом входе есть звук, а на втором нет, ваш плеер, скорее всего, сможет воспроизвести выход. Если бы только второй вход имел звук, он, вероятно, не воспроизводился бы должным образом. Однако для лучшей совместимости при конкатенации все входы должны иметь одинаковое количество потоков одинакового типа.

Добавить аудио во второй поток или пропустить звук из первого. Например, один из способов добавить тихий звук ко второму входу - использовать фильтр anullsrc:

ffmpeg -i input -filter_complex "anullsrc=channel_layout=mono:sample_rate=8000[a]"
  -map 0 -map "[a]" -c:v copy -c:a pcm_alaw -shortest output.mov

Видео в этом примере копируется потоком и поэтому не перекодируется.

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