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能正常调用
- 下载Windows版本的FFmpeg压缩包,解压到一个无空格的路径,比如
C:\ffmpeg。 - 把
C:\ffmpeg\bin添加到系统环境变量PATH中(右键此电脑→属性→高级系统设置→环境变量→系统变量里的PATH→编辑→新建,粘贴路径即可)。 - 在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
相关产品推荐
相关产品推荐

