Лучший способ передать фрагменты аудио и видео из Python в ffmpeg

Проблема

Я получаю аудио- и видео-фрагменты со стороннего сервера, и я хотел бы передать эти фрагменты в ffmpeg для создания живого потока WebM в соответствии с этими инструкциями:

http://wiki.webmproject.org/adaptive-streaming/instructions-to-do-webm-live-streaming-via-dash

Здесь они используют ввод с веб-камеры и микрофона, но мне нужно использовать фрагменты данных, поэтому команда ffmpeg будет выглядеть примерно так:

    cmd = [
        "ffmpeg",
        "-f", "flv", "-i", "video.fifo",
        "-f", "s16le", "-ar", "16000", "-ac", "1", "-i", "audio.fifo",
        "-map", "0:0",
        "-pix_fmt", "yuv420p",
        "-c:v", "libvpx-vp9",
        "-s", "640x480", "-keyint_min", "40", "-g", "40", "-speed", "6",
        "-tile-columns", "4", "-frame-parallel", "1", "-threads", "8",
        "-static-thresh", "0", "-max-intra-rate", "300",
        "-deadline", "realtime", "-lag-in-frames", "0",
        "-error-resilient", "1",
        "-b:v", "3000k",
        "-f", "webm_chunk",
        "-header", self.video_header,
        "-chunk_start_index", "1",
        "video_360_%d.chk",
        "-map", "1:0",
        "-c:a", "libvorbis",
        "-b:a", "16k", "-ar", "16000",
        "-f", "webm_chunk",
        "-audio_chunk_duration", "2000",
        "-header", self.audio_header,
        "-chunk_start_index", "1",
        "audio_171_%d.chk"
    ]

Как видите, я использую файлы «video.fifo» и «audio.fifo», потому что я подумал, что было бы неплохо передать фрагменты через именованный канал, но я не могу заставить его работать . Вот что я делаю:

p = subprocess.Popen(cmd)
fa = os.open("video.fifo", os.O_WRONLY)
fv = os.open("audio.fifo", os.O_WRONLY)

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

Вопрос

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


person basilikum    schedule 06.05.2016    source источник
comment
Я точно хочу добиться этого и отправлять необработанное видео / аудио в два разных канала, поскольку отправка их в один делает мое видео странным и все еще без звука!   -  person Mohammad Moallemi    schedule 28.01.2021


Ответы (1)


Инструкции в вашей ссылке советуют запускать ffmpeg в фоновом режиме. На странице руководства ffmpeg:

-стдин

Включить взаимодействие при стандартном вводе. По умолчанию включен, если стандартный ввод не используется в качестве ввода. Чтобы явно отключить взаимодействие, необходимо указать -nostdin.

Отключение взаимодействия при стандартном вводе полезно, например, если ffmpeg находится в группе фоновых процессов. Примерно того же результата можно достичь с помощью ffmpeg ... ‹/ dev / null, но для этого требуется оболочка.

Не так давно у меня была похожая проблема. При обработке нескольких входов ffmpeg будет работать должным образом в первый раз, а затем каждый раз после этого начинает выдавать ошибки. Добавление -nostdin к вашим глобальным аргументам или </dev/null должно исправить проблему. Без всяких наворотов должно работать одно из следующих действий.

ffmpeg [in-args][input][out-args][output] & </dev/null

ffmpeg [-nostdin in-args][input][out-args][output] &

Надеюсь это поможет.

person I0_ol    schedule 08.05.2016