python3 (l'opération sur python2 n'est pas confirmée. Ajouté le 21/05/2020) linux(debian 64bit) cpu: intel core i7
Post-scriptum 5/20:
pip3 install tkmedia
Et ffmpeg peut être installé en installant (5/30 postscript).
tkinter (inclus avec python, installez python3-tk pour linux imageio pillow pydub sounddevice numpy De plus, certains modules fournis avec python (Tous peuvent être installés avec "pip3 install [nom du module]".)
ffmpeg
(Aussi, un PC avec des performances modérées (Tetsuwan OOO et Sele OO des entreprises commençant par i ne sont pas recommandés)
Placez les fichiers comme suit:
play_video
|-__init__.py(Ciel)
|-audio.py
|-video.py
Exécutez ce qui suit dans le répertoire où se trouve le répertoire "play_video":
import play_video.video
import play_video.audio
import tkinter
video = video.Video()
audio = audio.Audio()
root = tkinter.Tk()
root.frame = tkinter.Label(root)
root.frame.pack()
video.openfile("[videofile_path]")
audio.openfile("[videofile_path]",)
audio.play()
video.play()
root.mainloop()
Laissez la licence libre. N'hésitez pas à éditer, redistribuer, utiliser à des fins commerciales, etc. (Je ne sais pas si quelqu'un l'utilise) Si possible, veuillez nous le faire savoir dans les commentaires ou par e-mail ([email protected]). Vérifiez également la licence de la bibliothèque et du logiciel que vous utilisez. Cependant, l'auteur n'assume aucune responsabilité, alors merci.
Utilisez pydub et sounddevice (et numpy)
audio.py
from . import sounddevice
import pydub
import time
import numpy
class Audio():
def __init__(self):
pass
def openfile(self, filepath):
if ".mp3" in filepath:
self.segment = pydub.AudioSegment.from_file(filepath,codec="mp3")
elif ".wav" in filepath:
self.segment = pydub.AudioSegment.from_file(filepath,codec="wav")
elif ".mp4" in filepath:
self.segment = pydub.AudioSegment.from_file(filepath)
else:
self.segment = pydub.AudioSegment.from_file(filepath)
def play(self, place=0):
if self.segment.channels != 1:
self.samples = numpy.array(self.segment.get_array_of_samples().tolist(),dtype="int16").reshape(-1,self.segment.channels)
else:
self.samples = numpy.array(self.segment.get_array_of_samples().tolist(),dtype='int16')
sounddevice.play(self.samples,self.segment.frame_rate)
def stop(self):
sounddevice.stop()
Lisez-le avec imageio et affichez-le dans le cadre de tkinter via PIL (cela se fait en multi-thread).
video.py
import tkinter
from tkinter import ttk
import imageio
from PIL import ImageTk, Image
import time
import threading
from imageio.plugins.ffmpeg import FfmpegFormat
class Video():
def __init__(self):
format = FfmpegFormat(
"ffmpeg",
"Many video formats and cameras (via ffmpeg)",
".mov .avi .mpg .mpeg .mp4 .mkv .wmv .webm",
"I",
)
imageio.formats.add_format(format,True)#Rendez-le compatible avec webm.(Tout à fait de force)
def openfile(self, file_path,frame):
self.frame = frame
try:
self.video = imageio.get_reader(file_path)
except imageio.core.fetching.NeedDownloadError:
imageio.plugins.avbin.download()
self.video = imageio.get_reader(file_path)
def play(self):
self.video_thread = threading.Thread(target=self._stream)
self.video_thread.start()
def stop(self):
self.video_thread.stop()
def _stream(self):
start_time=time.time()
sleeptime = 1/self.video.get_meta_data()["fps"]
frame_now = 0
for image in self.video.iter_data():
frame_now = frame_now + 1
if frame_now*sleeptime >= time.time()-start_time:
frame_image = ImageTk.PhotoImage(Image.fromarray(image))
self.frame.config(image=frame_image)
self.frame.image = frame_image
time.sleep(sleeptime)
else:
pass
Recommended Posts