Ошибка ограничения памяти при использовании ffmpeg на heroku - PullRequest
0 голосов
/ 13 июля 2020

У меня есть приложение Flask на Heroku, и я пытаюсь использовать FFmpeg для перекодирования видео в x265. Для этого у меня есть следующий маршрут

@app.route('/x265', methods=['POST'])
def rotax265():
    up_file = request.files['file'].stream

    in_file = tempfile.TemporaryFile()
    in_file.write(up_file.read())
    in_file.seek(0)
    out_file = tempfile.TemporaryFile()

    conv = VideoConverter(in_file, out_file)

    conv.x265()
    out_file.seek(0)
    
    return out_file.read()

Он использует созданный мной класс VideoConverter:

class VideoConverter(object):
    def __init__(self, in_file, out_file):
        self.input = in_file
        self.output = out_file

    def x265(self, read_chunk_size=-1):
        args = (
            ffmpeg
            .input('pipe:', format='matroska')
            .output('pipe:', vcodec='libx265', format='matroska')
            .get_args()
        )

        p = subprocess.Popen(
            ['ffmpeg'] + args, stdin=self.input, stdout=self.output)
        p.wait()

Этот класс использует ffmpeg-python и subprocess модулей.

Я использую канал как на входе, так и на выходе, чтобы не использовать место для хранения и не получать ошибки R-14 (превышена квота памяти).

Это работает должным образом при локальном запуске, но когда я пытаюсь запустить сценарий на сервере Heroku, он по-прежнему возвращает ошибки R-14.

Есть ли способ избежать этих ошибок?

1 Ответ

1 голос
/ 13 июля 2020

Я использую канал как на входе, так и на выходе, чтобы не использовать пространство для хранения и избежать ошибок R-14 (превышена квота памяти).

Хранилище (диск) и память (RAM) - разные вещи. Эта ошибка касается памяти .

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

Если у вас возникают проблемы с памятью на Heroku, у вас есть только два варианта:

  • Использовать меньше памяти
  • Обновить дино до динамометрических станций с большим объемом памяти

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

...