Включить кеш на ffmpeg для записи потоковой передачи - PullRequest
4 голосов
/ 06 марта 2020

теперь я использую 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 ]

4 голосов
/ 09 марта 2020

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

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

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

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

3 голосов
/ 13 марта 2020

Я просто решил проблему с задержкой, избегая использования ffmpeg для сохранения видео, но используя прямую ссылку и записывая файл .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
...