Проблема с добавлением на видео аудио

Пишу программу, которая находит в папке скриншот и аудио, и делает из этого видео.

Для создания пустого видео, состоящего из одного скриншота испольщую библиотеку opencv

    def videoCreate(self, image, foldername):
        videoFilePath = "{path}{name}.mp4".format(path=self.folderPaths['results'], name=foldername)
        out = cv2.VideoWriter(videoFilePath, cv2.VideoWriter_fourcc(*'avc1'), 30.0, (1080, 1920))
        out.write(cv2.imread('{path}{image}.png'.format(path=self.folderPaths['results'],image=image)))

        out.release()
        cv2.destroyAllWindows()
        return videoFilePath

Для добавления в видео звук, использую библиотеку moviepy

    def addAduio(self, audio, videoPath, foldername):
        resultVideoPath = '{folder}{name}.mp4'.format(folder=self.folderPaths['results'],name=foldername)
        clip = mpe.VideoFileClip(videoPath)
        audio = mpe.AudioFileClip(audio)
        finalAudio = mpe.CompositeAudioClip([clip.audio, audio])
        finalClip = clip.set_audio(finalAudio)
        clip.write_videofile(resultVideoPath)
        #clip.write_videofile(resultVideoPath, audio=audio)
        return resultVideoPath

программа выдаёт следующую ошибку:

Traceback (most recent call last):
  File "C:\Users\valer\PycharmProjects\videoFromImagesAndAudioGenerator\venv\lib\site-packages\moviepy\video\io\ffmpeg_reader.py", line 285, in ffmpeg_parse_infos
    line = [l for l in lines if keyword in l][index]
IndexError: list index out of range

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\valer\PycharmProjects\videoFromImagesAndAudioGenerator\main.py", line 96, in <module>
    prog.main()
  File "C:\Users\valer\PycharmProjects\videoFromImagesAndAudioGenerator\main.py", line 29, in main
    self.resultVideo = self.addAduio(audio=self.filesToUse['audio'],videoPath=self.videoPath,foldername=self.foldername)
  File "C:\Users\valer\PycharmProjects\videoFromImagesAndAudioGenerator\main.py", line 85, in addAduio
    clip = mpe.VideoFileClip(videoPath)
  File "C:\Users\valer\PycharmProjects\videoFromImagesAndAudioGenerator\venv\lib\site-packages\moviepy\video\io\VideoFileClip.py", line 88, in __init__
    self.reader = FFMPEG_VideoReader(filename, pix_fmt=pix_fmt,
  File "C:\Users\valer\PycharmProjects\videoFromImagesAndAudioGenerator\venv\lib\site-packages\moviepy\video\io\ffmpeg_reader.py", line 35, in __init__
    infos = ffmpeg_parse_infos(filename, print_infos, check_duration,
  File "C:\Users\valer\PycharmProjects\videoFromImagesAndAudioGenerator\venv\lib\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 results/rer.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
[mov,mp4,m4a,3gp,3g2,mj2 @ 0000029ac9739640] Format mov,mp4,m4a,3gp,3g2,mj2 detected only with low score of 1, misdetection possible!
[mov,mp4,m4a,3gp,3g2,mj2 @ 0000029ac9739640] moov atom not found
results/rer.mp4: Invalid data found when processing input


Failed to load OpenH264 library: openh264-1.8.0-win64.dll
    Please check environment and/or download library: https://github.com/cisco/openh264/releases

[libopenh264 @ 00000205a770adc0] Incorrect library version loaded
Could not open codec 'libopenh264': Unspecified error

Process finished with exit code 1

Сам код:

# -*- coding: utf-8 -*-
import os, cv2, filetype, moviepy.editor as mpe

class videoFromImagesAndAudioGenerator:
    def __init__(self):
        self.welcomeMessage = 0
        self.folderPaths = {
            'materials': 'materials/',
            'results': 'results/'
        }

        self.version = {
            'version': 0.01,
            'date': 2021,
        }
        listOfDirectories = os.listdir(path=self.folderPaths['materials'])
        print(listOfDirectories)
        self.folders = list()
        for i in listOfDirectories:
            if i.find('.') == -1:
                self.folders.append('{folder}{folder2}'.format(folder=self.folderPaths['materials'], folder2=i))

    def main(self):
        self.folderToUse = self.welcome()
        for i in self.folderToUse:
            self.foldername = i.replace('materials/','')
            self.filesToUse = self.findFiles(i)
            self.videoPath = self.videoCreate(image=self.filesToUse['image'],foldername=self.foldername)
            self.resultVideo = self.addAduio(audio=self.filesToUse['audio'],videoPath=self.videoPath,foldername=self.foldername)

    def welcome(self):
        if self.welcomeMessage != 0:
            print('Программа преобразования картинок и аудио в видео')
            print('SilentBox', self.version['date'])
            print('Версия, ', self.version['version'])
            print('Найдено {} папок '.format(len(self.folders)))

        print('Чтобы вывести доступные папки с их номерами на экран, впишите list\nЧтобы начать работу впишите номер папки\nЧтобы сконвертировать все папки впишите all')
        cmd = input('>>>')
        if cmd == 'list':
            for i in self.folders:
                print('{number}: {title}'.format(number=self.folders.index(i), title=i))

        elif cmd == 'all':
            return self.folders

        else:
            try:
                int(cmd)
                try:
                    result = list()
                    result.append(self.folders[int(cmd)])
                    return result
                except IndexError:
                    print('нет такой папки.')
                    self.main()

            except ValueError:
                print('нужно писать только цифры.')
                self.main()

    def findFiles(self, folder):
        self.files = os.listdir(folder)
        result = dict()
        for i in self.files:
            path = '{folder}/{name}'.format(folder=folder,name=i)
            if filetype.image_match(path) != None:
                result.update({'image':path})
            if filetype.audio_match(path) != None:
                result.update({'audio':path})

        return result

    def videoCreate(self, image, foldername):
        videoFilePath = "{path}{name}.mp4".format(path=self.folderPaths['results'], name=foldername)
        out = cv2.VideoWriter(videoFilePath, cv2.VideoWriter_fourcc(*'avc1'), 30.0, (1080, 1920))
        out.write(cv2.imread('{path}{image}.png'.format(path=self.folderPaths['results'],image=image)))

        out.release()
        cv2.destroyAllWindows()
        return videoFilePath

    def addAduio(self, audio, videoPath, foldername):
        resultVideoPath = '{folder}{name}.mp4'.format(folder=self.folderPaths['results'],name=foldername)
        clip = mpe.VideoFileClip(videoPath)
        audio = mpe.AudioFileClip(audio)
        finalAudio = mpe.CompositeAudioClip([clip.audio, audio])
        finalClip = clip.set_audio(finalAudio)
        clip.write_videofile(resultVideoPath)
        #clip.write_videofile(resultVideoPath, audio=audio)
        return resultVideoPath


if __name__ == '__main__':
    prog = videoFromImagesAndAudioGenerator()
    prog.main()

Также само видео(без аудио) не открывается в проигрывателе.


Ответы (0 шт):