2011-12-12 19 views
6

मैं पाइथन 2.7 असफल में pyffmpeg स्थापित करने का प्रयास कर रहा हूं। मुझे पायथन 2.6 के लिए एक पैकेज मिला, लेकिन मैं इसे काम नहीं कर सकता। तो, मैं 2.7 के साथ चारों ओर घूम रहा है। मैंने इस साइट पर दूसरों से पिछली पोस्ट देखी है, लेकिन उन्होंने मदद नहीं की है। क्या किसी के पास इसका अनुभव है। आखिरकार, मैं एक wxPython ऐप विकसित करना चाहता हूं जो वीडियो प्रारूपों को परिवर्तित करता है। धन्यवादपायथन के साथ ffmpeg का उपयोग 2.7

कोड है कि मैं अंत में लिखा है कि मेरे लिए काम किया (बहुत मौलिक है, लेकिन यह काम करता है ....):

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 वैसे भी एन्कोडिंग कार्यक्षमता प्रदान नहीं करेगा। इसलिए जब मैंने एक कस्टम वीडियो को एवी में बदलने के लिए एक डब्ल्यूएक्स ऐप बनाया, तो मैंने ffmpeg निष्पादन योग्य के साथ संवाद करने के लिए उपप्रोसेसर मॉड्यूल का उपयोग किया। एक स्मार्ट समाधान नहीं है लेकिन यह काम करता है। अन्यथा, [libVLC] (http://wiki.videolan.org/LibVLC) के लिए एक पायथन बाध्यकारी है जो नौकरी कर सकता है। – otterb

+1

ओह। libVLC केवल डिकोडिंग तक ही सीमित है। – otterb

+0

@otterb - मैंने उपप्रोसेसर मॉड्यूल का उपयोग नहीं किया, लेकिन एक समान दृष्टिकोण लिया। मैंने os.system (...) को रोकने और ffmpeg शुरू करने के लिए उपयोग किया, और कमांड लाइन को आदेश पास कर दिया। "एक स्मार्ट समाधान नहीं है, लेकिन यह काम करता है ...." – suffa

उत्तर

0

चूंकि यह कोई उचित उत्तर नहीं है, मैं एक के रूप में चाहते हैं। दुर्भाग्य से pyffmpeg wrapper वीडियो एन्कोडिंग करने में सक्षम नहीं था। तो एक समाधान के रूप में मैं आपको कुछ वैकल्पिक पायथन रैपर सुझाता हूं जो वीडियो को एन्कोड करने की हमारी आवश्यकता में सक्षम है।

इन के अलावा आप पूर्ण FFmpeg आदेशों पर अमल करने अजगर subprocess मॉड्यूल का उपयोग करके पूर्ण FFmpeg कार्यक्षमता का उपयोग कर सकते हैं। इसके साथ ही यदि आप की जरूरत है तो आप अपना खुद का रैपर बना सकते हैं। Here जुल्को subprocess का उपयोग FFmpeg के साथ करने का एक अच्छा तरीका बताता है। कभी-कभी subprocess का उपयोग करते समय आपको कुछ भ्रमित घटनाएं this मिल जाएगी। लेकिन हमेशा एक समाधान है!

आशा है कि यह वीडियो को एन्कोड करने के लिए pyffmpeg का उपयोग करके किसी एक समस्या के साथ किसी को भी मदद करता है!

संबंधित मुद्दे