# Panda3D 视频播放功能集成指南 ## 概述 Panda3D 完全支持内嵌视频播放功能,通过 `MovieTexture` 类可以实现: - ✅ **视频文件播放** - 支持 MP4, AVI, MOV, MKV, WebM 等格式 - ✅ **3D场景中的视频纹理** - 将视频作为材质应用到3D模型 - ✅ **视频控制** - 播放、暂停、停止、调速、循环等 - ✅ **程序化动画** - 创建动态纹理效果 - ✅ **全景视频** - 360度球形视频播放 - ✅ **广告牌视频** - 始终面向相机的视频面板 ## 核心组件 ### 1. MovieTexture 类 ```python from panda3d.core import MovieTexture # 创建视频纹理 movie_texture = MovieTexture("video_name") success = movie_texture.read("path/to/video.mp4") if success: # 播放控制 movie_texture.play() # 播放 movie_texture.stop() # 停止 movie_texture.setTime(0) # 设置播放位置 movie_texture.setPlayRate(1.5) # 设置播放速度 movie_texture.setLoop(True) # 设置循环播放 # 获取信息 length = movie_texture.getVideoLength() current_time = movie_texture.getTime() is_playing = movie_texture.isPlaying() ``` ### 2. 视频管理器 (VideoManager) ```python from video_integration import VideoManager # 在 MyWorld 类中初始化 self.video_manager = VideoManager(self) # 创建视频屏幕 screen = self.video_manager.create_video_screen( pos=(0, 0, 2), size=(4, 3), video_path="video.mp4", name="main_screen" ) # 创建广告牌 billboard = self.video_manager.create_video_billboard( pos=(2, 0, 1), size=(2, 1.5), name="info_billboard" ) # 创建全景视频 spherical = self.video_manager.create_spherical_video( pos=(0, 0, 0), radius=10, video_path="360_video.mp4", name="vr_environment" ) ``` ## 错误修复说明 ### 1. 任务管理器参数传递错误 **问题**: `TypeError: missing 1 required positional argument: 'task'` **原因**: 使用 `extraArgs` 时参数顺序错误 **修复方案**: ```python # ❌ 错误的方式 self.taskMgr.add(self.update_texture, "task_name", extraArgs=[texture, data]) def update_texture(self, texture, data, task): # task 参数位置错误 pass # ✅ 正确的方式 self.taskMgr.add(lambda task: self.update_texture(task, texture, data), "task_name") def update_texture(self, task, texture, data): # task 参数在前 return task.cont ``` ### 2. 模型依赖问题 **问题**: `Couldn't load file models/sphere.egg` **解决方案**: 程序化生成几何体 ```python def create_sphere_geometry(self, radius=1): """程序化创建球体几何""" sphere_root = self.render.attachNewNode("sphere") faces = [ (Vec3(0, radius, 0), Vec3(0, 0, 0)), # 前面 (Vec3(0, -radius, 0), Vec3(0, 180, 0)), # 后面 (Vec3(radius, 0, 0), Vec3(0, 90, 0)), # 右面 (Vec3(-radius, 0, 0), Vec3(0, -90, 0)), # 左面 (Vec3(0, 0, radius), Vec3(-90, 0, 0)), # 上面 (Vec3(0, 0, -radius), Vec3(90, 0, 0)), # 下面 ] cm = CardMaker("sphere_face") cm.setFrame(-radius, radius, -radius, radius) for pos, hpr in faces: face = sphere_root.attachNewNode(cm.generate()) face.setPos(pos) face.setHpr(hpr) return sphere_root ``` ## 快速开始 ### 1. 基础视频播放 ```python from direct.showbase.ShowBase import ShowBase from panda3d.core import MovieTexture, CardMaker class VideoApp(ShowBase): def __init__(self): ShowBase.__init__(self) # 创建视频纹理 movie_texture = MovieTexture("video") success = movie_texture.read("your_video.mp4") if success: # 创建显示面板 cm = CardMaker("video_card") cm.setFrame(-2, 2, -1.5, 1.5) video_card = self.render.attachNewNode(cm.generate()) video_card.setTexture(movie_texture) # 播放视频 movie_texture.play() # 设置相机 self.cam.setPos(0, -5, 0) app = VideoApp() app.run() ``` ### 2. 集成到现有编辑器 ```python # 在 MyWorld 类的 __init__ 方法中添加 from video_integration import VideoManager self.video_manager = VideoManager(self) # 在文件拖放处理中添加视频支持 def dropEvent(self, event): if event.mimeData().hasUrls(): for url in event.mimeData().urls(): filepath = url.toLocalFile() # 检查视频文件 if self.world.video_manager.is_video_file(filepath): self.world.video_manager.create_video_screen( pos=(0, 0, 2), video_path=filepath, name=f"video_{len(self.world.video_manager.video_objects)}" ) # 检查模型文件 elif filepath.lower().endswith(('.egg', '.bam', '.obj', '.fbx')): self.world.importModel(filepath) ``` ### 3. 视频控制示例 ```python # 播放控制 video_manager.play_video("video_name") video_manager.pause_video("video_name") video_manager.stop_video("video_name") # 速度控制 video_manager.set_video_speed("video_name", 1.5) # 1.5倍速 # 获取信息 info = video_manager.get_video_info("video_name") print(f"视频长度: {info['length']}秒") print(f"当前时间: {info['current_time']}秒") print(f"播放状态: {info['is_playing']}") # 列出所有视频 videos = video_manager.list_videos() for video in videos: print(f"视频: {video['name']}, 类型: {video['type']}, 播放中: {video['is_playing']}") ``` ## 支持的视频格式 - **MP4** - 推荐格式,兼容性最好 - **AVI** - 传统格式,支持良好 - **MOV** - QuickTime 格式 - **MKV** - 开源容器格式 - **WebM** - 网络优化格式 ## 性能优化建议 1. **视频分辨率**: 建议使用 1080p 或更低分辨率 2. **编码格式**: 优先使用 H.264 编码 3. **文件大小**: 控制在合理范围内避免内存问题 4. **多视频播放**: 同时播放多个视频时注意性能监控 5. **纹理尺寸**: 程序化纹理建议使用 2 的幂次方尺寸 ## 常见问题解决 ### Q: 视频不播放怎么办? A: 检查文件路径是否正确,文件格式是否支持,系统是否安装了相应的解码器。 ### Q: 动画纹理不更新? A: 确认任务管理器正常运行,检查 `task.cont` 返回值。 ### Q: 全景视频显示异常? A: 检查球体几何体的法线方向,确保使用 `setTwoSided(True)`。 ### Q: 内存占用过高? A: 减小纹理分辨率,限制同时播放的视频数量,及时移除不需要的视频对象。 ## 测试文件 项目包含以下测试文件: - `video_player_example.py` - 完整的视频播放器演示 - `video_integration.py` - 视频管理器模块 - `test_video_fix.py` - 功能测试验证 运行测试: ```bash python test_video_fix.py python video_player_example.py ``` ## 总结 Panda3D 的视频播放功能非常强大,支持多种使用场景。通过本指南提供的 VideoManager 类,可以轻松集成到现有项目中,实现丰富的多媒体体验。 主要优势: - 🔥 **易于集成** - 几行代码即可添加视频功能 - 🎯 **功能丰富** - 支持多种视频显示模式 - 🚀 **性能优秀** - 基于 Panda3D 的高效渲染 - 🛠️ **高度可定制** - 支持程序化动画和特效 - 💡 **实时控制** - 完整的播放控制接口