|
|
@@ -354,8 +354,8 @@ def yolov12_predict(params: PredictParams):
|
|
|
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
|
|
|
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
|
|
|
|
|
- # 尝试不同的MP4编码器
|
|
|
- fourcc_options = ['mp4v', 'avc1', 'H264']
|
|
|
+ # 尝试不同的MP4编码器(按兼容性排序)
|
|
|
+ fourcc_options = ['avc1', 'H264', 'mp4v']
|
|
|
out = None
|
|
|
|
|
|
for fourcc in fourcc_options:
|
|
|
@@ -378,11 +378,59 @@ def yolov12_predict(params: PredictParams):
|
|
|
cap.release()
|
|
|
out.release()
|
|
|
|
|
|
+ # 使用ffmpeg进一步优化MP4文件(如果可用)
|
|
|
+ try:
|
|
|
+ import subprocess
|
|
|
+ temp_mp4 = output_mp4 + '.temp.mp4'
|
|
|
+ os.rename(output_mp4, temp_mp4)
|
|
|
+
|
|
|
+ # 使用ffmpeg重新编码为H.264格式
|
|
|
+ cmd = [
|
|
|
+ 'ffmpeg', '-i', temp_mp4,
|
|
|
+ '-c:v', 'libx264',
|
|
|
+ '-preset', 'fast',
|
|
|
+ '-crf', '23',
|
|
|
+ '-y', output_mp4
|
|
|
+ ]
|
|
|
+
|
|
|
+ result = subprocess.run(cmd, capture_output=True, text=True)
|
|
|
+ if result.returncode == 0:
|
|
|
+ os.remove(temp_mp4)
|
|
|
+ logging.info(f"使用ffmpeg优化MP4文件: {output_mp4}")
|
|
|
+ else:
|
|
|
+ # ffmpeg失败,恢复原文件
|
|
|
+ os.rename(temp_mp4, output_mp4)
|
|
|
+ logging.warning(f"ffmpeg优化失败,使用OpenCV生成的MP4: {output_mp4}")
|
|
|
+
|
|
|
+ except (FileNotFoundError, subprocess.SubprocessError) as e:
|
|
|
+ # ffmpeg不可用,使用OpenCV生成的MP4
|
|
|
+ logging.warning(f"ffmpeg不可用,使用OpenCV生成的MP4: {output_mp4}")
|
|
|
+
|
|
|
# 删除原文件
|
|
|
os.remove(video_file)
|
|
|
logging.info(f"视频已转换为MP4格式: {output_mp4}")
|
|
|
else:
|
|
|
- logging.warning(f"无法创建MP4编码器,保持原格式")
|
|
|
+ # OpenCV编码器失败,尝试使用ffmpeg直接转换
|
|
|
+ logging.warning(f"OpenCV编码器失败,尝试使用ffmpeg转换")
|
|
|
+ try:
|
|
|
+ import subprocess
|
|
|
+ cmd = [
|
|
|
+ 'ffmpeg', '-i', video_file,
|
|
|
+ '-c:v', 'libx264',
|
|
|
+ '-preset', 'fast',
|
|
|
+ '-crf', '23',
|
|
|
+ '-y', output_mp4
|
|
|
+ ]
|
|
|
+
|
|
|
+ result = subprocess.run(cmd, capture_output=True, text=True)
|
|
|
+ if result.returncode == 0:
|
|
|
+ os.remove(video_file)
|
|
|
+ logging.info(f"使用ffmpeg直接转换MP4文件: {output_mp4}")
|
|
|
+ else:
|
|
|
+ logging.error(f"ffmpeg转换失败: {result.stderr}")
|
|
|
+
|
|
|
+ except (FileNotFoundError, subprocess.SubprocessError) as e:
|
|
|
+ logging.error(f"ffmpeg不可用,保持原格式: {e}")
|
|
|
|
|
|
except Exception as e:
|
|
|
logging.error(f"转换视频格式时出错: {e}")
|