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
相关产品推荐
相关产品推荐

