You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:50:51