AVCap视频处理成帧和音频脚本

复制代码
###############处理原视频,使其格式和原数据一样
import os
import cv2
import subprocess
import json
from PIL import Image
from pydub import AudioSegment

import sys
import shutil
# === 🔹 第一步:强制检测并设置FFmpeg路径 🔹 ===
def get_ffmpeg_path():
    """确保FFmpeg和FFprobe可用"""
    ffmpeg_path = shutil.which("ffmpeg")
    ffprobe_path = shutil.which("ffprobe")

    if not ffprobe_path or not ffmpeg_path:
        print("❌ 致命错误: FFmpeg未正确安装")
        print("请按照以下步骤操作:")
        print("1. 访问 https://github.com/BtbN/FFmpeg-Builds/releases")
        print("2. 下载 'ffmpeg-master-latest-win64-gpl.zip'")
        print("3. 解压到 C:\\ffmpeg")
        print("4. 将 C:\\ffmpeg\\bin 添加到系统PATH变量")
        print("5. 重启命令行终端")
        sys.exit(1)

    # 配置pydub使用正确的路径
    AudioSegment.converter = ffmpeg_path
    return ffmpeg_path, ffprobe_path


ffmpeg_path, ffprobe_path = get_ffmpeg_path()
print(f"✅ FFmpeg路径: {ffmpeg_path}")
print(f"✅ FFprobe路径: {ffprobe_path}")

# === 🔹【设置文件路径】🔹 ===
original_audio_path = "waveforms/7fmOlUlwoNg_20000_30000.wav"  # 原始数据集音频
original_image_path = "frames/frame_0/7fmOlUlwoNg_20000_30000.jpg"  # 原始数据集帧

input_video = "lai.mp4"   # 你要处理的视频
output_audio = "waveforms/lai_audio.wav"
frames_dir = "frames"

os.makedirs("waveforms", exist_ok=True)
os.makedirs("frames", exist_ok=True)

# === 🔹【获取原始数据集格式】🔹 ===
def get_audio_info(audio_path):
    """ 获取音频的格式信息 """
    cmd = [
        "ffprobe", "-i", audio_path, "-show_streams", "-select_streams", "a",
        "-of", "json"
    ]
    result = subprocess.run(cmd, capture_output=True, text=True)
    audio_info = json.loads(result.stdout)["streams"][0]
    
    return {
        "sample_rate": int(audio_info["sample_rate"]),  # 采样率
        "channels": int(audio_info["channels"]),  # 声道数
        "bit_rate": int(audio_info["bit_rate"]),  # 比特率
        "duration": float(audio_info["duration"])  # 时长
    }

def get_image_info(image_path):
    """ 获取图片的格式信息 """
    img = Image.open(image_path)
    return {
        "size": img.size,  # (width, height)
        "mode": img.mode  # "RGB" / "L" (灰度) / "CMYK" 等
    }

# 获取 **原始数据集** 的格式信息
original_audio_info = get_audio_info(original_audio_path)
original_image_info = get_image_info(original_image_path)

print("🎯 原始音频信息:", original_audio_info)
print("🎯 原始图像信息:", original_image_info)

# === 🔹【处理音频】🔹 ===
def process_audio(input_audio, output_audio, ref_info):
    """ 将音频转换为和原始数据集匹配的格式 """
    audio = AudioSegment.from_file(input_audio)
    
    # 转换采样率
    if audio.frame_rate != ref_info["sample_rate"]:
        audio = audio.set_frame_rate(ref_info["sample_rate"])

    # 转换声道
    if audio.channels != ref_info["channels"]:
        audio = audio.set_channels(ref_info["channels"])

    # 转换比特率(pydub 不支持直接修改比特率,但可以调整导出参数)
    audio.export(output_audio, format="wav", bitrate=str(ref_info["bit_rate"]) + "k")
    print(f"✅ 音频已转换并保存至 {output_audio}")

process_audio(input_video, output_audio, original_audio_info)

# === 🔹【处理视频帧】🔹 ===
def extract_frames(video_path, output_dir, ref_info, frame_count=20):
    """ 从视频中提取均匀分布的 20 帧,并匹配原始格式 """
    cap = cv2.VideoCapture(video_path)
    total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    frame_interval = max(total_frames // frame_count, 1)

    for i in range(frame_count):
        cap.set(cv2.CAP_PROP_POS_FRAMES, i * frame_interval)
        success, frame = cap.read()

        if success:
            # 统一尺寸
            frame = cv2.resize(frame, ref_info["size"])
            
            # 统一色彩模式
            if ref_info["mode"] == "L":  # 如果是灰度
                frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            else:  # 默认 RGB
                frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            
            # 逐帧存入 frame_0 到 frame_19
            frame_folder = os.path.join(output_dir, f"frame_{i}")
            os.makedirs(frame_folder, exist_ok=True)
            frame_path = os.path.join(frame_folder, "lai_frame.jpg")

            cv2.imwrite(frame_path, frame)
    
    cap.release()
    print(f"✅ 视频帧已提取并存入 {output_dir}")

extract_frames(input_video, frames_dir, original_image_info)

print("🎉 处理完成!所有格式已匹配 ✅")

直接执行脚本会报错,解决办法

安装 FFmpeg(如果未安装)

步骤一:手动下载 FFmpeg

  1. 访问 FFmpeg 官方构建版本页面:

    https://github.com/BtbN/FFmpeg-Builds/releases

  2. 下载最新版本:

    • 点击 ffmpeg-master-latest-win64-gpl.zip
    • 如果该版本不可用,选择类似名称的文件

步骤二:解压安装

  1. 创建目录:

    • 打开文件资源管理器
    • 导航到 C:\
    • 右键新建文件夹,命名为 ffmpeg
  2. 解压文件:

    • 将下载的 ZIP 文件解压到 C:\ffmpeg 目录中
    • 结构应为 C:\ffmpeg\bin\ffmpeg.exe

🔧 解决方案二:设置环境变量(最重要的一步)

添加 FFmpeg 到系统 PATH

  1. 打开系统属性:

    • Win + R 输入 sysdm.cpl 回车
    • 或在文件资源管理器右键点击"此电脑">属性>高级系统设置
  2. 打开环境变量:

    • 点击"环境变量"按钮
    • 在"系统变量"区域,找到并选择"Path"
    • 点击"编辑"
  3. 添加 FFmpeg 路径:

    • 点击"新建"
    • 输入 C:\ffmpeg\bin
    • 确保路径中"bin"是小写字母(Windows 路径不区分大小写)
  4. 保存更改:

    • 点击所有"确定"按钮保存设置
    • 关闭所有窗口

验证设置:

  1. 打开新的命令提示符:

    • Win + R 输入 cmd 回车
    • 重要:必须是新打开的命令窗口,环境变量变更后生效
  2. 运行测试命令:

    cmd

    复制代码
    ffmpeg -version
相关推荐
知舟不叙1 小时前
基于OpenCV实现视频运动目标检测与跟踪
opencv·目标检测·目标跟踪·音视频
sukalot4 小时前
window 显示驱动开发-处理视频帧
驱动开发·音视频
Sherlock Ma5 小时前
Seedance:字节发布视频生成基础模型新SOTA,能力全面提升
人工智能·深度学习·计算机视觉·aigc·音视频·扩散模型·视频生成
Everbrilliant898 小时前
音视频之H.264/AVC编码器原理
音视频·h.264·h.264编解码·h.264帧内预测·h.264帧间预测·h.264的sp/si帧技术·h.264码率控制
s_little_monster8 小时前
【Linux开发】海思摄像头内部视频处理模块
linux·运维·经验分享·学习·音视频·嵌入式开发·海思
vfvfb17 小时前
视频音频去掉开头结尾 视频去掉前n秒后n秒 电视剧去掉开头歌曲
音视频·批量去掉视频开头·批量去掉崇·去掉mp3开头几秒·批量去掉视频结尾歌曲
Coovally AI模型快速验证18 小时前
SLAM3R:基于单目视频的实时密集3D场景重建
神经网络·算法·3d·目标跟踪·音视频
no_work21 小时前
深度学习小项目合集之音频语音识别-视频介绍下自取
pytorch·深度学习·cnn·音视频·语音识别·梅卡尔
学习噢学个屁1 天前
基于STM32音频频谱分析设计
c语言·stm32·单片机·嵌入式硬件·音视频