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

Django中检查Base64视频音视频编解码器遇BytesIO报错求助

解决Base64视频编解码器检测的错误及替代方案

错误原因

VideoFileClip不支持直接传入BytesIO对象,它的构造逻辑会尝试对输入值调用endswith方法判断文件格式,而BytesIO实例没有这个属性,因此触发AttributeError。


方案一:临时文件中转(兼容MoviePy)

将Base64解码后的二进制数据写入临时文件,再通过文件路径传给VideoFileClip:

import base64
import tempfile
import os
from moviepy.editor import VideoFileClip

def get_video_codec_info(base64_data):
    # 解码Base64数据
    _format, _file_str = base64_data.split(";base64,")
    binary_data = base64.b64decode(_file_str)

    # 创建临时文件
    with tempfile.NamedTemporaryFile(delete=False, suffix=".mp4") as temp_file:
        temp_file.write(binary_data)
        temp_file_path = temp_file.name

    try:
        # 通过文件路径加载视频
        clip = VideoFileClip(temp_file_path)
        codec_info = {
            'video_codec': clip.video_codec,
            'audio_codec': clip.audio_codec,
        }
        return codec_info
    finally:
        # 清理临时文件
        os.unlink(temp_file_path)

方案二:用ffprobe直接解析(更高效)

无需加载整个视频,直接调用ffprobe(ffmpeg配套工具)解析二进制数据,性能更优,适合Web场景:

import base64
import subprocess
import json

def get_video_codec_info(base64_data):
    # 解码Base64数据
    _format, _file_str = base64_data.split(";base64,")
    binary_data = base64.b64decode(_file_str)

    # 调用ffprobe命令,从管道读取视频数据
    cmd = [
        "ffprobe",
        "-v", "quiet",
        "-print_format", "json",
        "-show_streams",
        "-i", "pipe:0"  # 从标准输入管道读取数据
    ]

    # 执行命令并传入二进制数据
    result = subprocess.run(
        cmd,
        input=binary_data,
        capture_output=True,
        text=True
    )

    if result.returncode != 0:
        raise ValueError("无法解析视频文件")

    # 解析输出提取编解码器信息
    streams = json.loads(result.stdout)["streams"]
    codec_info = {}
    for stream in streams:
        if stream["codec_type"] == "video":
            codec_info["video_codec"] = stream["codec_name"]
        elif stream["codec_type"] == "audio":
            codec_info["audio_codec"] = stream["codec_name"]

    return codec_info

注意事项

  • 确保服务器已安装ffmpeg(包含ffprobe工具),Ubuntu/Debian可通过apt install ffmpeg安装,CentOS/RHEL用yum install ffmpeg。
  • 方案二无需依赖MoviePy,减少项目依赖,且避免加载视频到内存,更适合大文件场景。

内容的提问来源于stack exchange,提问作者mahmudsajib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:07:47