使用Pyrogram批量上传视频画面拉伸、时长不显示的解决咨询
解决Pyrogram批量上传视频画面拉伸、时长不显示的方案
核心问题原因
- 画面拉伸:Pyrogram未自动识别视频原始宽高比例,导致平台默认拉伸适配
- 时长不显示:未显式传递视频时长参数,或视频元数据读取异常
具体解决步骤
1. 自动提取视频元数据
借助ffmpeg-python读取视频的宽高、时长信息,无需手动指定。先安装依赖:
pip install ffmpeg-python
编写提取元数据的函数:
import ffmpeg def get_video_metadata(video_path): try: probe = ffmpeg.probe(video_path) video_stream = next((s for s in probe['streams'] if s['codec_type'] == 'video'), None) if not video_stream: return None return { 'width': int(video_stream['width']), 'height': int(video_stream['height']), 'duration': float(video_stream['duration']) } except Exception as e: print(f"读取{video_path}元数据失败: {e}") return None
2. 修改上传代码,传递元数据参数
- 批量上传时只需启动一次Pyrogram客户端,避免重复启停的性能损耗
- 将提取到的宽高、时长传入
send_video方法 - 去掉不可靠的
time.sleep(1),确保上传完成后再处理原文件
修改后的完整代码示例:
from pyrogram import Client, enums import time def get_video_metadata(video_path): import ffmpeg try: probe = ffmpeg.probe(video_path) video_stream = next((s for s in probe['streams'] if s['codec_type'] == 'video'), None) if not video_stream: return None return { 'width': int(video_stream['width']), 'height': int(video_stream['height']), 'duration': float(video_stream['duration']) } except Exception as e: print(f"读取{video_path}元数据失败: {e}") return None def upload_single_video(app, video_file, fname): def progress(current, total): print(f"{video_file} 上传进度: {current * 100 / total:.1f}%") metadata = get_video_metadata(video_file) if not metadata: print(f"{video_file} 元数据异常,跳过上传") return app.send_video( chat_id='chat_id', video=video_file, caption=fname, parse_mode=enums.ParseMode.MARKDOWN, progress=progress, width=metadata['width'], height=metadata['height'], duration=int(metadata['duration']) ) # 上传完成后清空文件 with open(video_file, 'w', encoding='utf-8') as f: f.write('') def batch_upload_videos(video_list): app = Client("my_account") app.start() for video_file, fname in video_list: upload_single_video(app, video_file, fname) time.sleep(2) # 控制请求频率,避免触发限制 app.stop() # 示例调用 if __name__ == "__main__": video_tasks = [ ("video1.mp4", "视频1标题"), ("video2.mp4", "视频2标题") ] batch_upload_videos(video_tasks)
3. 无依赖备选方案
如果不想引入第三方库,可以尝试添加supports_streaming=True参数,部分场景下Pyrogram会自动解析视频元数据:
app.send_video( chat_id='chat_id', video=video_file, caption=fname, parse_mode=enums.ParseMode.MARKDOWN, progress=progress, supports_streaming=True )
额外注意事项
- 确保视频文件本身元数据完整,损坏的视频可能导致读取失败
- 批量上传时合理控制间隔,避免触发平台频率限制
- 不要在上传过程中修改或删除原文件,依赖进度回调确认完成更可靠
内容的提问来源于stack exchange,提问作者suixin
相关产品推荐
相关产品推荐

