使用Python-telegram-bot发送视频消息异常:返回普通视频而非视频消息
问题解决方法
问题根源
Telegram平台里,**普通视频(Video)和视频消息(Video Note)**是完全独立的媒体类型,二者的File ID不兼容。你直接传入普通视频的File ID调用reply_video_note,Telegram会默认按原视频类型返回,不会自动转换为视频消息格式。
解决步骤
要实现将收到的普通视频转为视频消息回复,需要先对视频进行格式处理,再调用API发送:
- 视频必须是正方形分辨率(推荐640x640)
- 编码格式需为MP4
- 文件大小不超过1GB,时长不超过60秒
修改后的代码示例
这里用moviepy库处理视频格式转换,先安装依赖:
pip install moviepy python-telegram-bot
代码实现:
from moviepy.editor import VideoFileClip import os from telegram import Update from telegram.ext import ContextTypes.DEFAULT_TYPE async def send_video_note_to_user(update: Update, context: ContextTypes.DEFAULT_TYPE): video = update.message.video if video: # 1. 下载收到的普通视频到本地 video_file = await context.bot.get_file(video.file_id) local_video_path = "temp_video.mp4" await video_file.download_to_drive(local_video_path) # 2. 转换视频为正方形格式,符合Video Note要求 with VideoFileClip(local_video_path) as clip: # 获取视频最短边长度,裁剪成正方形 min_dim = min(clip.size) square_clip = clip.crop(x_center=clip.size[0]/2, y_center=clip.size[1]/2, width=min_dim, height=min_dim) # 保存转换后的视频 converted_path = "video_note.mp4" square_clip.write_videofile(converted_path, codec="libx264", audio_codec="aac") # 3. 发送转换后的视频消息 with open(converted_path, "rb") as f: await update.message.reply_video_note(video_note=f) # 清理临时文件 os.remove(local_video_path) os.remove(converted_path)
补充说明
- 如果不需要保留原视频的音频,可以在转换时添加
audio=False参数 - 若视频时长超过60秒,需要额外裁剪时长,比如
square_clip.subclip(0, 60) - 生产环境建议增加异常处理,避免文件操作或转换失败导致报错
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

