Spaces:
Paused
Paused
Update streamlit_app.py
Browse files- streamlit_app.py +29 -7
streamlit_app.py
CHANGED
|
@@ -61,10 +61,10 @@ def get_tiktok_stream_url():
|
|
| 61 |
pass
|
| 62 |
return None
|
| 63 |
|
| 64 |
-
def
|
| 65 |
if not stream_key or not stream_url:
|
| 66 |
return None
|
| 67 |
-
log("🎬 بدء البث ال
|
| 68 |
rtmp_url = f"rtmp://a.rtmp.youtube.com/live2/{stream_key}"
|
| 69 |
|
| 70 |
cmd = [
|
|
@@ -75,9 +75,27 @@ def start_stream_simple(stream_key, stream_url):
|
|
| 75 |
"-probesize", "50M",
|
| 76 |
"-thread_queue_size", "65535",
|
| 77 |
"-rtbufsize", "512M",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 78 |
"-i", stream_url,
|
|
|
|
|
|
|
| 79 |
"-err_detect", "ignore_err",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 80 |
"-vf", "scale=1080:1920:force_original_aspect_ratio=increase,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black:eval=frame",
|
|
|
|
|
|
|
| 81 |
"-c:v", "libx264",
|
| 82 |
"-preset", "ultrafast",
|
| 83 |
"-crf", "18",
|
|
@@ -92,13 +110,17 @@ def start_stream_simple(stream_key, stream_url):
|
|
| 92 |
"-color_primaries", "bt709",
|
| 93 |
"-color_trc", "bt709",
|
| 94 |
"-colorspace", "bt709",
|
|
|
|
|
|
|
| 95 |
"-c:a", "aac",
|
| 96 |
"-b:a", "192k",
|
| 97 |
"-ac", "2",
|
| 98 |
"-ar", "44100",
|
| 99 |
"-async", "1",
|
|
|
|
|
|
|
| 100 |
"-max_muxing_queue_size", "65535",
|
| 101 |
-
"-max_delay", "
|
| 102 |
"-flvflags", "no_duration_filesize+add_keyframe_index",
|
| 103 |
"-f", "flv", rtmp_url
|
| 104 |
]
|
|
@@ -127,7 +149,7 @@ def run_monitor():
|
|
| 127 |
was_streaming = False
|
| 128 |
consecutive_fails = 0
|
| 129 |
|
| 130 |
-
log("🚀 محرك البث ال
|
| 131 |
|
| 132 |
while True:
|
| 133 |
try:
|
|
@@ -138,7 +160,7 @@ def run_monitor():
|
|
| 138 |
log("🟢 بدء بث جديد...")
|
| 139 |
if processes:
|
| 140 |
kill_process_tree(processes["ffmpeg"].pid)
|
| 141 |
-
processes =
|
| 142 |
if processes:
|
| 143 |
is_streaming = True
|
| 144 |
was_streaming = True
|
|
@@ -146,7 +168,7 @@ def run_monitor():
|
|
| 146 |
else:
|
| 147 |
if is_streaming and processes and processes["ffmpeg"].poll() is not None:
|
| 148 |
log("⚠️ ffmpeg مات، إعادة تشغيل...")
|
| 149 |
-
processes =
|
| 150 |
if not processes:
|
| 151 |
is_streaming = False
|
| 152 |
was_streaming = False
|
|
@@ -168,7 +190,7 @@ def run_monitor():
|
|
| 168 |
time.sleep(10)
|
| 169 |
|
| 170 |
if __name__ == "__main__":
|
| 171 |
-
log("✅ بدء تشغيل المحرك ال
|
| 172 |
t = threading.Thread(target=run_monitor, daemon=True)
|
| 173 |
t.start()
|
| 174 |
while True:
|
|
|
|
| 61 |
pass
|
| 62 |
return None
|
| 63 |
|
| 64 |
+
def start_stream_final(stream_key, stream_url):
|
| 65 |
if not stream_key or not stream_url:
|
| 66 |
return None
|
| 67 |
+
log("🎬 بدء البث النهائي (مقاوم للتقطيع)...")
|
| 68 |
rtmp_url = f"rtmp://a.rtmp.youtube.com/live2/{stream_key}"
|
| 69 |
|
| 70 |
cmd = [
|
|
|
|
| 75 |
"-probesize", "50M",
|
| 76 |
"-thread_queue_size", "65535",
|
| 77 |
"-rtbufsize", "512M",
|
| 78 |
+
|
| 79 |
+
# 🛡️ درع إعادة الاتصال
|
| 80 |
+
"-reconnect", "1",
|
| 81 |
+
"-reconnect_streamed", "1",
|
| 82 |
+
"-reconnect_delay_max", "15",
|
| 83 |
+
"-timeout", "10000000",
|
| 84 |
+
|
| 85 |
"-i", stream_url,
|
| 86 |
+
|
| 87 |
+
# 🛡️ تصحيح الطوابع الزمنية وتجاهل التالف
|
| 88 |
"-err_detect", "ignore_err",
|
| 89 |
+
"-fflags", "+genpts+igndts+discardcorrupt",
|
| 90 |
+
"-avoid_negative_ts", "make_zero",
|
| 91 |
+
"-use_wallclock_as_timestamps", "1",
|
| 92 |
+
"-correct_ts_overflow", "1",
|
| 93 |
+
"-max_interleave_delta", "2000000",
|
| 94 |
+
|
| 95 |
+
# أبعاد 1080p
|
| 96 |
"-vf", "scale=1080:1920:force_original_aspect_ratio=increase,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black:eval=frame",
|
| 97 |
+
|
| 98 |
+
# فيديو – جودة عالية ومستقرة
|
| 99 |
"-c:v", "libx264",
|
| 100 |
"-preset", "ultrafast",
|
| 101 |
"-crf", "18",
|
|
|
|
| 110 |
"-color_primaries", "bt709",
|
| 111 |
"-color_trc", "bt709",
|
| 112 |
"-colorspace", "bt709",
|
| 113 |
+
|
| 114 |
+
# صوت – بسيط ومتناسق
|
| 115 |
"-c:a", "aac",
|
| 116 |
"-b:a", "192k",
|
| 117 |
"-ac", "2",
|
| 118 |
"-ar", "44100",
|
| 119 |
"-async", "1",
|
| 120 |
+
|
| 121 |
+
# إرسال – صمود إضافي
|
| 122 |
"-max_muxing_queue_size", "65535",
|
| 123 |
+
"-max_delay", "3000000", # 3 ثوانٍ مرونة
|
| 124 |
"-flvflags", "no_duration_filesize+add_keyframe_index",
|
| 125 |
"-f", "flv", rtmp_url
|
| 126 |
]
|
|
|
|
| 149 |
was_streaming = False
|
| 150 |
consecutive_fails = 0
|
| 151 |
|
| 152 |
+
log("🚀 محرك البث النهائي (مقاوم للتقطيع)")
|
| 153 |
|
| 154 |
while True:
|
| 155 |
try:
|
|
|
|
| 160 |
log("🟢 بدء بث جديد...")
|
| 161 |
if processes:
|
| 162 |
kill_process_tree(processes["ffmpeg"].pid)
|
| 163 |
+
processes = start_stream_final(STREAM_KEY, stream_url)
|
| 164 |
if processes:
|
| 165 |
is_streaming = True
|
| 166 |
was_streaming = True
|
|
|
|
| 168 |
else:
|
| 169 |
if is_streaming and processes and processes["ffmpeg"].poll() is not None:
|
| 170 |
log("⚠️ ffmpeg مات، إعادة تشغيل...")
|
| 171 |
+
processes = start_stream_final(STREAM_KEY, stream_url)
|
| 172 |
if not processes:
|
| 173 |
is_streaming = False
|
| 174 |
was_streaming = False
|
|
|
|
| 190 |
time.sleep(10)
|
| 191 |
|
| 192 |
if __name__ == "__main__":
|
| 193 |
+
log("✅ بدء تشغيل المحرك النهائي")
|
| 194 |
t = threading.Thread(target=run_monitor, daemon=True)
|
| 195 |
t.start()
|
| 196 |
while True:
|