现在我使用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)
启用缓存并尽可能限制滞后的最佳选项是什么?
您可以阅读FFmpeg StreamingGuide以了解有关延迟的更多详细信息。例如,你有
一个选项
-fflags nobuffer
,它可能会有所帮助,通常用于接收流减少延迟。
您可以在此处阅读有关nobuffer
的信息
减少初始输入期间缓冲带来的延迟流分析。
我简单地解决了滞后问题,避免使用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