2011-12-12 36 views
6

Próbowałem bezskutecznie zainstalować Pyffmpeg w Pythonie 2.7. Znalazłem pakiet dla Pythona 2.6, ale nie mogę go uruchomić. Rozmyślałem więc z 2.7. Widziałem poprzedni post od innych na tej stronie, ale nie pomogło. Czy ktoś ma z tym doświadczenie. Ostatecznie chcę opracować aplikację wxPython, która konwertuje formaty wideo. DziękiUżywanie ffmpeg z Pythonem 2.7

kodu, który ostatecznie napisał, że pracował dla mnie (bardzo prymitywny, ale działa ....):

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() 
+1

Pyffmpeg i tak nie zapewni funkcji kodowania. Więc kiedy zbudowałem aplikację WX do konwersji niestandardowego wideo do avi, po prostu użyłem modułu podprocesu do komunikacji z plikiem wykonywalnym ffmpeg. nie jest to mądre rozwiązanie, ale działa. w przeciwnym razie istnieje powiązanie z pythonem dla [libVLC] (http://wiki.videolan.org/LibVLC), które może wykonać zadanie. – otterb

+1

oops. libVLC wydaje się być ograniczone tylko do dekodowania. – otterb

+0

@otterb - Nie użyłem modułu podprocesowego, ale podjąłem podobne podejście. Użyłem os.system (...), aby zatrzymać i uruchomić ffmpeg, i przekazałem polecenia do wiersza poleceń. "Nie jest to mądre rozwiązanie, ale działa ...." – suffa

Odpowiedz

0

Ponieważ nie ma właściwej odpowiedzi, chciałbym, aby utworzyć jeden. Niestety opakowanie pyffmpeg nie było w stanie wykonać kodowania wideo. Jako rozwiązanie proponuję kilka alternatywnych wrapperów Pythona, które są w stanie zakodować filmy.

Oprócz tego można korzystać z pełnej funkcjonalności FFmpeg przy użyciu modułu Pythona subprocess wykonać pełny poleceń FFmpeg. Ponadto możesz utworzyć własne opakowanie, jeśli zajdzie taka potrzeba. Here Zulko opisuje przyjemny sposób użycia subprocess z FFmpeg. Czasami pojawi się kilka mylących zdarzeń, takich jak this podczas korzystania z subprocess. Ale zawsze istnieje rozwiązanie!

Mam nadzieję, że pomoże to komuś z tym samym problemem, używając pyffmpeg do kodowania wideo!

Powiązane problemy