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