Python OSError:MoviePy错误:找不到文件吉他.mp4

Python OSError:MoviePy错误:找不到文件吉他.mp4,python,reactjs,flask,ffmpeg,moviepy,Python,Reactjs,Flask,Ffmpeg,Moviepy,我正在使用react和flask/python开发一个视频到音频转换器。 我收到了一封500美元的邮件,其中有以下错误: raise IOError(("MoviePy error: the file %s could not be found!\n" OSError: MoviePy error: the file guitar.mp4 could not be found! Please check that you entered the correct path.

我正在使用react和flask/python开发一个视频到音频转换器。 我收到了一封500美元的邮件,其中有以下错误:

raise IOError(("MoviePy error: the file %s could not be found!\n"
OSError: MoviePy error: the file guitar.mp4 could not be found!
Please check that you entered the correct path.
编辑:如评论中所述,moviepy VideoFileClip正在寻找路径。根据建议,我现在正试图将传入的视频文件写入应用程序后端的临时目录。更新后的堆栈跟踪显示文件路径打印,但是当显示给VideoFileClip时,仍然不满意

以下代码段是视频文件上载的onSubmit:

const onSubmit = async (e) => {
    e.preventDefault()
    const data = new FormData()
    console.log('hopefully the mp4', videoData)
    data.append('mp3', videoData)
    console.log('hopefully a form object with mp4', data)
    const response = await fetch('/api/convert', {
      method: "POST",
      body: data
    })
    if (response.ok) {
      const converted = await response.json()
      setMp3(converted)
      console.log(mp3)
    } else {
      window.alert("something went wrong :(");
    }
  }
init.py内部

app = Flask(__name__)

app.config.from_object(Config)
app.register_blueprint(convert, url_prefix='/api/convert')

CORS(app)

从converter.py内部

import os
from flask import Blueprint, jsonify, request
import imageio
from moviepy.editor import *


convert = Blueprint('convert', __name__)

@convert.route('', methods=['POST'])
def convert_mp4():
  if request.files['mp3'].filename:
    os.getcwd()
    filename = request.files['mp3'].filename
    print('hey its a file again', filename)
    safe_filename = secure_filename(filename)
    video_file = os.path.join("/temp/", safe_filename)
    print('hey its the file path', video_file)
    video_clip = VideoFileClip(video_file)
    print('hey its the VideoFileClip', video_clip)
    audio_clip = video_clip.audio
    audio_clip.write_audiofile(os.path.join("/temp/", f"{safe_filename}-converted.mp3"))

    video_clip.close()
    audio_clip.close()

    return jsonify(send_from_directory(os.path.join("/temp/", f"{safe_filename}-converted.mp3")))
  else:
    return {'error': 'something went wrong :('}


在下面的堆栈跟踪中,您可以看到文件打印视频的名称,我唯一的另一个想法是为什么这可能不起作用,因为它在post请求中丢失了,但是它在我的
if file:
检查后打印的事实让我非常困惑

hey its a file again guitar.mp4
hey its the file path /temp/guitar.mp4
127.0.0.1 - - [22/Apr/2021 12:12:15] "POST /api/convert HTTP/1.1" 500 -
Traceback (most recent call last):
  File "/home/jasondunn/projects/audioconverter/.venv/lib/python3.8/site-packages/flask/app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/jasondunn/projects/audioconverter/.venv/lib/python3.8/site-packages/flask/app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "/home/jasondunn/projects/audioconverter/.venv/lib/python3.8/site-packages/flask_cors/extension.py", line 161, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "/home/jasondunn/projects/audioconverter/.venv/lib/python3.8/site-packages/flask/app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/jasondunn/projects/audioconverter/.venv/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/home/jasondunn/projects/audioconverter/.venv/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/jasondunn/projects/audioconverter/.venv/lib/python3.8/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/jasondunn/projects/audioconverter/.venv/lib/python3.8/site-packages/flask_cors/extension.py", line 161, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "/home/jasondunn/projects/audioconverter/.venv/lib/python3.8/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/jasondunn/projects/audioconverter/.venv/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/home/jasondunn/projects/audioconverter/.venv/lib/python3.8/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/jasondunn/projects/audioconverter/.venv/lib/python3.8/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/jasondunn/projects/audioconverter/back/api/converter.py", line 20, in convert_mp4
    video_clip = VideoFileClip(video_file)
  File "/home/jasondunn/projects/audioconverter/.venv/lib/python3.8/site-packages/moviepy/video/io/VideoFileClip.py", line 88, in __init__
    self.reader = FFMPEG_VideoReader(filename, pix_fmt=pix_fmt,
  File "/home/jasondunn/projects/audioconverter/.venv/lib/python3.8/site-packages/moviepy/video/io/ffmpeg_reader.py", line 35, in __init__
    infos = ffmpeg_parse_infos(filename, print_infos, check_duration,
  File "/home/jasondunn/projects/audioconverter/.venv/lib/python3.8/site-packages/moviepy/video/io/ffmpeg_reader.py", line 270, in ffmpeg_parse_infos
    raise IOError(("MoviePy error: the file %s could not be found!\n"
OSError: MoviePy error: the file /temp/guitar.mp4 could not be found!
Please check that you entered the correct path.

提前感谢您的关注/未来建议。关于堆栈溢出的第一篇官方帖子:)

我认为问题在于如何使用
file=request.files['mp3'].filename

分配给
文件
的值不是指向上载文件的指针。它只是文件名,一个字符串。Just
request.files['mp3']
werkzeug.datastructures.FileStorage
类的一个实例

将该字符串传递给的库将其解释为它们应该打开的文件的路径

由于您没有将文件保存在任何位置,因此他们的库找不到任何内容

我不熟悉您正在使用的库,但它们可能有一种方法可以直接将内存中的文件数据发送给它们,而无需保存文件,然后让它们再次打开


如果没有,则可能需要将文件保存到某个临时位置,然后打开库并读取该文件。

看起来python找不到吉他.mp4:(

看来您需要在处理之前将文件内容保存在磁盘上。查看for
MoviePy
需要将文件名或绝对路径传递到
VideoFileClip
构造函数中,此对象将在磁盘上打开文件并在实例化后处理

在请求中保存文件应该足够简单。下面的代码应该能够处理这个问题

file.save(os.path.join(“/path/to/some/dir”,文件名))

现在,您可以为该文件提供适当的URI

video\u clip=VideoFileClip(os.path.join(“/path/to/some/dir”,文件名))

这就是我将为
convert\u mp4
编写的内容,尽管它没有经过测试

@convert.route('', methods=["POST"])
def convert_mp4():
    if request.files.get("mp3"):

        # clean the filename
        safe_filename = secure_filename(request.files["mp3"].filename)

        # save file to some directory on disk
        request.files["mp3"].save(os.path.join("/path/to/some/dir", safe_filename))
        video_clip = VideoFileClip(os.path.join("/path/to/some/dir", safe_filename))
        audio_clip = video_clip.audio  # convert to audio

        # you may need to change the name or save to a different directory
        audio_clip.write_audiofile(os.path.join("/path/to/some/dir", f"{safe_filename}.mp3"))

        # close resources, maybe use a context manager for better readability
        video_clip.close()
        audio_clip.close()

        # responds with data from a specific file
        send_from_directory("/path/to/some/dir", f"{safe_filename}.mp3")
    else:
      return jsonify(error="File 'mp3' does not exist!")
无论何时通过flask将数据保存到磁盘,都应使用werkzeug项目内置到flask中的
secure_filename
。此功能将清除输入名称,以便攻击者无法创建恶意文件名

我建议更进一步,可能创建两个端点。一个用于提交数据以进行处理,另一个用于检索数据。这可以使您的请求保持快速,同时允许flask处理其他请求(不过您需要一些后台进程来处理转换)

更新日期:2021年4月30日 我知道我们解决了这个问题,但我想记录解决方案

您的MP4数据没有使用
save
方法保存到磁盘(请参阅)。您可以检查实现此操作的上述代码

完成后,我们现在知道这些数据的位置,并可以使用已知的文件路径实例化
VideoFileClip
对象,这将允许进行转换,然后您需要将转换后的MP3文件保存在文件系统中的某个位置


MP3保存到磁盘后,您可以使用flask
send\u from\u directory
功能将数据发送回您的响应中。此响应不能包含JSON内容,因为内容类型已根据MP3文件内容设置为
audio/mpeg

祝贺您的第一篇帖子!我觉得很好,希望您能找到一些答案:)@dunnjm814如果这里的答案之一解决了您的问题,您可以给其中一个检查;)MoviePy没有从内存加载文件的简单方法,除非您可以将视频转换为一个对象,该对象返回表示连续电影帧的numpy数组。OP需要在将文件加载到MoviePy之前将其下载到磁盘上。今天上午进行了一些编辑。我已经在我的项目的后端文件夹中创建了一个临时文件夹,并试图在调用VideoFileClip之前将文件写入并保存到该临时文件夹中,但它仍然是空的。我将用更新的代码和堆栈跟踪编辑原始帖子