Проблема с добавлением на видео аудио
Пишу программу, которая находит в папке скриншот и аудио, и делает из этого видео.
Для создания пустого видео, состоящего из одного скриншота испольщую библиотеку 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()
Также само видео(без аудио) не открывается в проигрывателе.