Попытка перекодировать видео с FFMpeg Layer на Lambda - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь преобразовать .ogv файлы в .mp4, используя слой ffmpeg на AWS Лямбда .


Я следовал учебник от людей в Serverless Framework для преобразования .mp4 в GIF, и это сработало замечательно. Используя те же ffmpeg stati c build , (ffmpeg- git -amd64-stati c .tar.xz), я решил преобразовать файлы .ogv в .mp4 файлы.

До сих пор я успешно загружал видео в S3 Bucket, получал лямбду для извлечения этого видео, делал что-то с видео с помощью двоичного файла ffmpeg и копировал новый файл в S3.


Проблема:

Видео, которые создаются, не будут воспроизводиться.

точка данных 1: результирующие файлы от функции слишком малы.

Входной видеофайл имеет размер 1,3 МБ, а выходной - всего 256,0 КБ

точка данных 2: атом moov не найден .

После копирования результирующего видео с S3 на мой локальный компьютер, я пытаюсь воспроизвести, используя ffplay, и получаю эту ошибку:

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fd613093400] moov atom not found
frank.mp4: Invalid data found when processing input

Насколько я могу я мог сказать, что атом moov должен содержать важные метаданные о .mp4 файлах.


Реализация:

Я использовал инфраструктуру Serverless для настройки инфраструктуры AWS .

Вот несколько разных ffmpeg команд, которые я пробовал:

1-я попытка:

  // convert to mp4!
    spawnSync(
      "/opt/ffmpeg/ffmpeg",
      [
        "-i",
        `/tmp/${record.s3.object.key}`,
        "-vcodec",
        "libx264",
        "-acodec",
        "aac",
        `/tmp/${record.s3.object.key}.mp4`
      ],
      { stdio: "inherit" }
    );

2-я попытка:

 // convert to mp4!
    spawnSync(
      "/opt/ffmpeg/ffmpeg",
      [
        "-i",
        `/tmp/${record.s3.object.key}`,
        `/tmp/${record.s3.object.key}.mp4`
      ],
      { stdio: "inherit" }
    );

3-я попытка:

Я нашел этот подход в переполнении стека вопрос , и на плакате говорилось, что он работает для него.

// convert to mp4!
spawnSync(
  "/opt/ffmpeg/ffmpeg",
  [
    '-i',
    `/tmp/${record.s3.object.key}`,
    '-codec:v',
    'libx264',
    '-profile:v',
    'main',
    '-preset',
    'slow',
    '-b:v',
    '400k',
    '-maxrate',
    '400k',
    '-bufsize',
    '800k',
    '-threads',
    '0',
    '-b:a',
    '128k',
    `/tmp/${record.s3.object.key}.mp4`
  ],
  { stdio: "inherit" }
);

Каждая из этих работ набухает моя локальная машина.

Если бинарный файл ffmpeg, который я использую, не был популярным (я видел его на нескольких сайтах, занимающихся связь с транскодированием на Lambda), я думаю, что это проблема со слоем ... Возможно.

Любое понимание будет с благодарностью. Спасибо.

1 Ответ

0 голосов
/ 05 марта 2020

Это было простое и в моем случае упущенное исправление, связанное с моей конфигурацией Lambda.

Ошибка

По умолчанию у Lambdas есть 6-секундный тайм-аут после которые они прекращают обрабатывать.

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

Исправление

Я установил тайм-аут для своей лямбда-функции на 15-минутный максимум. После этого процесс сработал так, как ожидалось, и видео было перекодировано и воспроизведено.

...