MoviePy读取视频时长失败报错:OSError问题求助
问题
我正在开发一个项目,需要提取视频中的音频,再将音频转录为文本保存至TXT文件。此前运行正常的Python代码今日出现错误,代码如下:
from numpy import clip import speech_recognition as sr import moviepy.editor as mp from moviepy.editor import * #lectura de video clip = mp.VideoFileClip("/Users/leti/OneDrive - Universidad Europea de Madrid/Proyecto Computacion I/Videos sin procesar/Sergio Procesados/Arroz_meloso_carabineros.mp4").subclip(0,150) #extraemos el audio clip.audio.write_audiofile("/Users/leti/OneDrive - Universidad Europea de Madrid/Proyecto Computacion I/Videos sin procesar/Sergio Procesados/Arroz_meloso_carabineros.wav") #iniciamos el speechrecognition r = sr.Recognizer() #leemos el archivo audio extraido audio = sr.AudioFile("/Users/leti/OneDrive - Universidad Europea de Madrid/Proyecto Computacion I/Videos sin procesar/Sergio Procesados/Arroz_meloso_carabineros.wav") print("audio extraido") #lectura de audio with audio as source: r.adjust_for_ambient_noise(source) clean_file = r.record(source) print("lectura terminada") #reconocemos la voz del audio result = r.recognize_google(clean_file,language="es-ES") print("") print(result) #escribimos el texto en un nuevo archivo txt with open('/Users/leti/OneDrive - Universidad Europea de Madrid/Proyecto Computacion I/Videos sin procesar/Sergio Procesados/Trans/Arroz_meloso_carabineros.txt','w') as file: file.write("RECOGNIZED SPEECH: \n") file.write(result) #file.write(" "+result) print("\nEscritura terminada")
报错信息:
OSError: MoviePy error: failed to read the duration of file /Users/leti/OneDrive - Universidad Europea de Madrid/Proyecto Computacion I/Videos sin procesar/Sergio Procesados/Arroz_meloso_carabineros.mp4. Here are the file infos returned by ffmpeg: ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers built with gcc 9.2.1 (GCC) 20200122 configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt libavutil 56. 31.100 / 56. 31.100 libavcodec 58. 54.100 / 58. 54.100 libavformat 58. 29.100 / 58. 29.100 libavdevice 58. 8.100 / 58. 8.100 libavfilter 7. 57.100 / 7. 57.100 libswscale 5. 5.100 / 5. 5.100 libswresample 3. 5.100 / 3. 5.100 libpostproc 55. 5.100 / 55. 5.100 /Users/leti/OneDrive - Universidad Europea de Madrid/Proyecto Computacion I/Videos sin procesar/Sergio Procesados/Arroz_meloso_carabineros.mp4: Invalid argument
解决方案
1. 检查文件路径与权限
- 确认OneDrive同步状态:文件可能因同步未完成导致损坏或无法访问,等待同步结束后重试,或把视频复制到本地非OneDrive目录测试。
- 简化文件路径:路径中的空格和复杂层级可能引发解析问题,将视频移至简单路径(如
/Users/leti/test.mp4),修改代码路径后重新运行。 - 修复文件权限:在终端执行
chmod +r "/Users/leti/OneDrive - Universidad Europea de Madrid/Proyecto Computacion I/Videos sin procesar/Sergio Procesados/Arroz_meloso_carabineros.mp4",确保当前用户有读取权限。
2. 验证视频文件完整性
- 手动播放视频:用播放器打开视频,确认文件未损坏、能正常播放,若损坏则重新获取完整文件。
- 用ffmpeg检测文件:在终端执行
ffmpeg -i "/Users/leti/OneDrive - Universidad Europea de Madrid/Proyecto Computacion I/Videos sin procesar/Sergio Procesados/Arroz_meloso_carabineros.mp4",若输出错误,执行ffmpeg -i input.mp4 -c copy output_fixed.mp4重新封装修复视频。
3. 调整代码与依赖版本
- 分离链式调用:把
VideoFileClip和subclip拆分为两步,避免潜在异常:
clip = mp.VideoFileClip("/Users/leti/OneDrive - Universidad Europea de Madrid/Proyecto Computacion I/Videos sin procesar/Sergio Procesados/Arroz_meloso_carabineros.mp4") clip = clip.subclip(0, 150)
- 更新依赖:执行
pip install --upgrade moviepy升级MoviePy,同时将ffmpeg更新至最新稳定版(Mac可通过brew install ffmpeg安装,其他系统用对应包管理器)。
4. 替代方案:直接用ffmpeg提取音频
如果MoviePy仍有问题,跳过它用ffmpeg命令行提取音频:
ffmpeg -i "/Users/leti/OneDrive - Universidad Europea de Madrid/Proyecto Computacion I/Videos sin procesar/Sergio Procesados/Arroz_meloso_carabineros.mp4" -ss 0 -t 150 -acodec pcm_s16le -ar 16000 "/Users/leti/OneDrive - Universidad Europea de Madrid/Proyecto Computacion I/Videos sin procesar/Sergio Procesados/Arroz_meloso_carabineros.wav"
之后保留代码中SpeechRecognition部分的逻辑即可。
内容的提问来源于stack exchange,提问作者Letie18
相关产品推荐
相关产品推荐

