ur5lgq/iptv-transcoder
0
1 # Транскодирование HLS с расширенными HTTP-заголовками для обхода блокировок HTTPS2 ffmpeg_cmd = [3 'ffmpeg',4 '-user_agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',5 '-headers', 'Accept: */*\r\nAccept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7\r\nOrigin: https://youtube.com\r\n',6 '-analyzeduration', '10000000', '-probesize', '10000000',7 '-reconnect', '1', '-reconnect_at_eof', '1',8 '-reconnect_streamed', '1', '-reconnect_delay_max', '5',9 '-re', '-i', final_url,10 '-map', '0:v:0', '-map', '0:a:0',11 '-vf', f'fps=25,scale={scale}',12 '-c:v', 'libx264', '-g', '50', '-keyint_min', '50',13 '-sc_threshold', '0', 14 '-crf', '23', '-maxrate', bitrate, '-bufsize', bufsize,15 '-preset', 'veryfast', '-tune', 'zerolatency', '-profile:v', 'main',16 '-c:a', 'aac', '-b:a', '64k', '-threads', '1',17 '-map_metadata', '-1', '-fflags', '+bitexact', '-flags', '+bitexact',18 '-f', 'hls', '-hls_time', '2', '-hls_list_size', '5',19 '-hls_flags', 'delete_segments+independent_segments',20 os.path.join(HLS_DIR, 'low.m3u8')21 ]22 23 24 25 # Транскодирование HLS с ультра-низкой нагрузкой на CPU и ускоренной отдачей26 ffmpeg_cmd = [27 'ffmpeg',28 '-user_agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',29 '-headers', 'Accept: */*\r\nAccept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7\r\nOrigin: https://youtube.com\r\n',30 '-analyzeduration', '10000000', '-probesize', '10000000',31 '-reconnect', '1', '-reconnect_at_eof', '1',32 '-reconnect_streamed', '1', '-reconnect_delay_max', '5',33 '-re', '-i', final_url,34 '-map', '0:v:0', '-map', '0:a:0',35 '-vf', f'fps=25,scale={scale}',36 '-c:v', 'libx264', '-g', '50', '-keyint_min', '50',37 '-sc_threshold', '0', 38 '-crf', '28', '-maxrate', bitrate, '-bufsize', bufsize, # Увеличен CRF (меньше нагрузка на CPU)39 '-preset', 'ultrafast', '-tune', 'zerolatency', # Изменено на ultrafast для минимального CPU40 '-profile:v', 'baseline', # Облегченный профиль h264 для экономии ресурсов41 '-c:a', 'aac', '-b:a', '64k', '-threads', '2', # Выделено 2 потока на обработку42 '-map_metadata', '-1', '-fflags', '+bitexact', '-flags', '+bitexact',43 '-f', 'hls', '-hls_time', '2', '-hls_list_size', '5',44 '-hls_flags', 'delete_segments+independent_segments',45 os.path.join(HLS_DIR, 'low.m3u8')46 ]47ffmpeg_cmd = [48 'ffmpeg',49 '-hide_banner',50 '-loglevel', 'warning',51 52 # HTTP53 '-user_agent', 'Mozilla/5.0',54 55 # Входной буфер56 '-thread_queue_size', '512',57 58 # Автопереподключение59 '-reconnect', '1',60 '-reconnect_streamed', '1',61 '-reconnect_at_eof', '1',62 '-reconnect_delay_max', '5',63 64 # Вход65 '-i', final_url,66 67 # Корректные временные метки68 '-fflags', '+genpts',69 70 # Видео71 '-map', '0:v:0',72 '-vf', f'scale={scale}:flags=fast_bilinear',73 74 '-r', '25',75 76 '-c:v', 'libx264',77 '-preset', 'ultrafast',78 '-profile:v', 'main',79 '-level', '3.1',80 '-pix_fmt', 'yuv420p',81 82 # Постоянный битрейт83 '-b:v', bitrate,84 '-minrate', bitrate,85 '-maxrate', bitrate,86 '-bufsize', bufsize,87 88 # GOP89 '-g', '50',90 '-keyint_min', '50',91 '-sc_threshold', '0',92 93 # Настройки x26494 '-x264-params', 'nal-hrd=cbr:force-cfr=1',95 96 # Аудио97 '-map', '0:a:0?',98 '-c:a', 'aac',99 '-b:a', '96k',100 '-ar', '48000',101 '-ac', '2',102 '-af', 'aresample=async=1000',103 104 # HLS105 '-max_muxing_queue_size', '2048',106 107 '-f', 'hls',108 '-hls_time', '4',109 '-hls_list_size', '4',110 '-hls_flags', 'delete_segments+independent_segments',111 '-hls_allow_cache', '0',112 113 os.path.join(HLS_DIR, 'low.m3u8')114]115 116Что изменилось и почему это важно:-preset ultrafast — Перевод энкодера в самый быстрый режим.117Качество картинки станет незначительно хуже, но использование CPU упадет критически,118освободив ресурсы для работы Flask.-profile:v baseline — Отключает сложные алгоритмы сжатия 119(такие как B-кадры), которые требуют огромных вычислительных мощностей при декодировании и 120кодировании.-crf 28 — Снижает битрейт на динамических сценах, предотвращая перегрузку буфера121обмена данными внутри контейнера.-threads 2 — Явно разрешает FFmpeg задействовать второе ядро122процессора (если оно доступно в контейнере),123разделяя задачи декодирования mp2 и кодирования h264.124 125 12612_08_26 рабочий вариант127----------------------------------------------------------------128 else:129 # Настраиваем scale, bitrate, bufsize и CRF под каждый профиль индивидуально130 if profile == '720': 131 scale, bitrate, bufsize, crf_val = '1280:720', '2500k', '5000k', '20' # Выше четкость для HD132 elif profile == '480': 133 scale, bitrate, bufsize, crf_val = '854:480', '1000k', '2000k', '21' # Стандартный баланс134 else: 135 scale, bitrate, bufsize, crf_val = '640:360', '500k', '1000k', '22' # Максимальное сжатие для экономии136 137 138 ffmpeg_cmd = [139 "ffmpeg",140 "-hide_banner",141 "-loglevel", "debug",142 143 "-user_agent", "Lavf/61.7.103",144 145 "-i", final_url,146 147 "-vf", f"scale={scale}",148 149 "-c:v", "libx264",150 "-preset", "veryfast",151 "-tune", "zerolatency",152 "-crf", crf_val,153 154 "-c:a", "aac",155 "-b:a", "64k",156 157 "-f", "hls",158 "-hls_time", "4",159 "-hls_list_size", "5",160 "-hls_flags", "delete_segments",161 "-hls_segment_filename", os.path.join(HLS_DIR, "seg_%d.ts"),162 163 os.path.join(HLS_DIR, "low.m3u8")164 ]165 ffmpeg_process = subprocess.Popen(ffmpeg_cmd)166 stream_status = True167------------------------------------------------------------------------168 