При отправке через Telethon видеофайлов размером более 50 МБ в веб‑версии Telegram они отображаются некорректно: у файлов заданы атрибуты (продолжительность, разрешение), но они не открываются для просмотра — остаются некликабельными. <br/> (Файлы меньше 50 МБ тоже, кажется, отправляются, но у них нет превью в отличие от ручной отправки.) <br/> <br/> На мобильных и в Desktop‑версии проблем нет — всё воспроизводится нормально. Видео менее 50 МБ отправляются и воспроизводятся без нареканий. Само видео исправно: при ручной загрузке через интерфейс Telegram всё работает штатно. <br/> <br/> Отправка реализована через telethon. Использую fast telethon, но при использовании простого метода telethon.send_file поведение одинаковое, поэтому проблема, вероятно, не в fast telethon. Ниже — фрагмент кода: <br/> <br/> async def send_video(client, chatid, video): <br/> def progress(current, total): <br/> percent = (current / total) * 100 <br/> print(f'Загружено: {percent:.1f}%', end='\r') <br/> <br/> def get_metadata(): <br/> probe = ffmpeg.probe(video) <br/> attributes = next(d for d in probe['streams'] if d['codec_type'] == 'video') <br/> <br/> width = int(attributes['width']) <br/> height = int(attributes['height']) <br/> duration = int(float(attributes['duration'])) <br/> return width, height, duration <br/> <br/> file_size = os.path.getsize(video) / (1024 * 1024) <br/> print(f'Размер файла: {file_size:.2f} MB') <br/> <br/> try: <br/> with open(video, 'rb') as out: <br/> width, height, duration = get_metadata() <br/> uploaded = await upload_file( <br/> client, <br/> out, <br/> progr
Коротко — браузерная версия Telegram не может «стримить» MP4, если в контейнере метаданные (moov atom) находятся в конце файла. Мобильные и десктоп‑клиенты часто просто докачивают файл целиком и воспроизводят его позже, поэтому там проблема не заметна; файлы маленького размера браузер успевает скачать полностью и тоже проигрываются. При больших файлах (>≈50 МБ) веб‑клиент ожидает streamable‑файл, и если moov в конце — он не даёт обычного плеера (файл остаётся некликабельным), хотя атрибуты (длительность, разрешение) видны.
Что делать — два пути (рекомендуется 1):
1) Сделать MP4 streamable (перенести moov в начало)
- Самый простой и надёжный вариант — «перемонтировать» файл без перекодирования:
ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4
Это переставит moov‑атом в начало и сделает файл пригодным для прогрессивного воспроизведения в браузере.
2) Правильно указывать атрибуты при отправке (Telethon)
- Убедиться, что при отправке вы передаёте mime_type/атрибут DocumentAttributeVideo с supports_streaming=True и корректными duration/width/height. Пример:
from telethon.tl.types import DocumentAttributeVideo
await client.send_file(
chatid,
'output.mp4',
thumb='thumb.jpg', # опционально
attributes=[DocumentAttributeVideo(duration, width, height, supports_streaming=True)],
mime_type='video/mp4',
progress_callback=progress
)
- Это полезно, но само по себе не заменит перемещения moov — если контейнер не streamable, веб‑плееру будет по‑прежнему нечего стримить.
Доп. замечания
- Формат: для веба лучше MP4 (h264/aac). WebM/VP9 может вести себя иначе.
- Проверка: маленькие файлы воспроизводятся, потому что браузер скачивает их полностью; при больших — нет, если moov в конце.
- Если вы используете стороннюю функцию upload_file вручную — убедитесь, что итоговый файл тот же (remux +faststart) и что при отправке передаёте правильный mime_type/attributes.
Итог: перемонтируйте (remux) видео с -movflags +faststart и/или явно укажите DocumentAttributeVideo(supports_streaming=True) при отправке — это обычно решает проблему с некликабельными видео в веб‑версии Telegram.