FFMPEG не работает в AWS Lambda - PullRequest
       70

FFMPEG не работает в AWS Lambda

0 голосов
/ 10 сентября 2018

Я пытаюсь создать функцию транскодирования для коротких видео. Функция размещена на AWS Lambda. Проблема в том, что в AWS lambda, похоже, отсутствует то, что требуется FFMPEG, по крайней мере, согласно Amazon.

Я связался с Amazon раньше, и это их ответ на проблему:

Мы обнаружили, что для операций FFMPEG требуется как минимум libx264 и библиотека acc, обе из которых будут иметь свои собственные зависимости. к устранить проблему, это будет включать в себя погружение вглубь цепочка зависимостей. Мы видим, что это работает в Amazon Linux среда, однако, среда похожа, но не идентична лямбда-окружение. Там могут быть некоторые зависимости, которые существуют в Amazon Linux, но не в лямбда-среде, поскольку Lambda работает на контейнер. Здесь, поскольку FFmpeg является сторонним программным обеспечением, погружение глубже в цепочку зависимостей и проверка совместимости версий очень трудно сделать К сожалению, идти дальше, это неизбежно поддержка архитектуры и кода, выходящая за рамки поддержки AWS 1 . я надеюсь, вы понимаете наши ограничения. Однако следует FFmpeg поддерживать есть какие-либо вопросы, относящиеся к платформе Lambda, пожалуйста, дайте нам знать, и мы будем рады помочь. Мы будем в лучшем положении исследовать дальше, как только вы получите обновление от поддержки FFmpeg предлагая проблему с конца лямбды.

По предложению AWS я связался с FFMPEG в списке рассылки для разработчиков, мое сообщение было отклонено по той причине, что оно больше подходит для списка рассылки пользователей ffmpeg, чем для разработчиков. Я отправил письмо на ffmpeg-user@ffmpeg.org неделю назад и не получил никакого ответа.

Затем я создал динамически связанную версию ffmpeg, убедившись, что упаковал все библиотеки, проверил ddl на каждой, а затем создал небольшую лямбда-функцию, которая зацикливается на всех двоичных файлах и дублирует каждую из них, по сравнению с выводом I полученный из Amazon Linux, и те же зависимости / версии существуют и для лямбды, и для экземпляра AWS Linux, но ffmpeg все еще не работает на лямбде.

Подробный файл журнала вы можете найти здесь: https://www.datafilehost.com/d/6e5e21bb

И это пример ошибок, которые я получаю, повторяющихся по всему файлу журнала:

2018-08-14T12: 27: 10,874Z [h264 @ 0x65c2fc0] скрывая 2628 DC, 2628 AC, 2628 МВ ошибок в P-кадре

2018-08-14T12: 27: 10.874Z [aac @ 0x65d2f00] канальный элемент 2.11 не является выделяется

2018-08-14T12: 27: 10.874Z Ошибка при декодировании потока № 0: 1: неверно данные, найденные при обработке ввода

2018-08-14T12: 27: 10.874Z [h264 @ 0x67e86c0] Неверный размер блока NAL (108085662> 1649).

2018-08-14T12: 27: 10.874Z [h264 @ 0x67e86c0] Ошибка разделения входа в единицы NAL.

2018-08-14T12: 27: 10.874Z [aac @ 0x65d2f00] канальный элемент 2.0 не является выделяется

2018-08-14T12: 27: 10.874Z Ошибка при декодировании потока № 0: 1: неверно данные, найденные при обработке ввода

2018-08-14T12: 27: 10.874Z [h264 @ 0x68189c0] Неверный размер блока NAL (71106974> 1085).

2018-08-14T12: 27: 10.874Z [h264 @ 0x68189c0] Ошибка разделения входа в единицы NAL.

2018-08-14T12: 27: 10.874Z [aac @ 0x65d2f00] Импульсный инструмент не допускается в восемь коротких последовательностей.

Этот журнал создается при попытке выполнить транскодирование HLS для этого файла: https://www.datafilehost.com/d/999a4492

Обратите внимание, что проблема связана не только с этим файлом, но и не связана с HLS, его общим и возникает во всех видео и любой команде ffmpeg, которая пытается найти поток, даже пытаясь извлечь один кадр из видео, используя простейшая форма, например: ffmpeg -ss 00:00:02 -I file.mp4 -vframes 1 -y output.jpg также не работает с теми же ошибками в файле журнала.

Не уверен, как отладить это дальше. Попытался включить журналы отладки с помощью -loglevel debug, но не дал мне никакой дополнительной информации. Любая помощь или предложения

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Вы пытались использовать статически скомпилированный ffmpeg?

Вот что у меня сработало:

  1. Схватил статическую сборку ffmpeg из https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz
  2. Извлекает и удаляет все, кроме ffmpeg самого двоичного файла. chmod этот двоичный файл, чтобы разрешить выполнение и поместить в bin/ffmpeg внутри папки развертывания (в моем случае папка будет заархивирована и развернута zappa)
  3. Скопировал двоичный файл ffmpeg внутрь /tmp. (Я получил ошибку «Операция не разрешена» при выполнении ffmpeg из /var/task/bin, мои знания о самом ffmpeg ограничены, но я предполагаю, что ffmpeg будет создавать временные файлы во время обработки, и поскольку lambda имеет файловую систему только для чтения, это может быть только сделано внутри /tmp, в моем случае я конвертирую caf в mp4)
  4. Добавлено /tmp для поиска путей, чтобы ffmpeg был доступен по пути. (необходимо при использовании сторонних производителей, которые инкапсулируют вызовы ffmpeg внутри, например pydub)

Здесь приведен соответствующий код Python, поскольку лямбда-контейнеры будут использоваться повторно, /tmp может уже содержать скопированный ffmpeg.

from os import environ, path
from shutil import copy2

# check if we have ffmpeg inside /tmp, if we do, no need to copy
# otherwise copy ffmpeg from /var/task/bin to /tmp
if environ.get('AWS_EXECUTION_ENV', '').startswith('AWS_Lambda_') and not path.isfile('/tmp/ffmpeg'):
    copy2(path.join(PROJECT_ROOT, 'bin/ffmpeg'), '/tmp/ffmpeg')

# add /tmp to search paths if it's not there
# so ffmpeg executed from pydub will be found
custom_deps_bin_path = '/tmp/'
if environ.get('AWS_EXECUTION_ENV', '').startswith('AWS_Lambda_') and custom_deps_bin_path not in environ['PATH']:
    environ['PATH'] += ":" + custom_deps_bin_path

Также есть несколько соответствующих третьих сторон для этого:

  1. бинокль / AWS лямбда-FFmpeg
  2. ubergarm / Заппа-FFmpeg
0 голосов
/ 18 февраля 2019

Я столкнулся с точно такой же проблемой сегодня и провел часы. Но, наконец, я наткнулся на этот SO ответ и нашел решение.

По сути, вам нужно убедиться, что вы не передаете STDIN процессу FFmpeg. Это упомянуто в статье re: Invent talk на этом слайде .

0 голосов
/ 18 ноября 2018

Если у вас проблемы с ffmpeg, попробуйте вместо этого avconv. avconv является форком ffmpeg и может быть вызван таким же образом. У меня были те же проблемы, что и с ffmpeg, когда я пытался декодировать аудиопоток в среде lambda, но статическая сборка avconv Джона Ван Сикла сработала, как и ожидалось.

Кроме того, убедитесь, что для лямбда-функции достаточно памяти. Статические двоичные файлы ffmpeg большие, и для кодирования требуется много оперативной памяти, особенно если вы кодируете видео.

...