ffmpeg wxpython

Usando ffmpeg con Python 2.7



wxpython (1)

He intentado instalar pyffmpeg en Python 2.7 sin éxito. Encontré un paquete para Python 2.6, pero no puedo hacerlo funcionar. Entonces, he estado reflexionando con 2.7. He visto publicaciones anteriores de otros en este sitio, pero no han ayudado. Alguien tiene experiencia con esto. En última instancia, quiero desarrollar una aplicación wxPython que convierta formatos de video. Gracias

Código que finalmente escribí que funcionó para mí (muy rudimentario, pero funciona ...):

import wx import os import sys import time import datetime from wx.lib.delayedresult import startWorker class dConvert(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, -1, ''d-Converter'', size=(500, 310)) panel = wx.Panel(self, wx.ID_ANY)#Creates a panel over the widget toolbar = self.CreateToolBar() toolbar.Realize() #Setup Menu #Setting up Menu menuFile = wx.Menu() menuFile.Append(1, "&About...") menuFile.AppendSeparator() menuFile.Append(2, "E&xit") menuBar = wx.MenuBar() menuBar.Append(menuFile, "&File") panel.SetBackgroundColour(''WHITE'') menu2 = wx.Menu() menu2.Append(5, "&.mpg to dvd", ".mpg to dvd") menu2.AppendSeparator() menu2.Append(wx.NewId(), "&Options...", "Options...") menuBar.Append(menu2, "&DVD") menu3 = wx.Menu() menu3.Append(7, "&Audio/Video Trim") #menu3.AppendSeparator() menuBar.Append(menu3, "Media") self.SetMenuBar(menuBar) self.Bind(wx.EVT_MENU, self.OnAbout, id=1) self.Bind(wx.EVT_MENU, self.OnQuit, id=2) self.Bind(wx.EVT_MENU, self.OnDVD, id=5) self.Bind(wx.EVT_MENU, self.OnMedia, id=7) #Add icon to frame iconFile = "dconverter_image.jpg" icon1 = wx.Icon(iconFile, wx.BITMAP_TYPE_JPEG) self.SetIcon(icon1) self.statusbar = self.CreateStatusBar() self.statusbar.SetStatusText("Convert Audio & Video") self.statusbar.SetFieldsCount(3) self.statusbar.SetStatusWidths([200, -2, -2]) #Panel Text font = wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD) font2 = wx.Font(7, wx.DEFAULT, wx.NORMAL, wx.BOLD) directory = wx.StaticText(panel, -1, ''Path: c://ffmpeg//bin'', (300, 13)) directory.SetFont(font2) convertfile = wx.StaticText(panel, -1, ''File:'', (270, 53)) convertfile.SetFont(font) convertfile2 = wx.StaticText(panel, -1, ''Format:'', (245, 83)) convertfile2.SetFont(font) convertfile3 = wx.StaticText(panel, -1, ''Quality:'', (244, 113)) convertfile3.SetFont(font) convertfile4 = wx.StaticText(panel, -1, ''Presets:'', (239, 143)) convertfile4.SetFont(font) image_file = ''cd_rom.gif'' bmp1 = wx.Image(image_file, wx.BITMAP_TYPE_ANY).ConvertToBitmap() panel.bitmap1 = wx.StaticBitmap(panel, -1, bmp1, (50, 30)) self.formats1 = [] #Select Media path os.chdir("c://ffmpeg//bin") wrkdir = os.getcwd() filelist = os.listdir(wrkdir) #self.formats1 = [] for filename in filelist: (head, filename) = os.path.split(filename) if filename.endswith(".avi") or filename.endswith(".mp4") or filename.endswith(".mpg") or filename.endswith(".m4A") or filename.endswith(".MTS") or filename.endswith(".flv") or filename.endswith(".mov") or filename.endswith(".mpeg4") or filename.endswith(".mpeg") or filename.endswith(".mpg2") or filename.endswith(".mkv") or filename.endswith(".m4v") or filename.endswith(".wav") or filename.endswith(".mp3"): self.formats1.append(filename) self.format_combo1=wx.ComboBox(panel, size=(140, -1),value=''Select Media'', choices=self.formats1, style=wx.CB_DROPDOWN, pos=(300,50)) self.Bind(wx.EVT_COMBOBOX, self.fileFormats, self.format_combo1) #Media Formats self.formats2 = [''Select Format'', ''.avi'',''.mpeg'',''.mp4'',''.flv'',''.mov'',''.m4a'',''.m4v'',''.mkv'',''.mpeg4'',''.mpg'',''.mpg2'',''.mp3'',''.ogg'',''.wav'',''.wma''] self.format_combo2=wx.ComboBox(panel, size=(100, -1),value=''Select Format'', choices=self.formats2, style=wx.CB_SORT, pos=(300,81)) #Media Quality self.formats3 = [''-sameq'',''-qmax''] self.format_combo3=wx.ComboBox(panel, size=(100, -1),value=''Select Quality'', choices=self.formats3, style=wx.CB_DROPDOWN, pos=(300,111)) #-qmax settings self.formats4 = [''1'',''2'',''3'',''4'',''5'',''6'',''7'',''8''] self.format_combo4=wx.ComboBox(panel, size=(30, -1),value=''0'', choices=self.formats4, style=wx.CB_DROPDOWN, pos=(405,111)) self.format_combo4.Disable() #Media Quality self.formats5 = [''Select Preset'',''video to mp3''] self.format_combo5=wx.ComboBox(panel, size=(100, -1),value=''Select Preset'', choices=self.formats5, style=wx.CB_DROPDOWN, pos=(300,141)) #Bit rate self.formats6 = [''128000'', ''160000'', ''180000'', ''192000''] self.format_combo6=wx.ComboBox(panel, size=(47, -1),value=''k/bs'', choices=self.formats6, style=wx.CB_DROPDOWN, pos=(405,141)) self.format_combo6.Disable() #Convert Button self.button = wx.Button(panel, label="Convert", pos=(300, 171), size=(80, 20)) self.Bind(wx.EVT_BUTTON, self.convertButton, self.button) #Abort Button self.button2 = wx.Button(panel, label="Abort", pos=(385, 171), size=(80, 20)) self.Bind(wx.EVT_BUTTON, self.OnAbortButton, self.button2) self.button2.Disable() #Refresh Button self.button3 = wx.Button(panel, label="Refresh", pos=(215, 171), size=(80, 20)) self.Bind(wx.EVT_BUTTON, self.file_refresh, self.button3) #ComboBox Event self.Bind(wx.EVT_COMBOBOX, self.OncomboBox, self.format_combo3) self.Bind(wx.EVT_COMBOBOX, self.OncomboBox2, self.format_combo5) self.Bind(wx.EVT_COMBOBOX, self.OncomboBox3, self.format_combo2) def file_refresh(self, e): self.format_combo1.Clear() os.chdir("c://ffmpeg//bin") wrkdir = os.getcwd() filelist = os.listdir(wrkdir) for m_files in filelist: if m_files.endswith(".avi") or m_files.endswith(".mp4") or m_files.endswith(".mpg") or m_files.endswith(".m4A") or m_files.endswith(".MTS") or m_files.endswith(".flv") or m_files.endswith(".mov") or m_files.endswith(".mpeg4") or m_files.endswith(".mpeg") or m_files.endswith(".mpg2") or m_files.endswith(".mkv") or m_files.endswith(".m4v") or m_files.endswith(".wav") or m_files.endswith(".mp3"): self.format_combo1.Append(m_files) def file_rename(self, f_name): ts = time.time() #Capture readable timestamp st = datetime.datetime.fromtimestamp(ts).strftime(''%Y-%m-%d_%H-%M-%S'') os.chdir("c://ffmpeg//bin") wrkdir = os.getcwd() #get file extenstion from original file #fileName, fileExtension = os.path.splitext(wrkdir + ''//' + f_name) #add file extension to timestamp new_file = st return new_file def fileFormats(self, e): myFormats = {''audio'': (''Select Format'', ''.m4a'', ''.mp3'', ''.ogg'', ''.wav'', ''.wma''), ''video'': (''Select Format'', ''.avi'', ''.flv'', ''.mkv'', ''.m4v'', ''.mov'', ''.mpg'', ''.mpg2'', ''.mpeg4'', ''.mp4'', ''.mpeg'')} bad_file = [''Media not supported''] myFile = self.format_combo1.GetValue() f_exten = (x for x in myFormats[''audio''] + myFormats[''video''] if myFile.endswith(x)) extension = f_exten.next() if extension in myFormats[''audio'']: self.format_combo2.SetItems(myFormats[''audio'']) elif extension in myFormats[''video'']: self.format_combo2.SetItems(myFormats[''video'']) else: self.format_combo2.SetItems(bad_file) def OnQuit(self, event): self.Close(True) def OnAbout(self, event): wx.MessageBox("d-Converter 1.0/n/n Developer: D.Monroe/n/nCopyright 2012", "About d-Converter", wx.OK | wx.ICON_INFORMATION, self) def OncomboBox(self, e): quality=self.format_combo3.GetValue() if quality == ''-qmax'': self.format_combo4.Enable() else: self.format_combo4.Disable() def OncomboBox2(self, e): quality=self.format_combo5.GetValue() if quality != ''Select Preset'': self.format_combo1.Enable() self.format_combo2.Disable() self.format_combo3.Disable() self.format_combo4.Disable() self.format_combo6.Enable() elif quality == ''Select Preset'': self.format_combo1.Enable() self.format_combo2.Enable() self.format_combo3.Enable() self.format_combo4.Disable() self.format_combo5.Enable() self.format_combo6.Disable() elif quality == ''video to mp3'': self.format_combo6.Enable() self.format_combo2.Disable() self.format_combo3.Disable() self.format_combo4.Disable() def OncomboBox3(self, e): v_format=self.format_combo2.GetValue() if v_format != ''Select Format'': self.format_combo1.Enable() self.format_combo2.Enable() self.format_combo3.Enable() self.format_combo4.Enable() self.format_combo5.Disable() self.format_combo6.Disable() elif v_format == ''Select Format'': self.format_combo1.Enable() self.format_combo2.Enable() self.format_combo3.Enable() self.format_combo4.Disable() self.format_combo5.Enable() self.format_combo6.Disable() def OnMedia(self, e): pass def OnDVD(self, e): """ Select a directory to search""" os.chdir("c://ffmpeg//bin") wrkdir = os.getcwd() filelist = os.listdir(wrkdir) progdir = ''c://ffmpeg//bin//ffmpeg.exe'' + '' -i '' prog_dir = '' -target '' progdir3 = ''-dvd -ac 2 '' vid_format = ''.mpg'' sampleList = [] for filename in filelist: (head, filename) = os.path.split(filename) if filename.endswith(".avi") or filename.endswith(".flv") or filename.endswith(".mpeg") or filename.endswith(".mp4") or filename.endswith(".mov") or filename.endswith(".mpg2"): sampleList.append(filename) dlg = wx.SingleChoiceDialog( self, "Files in c://ffmpeg//bin", ''Select video to convert'', sampleList, wx.CHOICEDLG_STYLE ) if dlg.ShowModal() == wx.ID_OK: cur_item = dlg.GetStringSelection() s_string = cur_item #f_string = self.file_rename(s_string) f_string = s_string.replace('' '', '''') dlg.Destroy() dlg2 = wx.SingleChoiceDialog( self, "Files in c://ffmpeg//bin", ''Select video standard '', ["pal", "ntsc"], wx.CHOICEDLG_STYLE ) if dlg2.ShowModal() == wx.ID_OK: cur_item2 = dlg2.GetStringSelection() s_string2 = cur_item2 self.button.Disable() self.button2.Enable() self.format_combo1.Disable() self.format_combo2.Disable() self.format_combo3.Disable() self.format_combo4.Disable() self.format_combo5.Disable() self.format_combo6.Disable() startWorker(self.LongTaskDone, self.LongTask4, wargs=(progdir, wrkdir, prog_dir, progdir3, f_string, s_string2, vid_format)) dlg2.Destroy() def convertButton(self, e): unit1 = self.format_combo1.GetValue() unit2 = self.format_combo2.GetValue() unit3 = self.format_combo3.GetValue() unit4 = None unit5 = self.format_combo5.GetValue() bitRate = self.format_combo6.GetValue() unit6 = bitRate if unit3 == ''-qmax'': unit4 = self.format_combo4.GetValue() else: pass os.chdir("c://ffmpeg//bin") wrkdir = os.getcwd() newfile = unit1 #stripped = os.path.splitext(newfile)[0] # Updated 9/26/2013 to strip extension. #stripped = newfile.strip(''mpeg3kaviovfl4w2c.'') #Strips the extension from the original file name stripped = self.file_rename(newfile) #os.rename(newfile, newfile_f) progname=''c://ffmpeg//bin//ffmpeg.exe'' + '' -i '' preset1_a=''-vn -ar 44100 -ac 2 -ab'' preset1_b=''-f mp3 '' preset_mp3=''.mp3'' if (unit1 == ''Select Media'' or unit1 == ''''): amsg = wx.MessageDialog(None, ''You must select a media file!'', ''Media Converter'', wx.ICON_INFORMATION) amsg.ShowModal() amsg.Destroy() elif (unit1 != ''Select Media'' or unit1 != '''') and (unit5 == ''Select Preset''): if (unit2 == ''Select Format'' or unit2 == ''''): amsg = wx.MessageDialog(None, ''You must select a format'', ''Media Converter'', wx.ICON_INFORMATION) amsg.ShowModal() amsg.Destroy() self.format_combo3.Enable() self.format_combo4.Enable() self.format_combo5.Enable() else: pass if (unit3 == ''Select Quality'' or unit3 == ''''): amsg = wx.MessageDialog(None, ''You must select quality'', ''Media Converter'', wx.ICON_INFORMATION) amsg.ShowModal() amsg.Destroy() elif (unit3 == ''-qmax''): if (unit4 == ''0'' or unit4 == ''''): amsg = wx.MessageDialog(None, ''You must select number between 1-8.'', ''Media Converter'', wx.ICON_INFORMATION) amsg.ShowModal() amsg.Destroy() else: self.button.Disable() self.button2.Enable() pass else: self.button.Disable() self.button2.Enable() self.format_combo1.Disable() self.format_combo2.Disable() self.format_combo3.Disable() self.format_combo4.Disable() startWorker(self.LongTaskDone, self.LongTask, wargs=(progname,wrkdir,unit1,unit3,stripped,unit2)) elif (unit1 != ''Select Media'' or unit1 != '''') and (unit5 == ''video to mp3''): if unit6 == ''k/bs'' or unit6 == None: amsg = wx.MessageDialog(None, ''You must select a bit rate.'', ''Media Converter'', wx.ICON_INFORMATION) amsg.ShowModal() amsg.Destroy() else: self.button.Disable() self.button2.Enable() self.format_combo1.Disable() self.format_combo2.Disable() self.format_combo3.Disable() self.format_combo4.Disable() self.format_combo5.Disable() self.format_combo6.Disable() startWorker(self.LongTaskDone, self.LongTask3, wargs=(progname, wrkdir, unit1, preset1_a, unit6, preset1_b, stripped, preset_mp3)) def LongTask(self, progname, wrkdir, unit1, unit3, stripped, unit2): convert_file1 = progname + wrkdir + ''//' + unit1 + '' '' + unit3 + '' '' + stripped + unit2 self.statusbar.SetStatusText("Converting: " + unit1 + "...") os.system(convert_file1) print convert_file1 def LongTask2(self, progname, wrkdir, unit1, unit3, unit4, stripped, unit2): convert_file2 = progname + wrkdir + ''//' + unit1 + '' '' + unit3 + '' '' + unit4 + '' '' + stripped + unit2 self.statusbar.SetStatusText("Converting: " + unit1 + "...") os.system(convert_file2) def LongTask3(self, progname, wrkdir, unit1, preset1_a, unit6, preset1_b, stripped, preset_mp3): convert_file3 = progname + wrkdir + ''//' + unit1 + '' '' + preset1_a + '' '' + unit6 + '' '' + preset1_b + stripped + preset_mp3 self.statusbar.SetStatusText("Converting: " + unit1 + "...") os.system(convert_file3) def LongTask4(self, progdir, wrkdir, prog_dir, progdir3, f_string, s_string2, vid_format): #convert_file4 = progdir + wrkdir + ''//' + s_string + prog_dir + s_string2 + progdir3 + s_string.strip(''mpegaviw24ofl.'') + vid_format convert_file4 = progdir + f_string + prog_dir + s_string2 + progdir3 + f_string.strip(''mpegaviw24ofl.'') + vid_format self.statusbar.SetStatusText("Converting: " + f_string + "...") os.system(convert_file4) print convert_file4 def LongTaskDone(self, result): r = result.get() if r: amsg = wx.MessageDialog(None, ''Aborted!'', ''Media Converter'', wx.ICON_INFORMATION) self.statusbar.SetStatusText("Convert Aborted ...") amsg.ShowModal() amsg.Destroy() self.LongTask.terminate() else: self.statusbar.SetStatusText("Done ...") emsg = wx.MessageDialog(None, ''Finished Converting!'', ''Media Converter'', wx.ICON_INFORMATION) emsg.ShowModal() emsg.Destroy() self.format_combo1.Enable() self.format_combo2.Enable() self.format_combo3.Enable() self.format_combo5.Enable() self.format_combo4.Disable() self.format_combo6.Disable() self.button.Enable() self.button2.Disable() self.shouldAbort = False """self.progress_bar.SetValue(0) self.progress_bar.Hide()""" def OnAbortButton(self, e): endprogram = ''c://Windows//System32//taskkill /IM cmd.exe'' os.system(endprogram) self.format_combo1.Enable() self.format_combo2.Enable() self.format_combo3.Enable() self.format_combo5.Enable() self.button.Enable() if __name__ == ''__main__'': app = wx.PySimpleApp() frame = dConvert() frame.SetSizeHints(500,310,500,310) frame.Show() app.MainLoop()


Como esto no tiene una respuesta adecuada, me gustaría formar uno. Desafortunadamente, el envoltorio de pyffmpeg no pudo realizar la codificación de video. Entonces, como solución, sugiero algunas envolturas de python alternativas que sean capaces de codificar los videos.

Además de esto, puede utilizar la funcionalidad completa de FFmpeg utilizando el módulo de subprocess Python para ejecutar comandos completos de FFmpeg. También con eso puedes crear tu propio contenedor si lo necesitas. Aquí Zulko describe una buena forma de usar el subprocess con FFmpeg. Algunas veces obtendrá algunos eventos confusos como este al usar un subprocess . ¡Pero siempre hay una solución!

Espero que esto ayude a alguien con el mismo problema al usar pyffmpeg para codificar videos.