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

Windows 8.1下Jupyter Notebook调整视频分辨率并保留原音频的解决方案

高效解决Windows 8.1下Jupyter Notebook中视频转码(保FPS+音频)问题

看来你在视频转码这事儿上踩了好几个坑啊——OpenCV丢音频、FPS被改还爆体积,skvideo找不到FFmpeg,连直接调用FFmpeg都出问题。别慌,咱们一步步来解决,最靠谱的方案还是直接用FFmpeg,毕竟它是视频处理的专业工具,能完美满足你的所有要求。

先说说你之前踩坑的原因

  • OpenCV的问题:OpenCV本质是处理计算机视觉帧的库,对音频完全不支持,而且默认输出视频用的是无压缩编码,体积自然暴增;另外它在设置FPS时容易自动取整,把29.97变成29,这就是你得到那奇怪结果的原因。
  • skvideo的问题:它依赖FFmpeg,但默认只会找系统PATH里的FFmpeg,如果你的FFmpeg没加进PATH,或者路径没指定对,就会触发断言错误。
  • FFmpeg命令/subprocess的问题:应该是参数写错了,或者Windows下路径处理不当(比如带空格的路径没加引号),导致命令执行失败没生成视频。

最稳定高效的解决方案:用subprocess正确调用FFmpeg

第一步:先确保FFmpeg能正常调用

  1. 下载Windows版本的FFmpeg压缩包,解压到一个无空格的路径,比如C:\ffmpeg。
  2. 把C:\ffmpeg\bin添加到系统环境变量PATH中(右键此电脑→属性→高级系统设置→环境变量→系统变量里的PATH→编辑→新建,粘贴路径即可)。
  3. 在Jupyter Notebook里运行!ffmpeg -version,如果能输出版本信息,说明配置成功;如果不行,就用FFmpeg的绝对路径(比如C:\\ffmpeg\\bin\\ffmpeg.exe)来调用。

第二步:用subprocess执行正确的转码命令

FFmpeg的参数要精准配置,才能满足你的需求:保持29.97FPS、854x480分辨率、保留原音频、控制体积。直接用下面的代码:

import subprocess

# 配置路径:如果FFmpeg在PATH里就写'ffmpeg',否则写绝对路径
ffmpeg_exec = 'ffmpeg'  # 示例绝对路径:'C:\\ffmpeg\\bin\\ffmpeg.exe'
input_video = 'test.mp4'
output_video = 'output.mp4'

# 构造FFmpeg命令参数(列表形式避免空格问题)
transcode_cmd = [
    ffmpeg_exec,
    '-i', input_video,          # 指定输入文件
    '-s', '854x480',            # 设置输出分辨率
    '-r', '29.97',              # 强制锁定FPS为原数值,防止取整
    '-c:v', 'libx264',          # 用H.264编码(压缩效率高,和原视频编码大概率一致)
    '-crf', '23',               # 质量控制:23是默认值,数值越小质量越高、体积越大,可在20-25之间调整
    '-c:a', 'copy',             # 直接复制原音频流,不重新编码,保证音频完整且高效
    '-y',                       # 若输出文件已存在则覆盖,可选参数
    output_video
]

# 执行命令并捕获输出
run_result = subprocess.run(transcode_cmd, capture_output=True, text=True)

# 检查转码结果
if run_result.returncode == 0:
    print("转码完成!输出文件:", output_video)
else:
    print("转码失败,错误信息:")
    print(run_result.stderr)

补充:如果想尝试skvideo的解决办法

要是你还是想用skvideo,得先指定FFmpeg的路径,代码如下:

import skvideo.io

# 先设置FFmpeg的路径
skvideo.setFFmpegPath('C:\\ffmpeg\\bin')

# 配置输出参数
output_settings = {
    '-s': '854x480',
    '-r': '29.97',
    '-c:v': 'libx264',
    '-crf': '23',
    '-c:a': 'copy'
}

# 读取输入视频并写入输出
video_frames = skvideo.io.vread(input_video)
skvideo.io.vwrite(output_video, video_frames, outputdict=output_settings)

不过还是更推荐subprocess调用FFmpeg的方法,因为skvideo在处理音频时偶尔会有兼容性问题,直接调用FFmpeg更稳定可控。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:17:37