VideoFileClip IndexError: list index out of range, OSError: MoviePy error: failed to read the duration of file
MedoOnlyOne opened this issue · comments
We are recording videos from the browser with the following encoding
'video/webm; codecs="vp8, opus"', then we upload these videos to an AWS S3 bucket.
Our ML model works on these videos, and one of the models needs to extarct the audio and process it.
Here is a code snapit for extracting the audio
import speech_recognition as sr
import moviepy.editor as me
from denoise2 import denoise
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import math
model_name = 'bert-base-nli-mean-tokens'
model = SentenceTransformer(model_name)
class recomm:
y = 0.0
def __init__(self, path, keywords):
video_clip = me.VideoFileClip(r"{}".format(path))
path2 = "y2.wav"
video_clip.audio.write_audiofile(r"{}".format(path2), nbytes=2)
recognizer = sr.Recognizer()
"""a = AudioSegment.from_wav(path2)
a = a + 5
a.export(path2, "wav")"""
audio_clip = sr.AudioFile("{}".format(path2))
with audio_clip as source:
audio_file = recognizer.record(source)
sent = []
result = ""
try:
result = recognizer.recognize_google(audio_file)
except sr.UnknownValueError:
print("Can not process audio ")
if not result:
self.y = 0
else:
print(result)
sent.append(result)
sent = sent + keywords
sent_vec3 = model.encode(sent)
x = cosine_similarity(
[sent_vec3[0]],
sent_vec3[1:]
)
for i in range(len(x)):
self.y = self.y + x[0][i]
self.y = (self.y / (len(sent) - 1)) * 1000.0
def res(self):
if self.y < 0:
self.y = 0
return self.y
And that's the traceback,
the error occurred at this line
video_clip = me.VideoFileClip(r"{}".format(path))
Traceback (most recent call last):
File "/home/medo/Dev/Smart-remotely-interviewing-system/backend/Process-interview/test/lib/python3.8/site-packages/moviepy/video/io/ffmpeg_reader.py", line 286, in ffmpeg_parse_infos
match = re.findall("([0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9])", line)[0]
IndexError: list index out of range
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "main.py", line 90, in <module>
main()
File "main.py", line 85, in main
interviews_channel.start_consuming()
File "/home/medo/Dev/Smart-remotely-interviewing-system/backend/Process-interview/test/lib/python3.8/site-packages/pika/adapters/blocking_connection.py", line 1865, in start_consuming
self._process_data_events(time_limit=None)
File "/home/medo/Dev/Smart-remotely-interviewing-system/backend/Process-interview/test/lib/python3.8/site-packages/pika/adapters/blocking_connection.py", line 2026, in _process_data_events
self.connection.process_data_events(time_limit=time_limit)
File "/home/medo/Dev/Smart-remotely-interviewing-system/backend/Process-interview/test/lib/python3.8/site-packages/pika/adapters/blocking_connection.py", line 833, in process_data_events
self._dispatch_channel_events()
File "/home/medo/Dev/Smart-remotely-interviewing-system/backend/Process-interview/test/lib/python3.8/site-packages/pika/adapters/blocking_connection.py", line 567, in _dispatch_channel_events
impl_channel._get_cookie()._dispatch_events()
File "/home/medo/Dev/Smart-remotely-interviewing-system/backend/Process-interview/test/lib/python3.8/site-packages/pika/adapters/blocking_connection.py", line 1492, in _dispatch_events
consumer_info.on_message_callback(self, evt.method,
File "main.py", line 79, in callback
processing(json.loads(body))
File "main.py", line 34, in processing
r = recomm(path, keywords)
File "/home/medo/Dev/Smart-remotely-interviewing-system/backend/Process-interview/recommendation.py", line 17, in _init_
video_clip = me.VideoFileClip(r"{}".format(path))
File "/home/medo/Dev/Smart-remotely-interviewing-system/backend/Process-interview/test/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/medo/Dev/Smart-remotely-interviewing-system/backend/Process-interview/test/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/medo/Dev/Smart-remotely-interviewing-system/backend/Process-interview/test/lib/python3.8/site-packages/moviepy/video/io/ffmpeg_reader.py", line 289, in ffmpeg_parse_infos
raise IOError(("MoviePy error: failed to read the duration of file %s.\n"
OSError: MoviePy error: failed to read the duration of file 74b74292-3642-486a-8319-255bb7e7da5a-1647363285285.webm.
Here are the file infos returned by ffmpeg:
ffmpeg version 4.2.2-static https://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 8 (Debian 8.3.0-6)
configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-libgme --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libvmaf --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libdav1d --enable-libxvid --enable-libzvbi --enable-libzimg
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
Input #0, matroska,webm, from '74b74292-3642-486a-8319-255bb7e7da5a-1647363285285.webm':
Metadata:
encoder : Chrome
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0:0(eng): Audio: opus, 48000 Hz, mono, fltp (default)
Stream #0:1(eng): Video: vp8, yuv420p(progressive), 640x480, SAR 1:1 DAR 4:3, 29.42 fps, 29.42 tbr, 1k tbn, 1k tbc (default)
Metadata:
alpha_mode : 1
At least one output file must be specified
Specifications
- Python Version: 3.8.10
- Moviepy Version: 1.0.3
- Platform Name: Ubuntu
- Platform Version: 20.04 LTS
i am also facing the same problem
@MedoOnlyOne Please edit your issue to include example code which causes this problem, thanks. (Code best be formatted using code formatting.)
@keikoro I have edited the issue.
I also have the same issue.
Here is an absolute minimal reproducible example:
from moviepy.video.io.VideoFileClip import VideoFileClip
if __name__ == '__main__':
clip = VideoFileClip(filename='/home/wsontopski/Videos/recording.mp4')
clip.save_frame(filename='/home/wsontopski/Videos/recording.jpg', t=1)
recording.mp4
To overcome this issue you can convert the video before you load it:
import os
import subprocess
from moviepy.config import get_setting
from moviepy.video.io.VideoFileClip import VideoFileClip
if __name__ == '__main__':
FILENAME_RAW = '/home/wsontopski/Videos/recording.mp4'
FILENAME_CONVERTED = '/home/wsontopski/Videos/recording.mkv'
cmd = [get_setting("FFMPEG_BINARY"), "-i", FILENAME_RAW, '-c', 'copy', FILENAME_CONVERTED]
popen_params = {
"bufsize": 10**5,
"stdout": subprocess.PIPE,
"stderr": subprocess.PIPE,
"stdin": subprocess.DEVNULL,
}
if os.name == "nt":
popen_params["creationflags"] = 0x08000000
proc = subprocess.Popen(cmd, **popen_params)
proc.communicate()
if not os.path.isfile(FILENAME_CONVERTED):
raise RuntimeError()
clip = VideoFileClip(filename=FILENAME_CONVERTED)
clip.save_frame(filename='/home/wsontopski/Videos/recording.jpg', t=1)