Включить кеш на ffmpeg для записи потоковой передачи

Теперь я использую steamlink и ffmpeg для записи потоков и их сохранения в файл, много раз сохраненный видеофайл имеет такое большое отставание. Я нашел эту ссылку https://www.reddit.com/r/Twitch/comments/62601b/laggy_stream_on_streamlinklivestreamer_but_not_on/, где они утверждают, что проблема с задержкой возникает из-за того, что на плеере не включен кеш. Я пробовал поставить варианты-hls_allow_cache allowcache -segment_list_flags cache в результате процесс ffmpeg запускается более или менее на 8 секунд, после чего он заканчивается и сразу же запускается снова без возврата видеофайла, если я не поставлю эти два параметра, видео будет записано правильно, но большую часть времени с некоторыми отставание.

Очевидно, что если я перехожу к потоковой передаче из браузера, у меня нет проблем с задержкой

это код

from streamlink import Streamlink, NoPluginError, PluginError
streamlink = Streamlink()
#this code is just a snippet, it is inside a while loop to restart the process
try:
    streams = streamlink.streams(m3u8_url)
    stream_url = streams['best'].url
    #note hls options not seem to work
    ffmpeg_process = Popen(
        ["ffmpeg", "-hide_banner", "-loglevel", "panic", "-y","-hls_allow_cache", "allowcache", "-segment_list_flags", "cache","-i", stream_url, "-fs", "10M", "-c", "copy",
        "-bsf:a", "aac_adtstoasc", fileName])

    ffmpeg_process.wait()

except NoPluginError:
    print("noplugin")

except PluginError:
    print("plugin")

except Exception as e:
    print(e)

как лучше всего включить кеш и максимально ограничить задержку?

2 ответа

Решение

Я просто решил проблему с задержкой, избегая использования ffmpeg для сохранения видео, но напрямую используя streamlink и записывая файл.mp4

streamlink = Streamlink()
try:
    streams = streamlink.streams(m3u8_url)
    stream_url = streams['480p']
    fd = stream_url.open()

    out = open(fileName,"wb")

    while True:
        data = fd.read(1024)
        if data is None or data == -1 or data == 0:
           break
        else:
            out.write(data)
      fd.flush()
      fd.close()
      out.flush()
      out.close()
except NoPluginError:
    #handle exception        
except PluginError:
    #handle exception        
except StreamError:
    #handle exception        
except Exception as e:
    #handle exception

Вы можете прочитать FFmpeg StreamingGuide для получения более подробной информации о задержках. Например, у вас есть

опция -fflags nobuffer что, возможно, может помочь, обычно для уменьшения задержки при приеме потоков.

Как вы можете прочитать здесь оnobuffer

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

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