2011-12-12 13 views
6

Tôi đã cố gắng cài đặt pyffmpeg trong Python 2.7 không thành công. Tôi tìm thấy một gói cho Python 2.6, nhưng tôi không thể làm cho nó hoạt động. Vì vậy, tôi đã mulling xung quanh với 2,7. Tôi đã nhìn thấy bài viết trước từ những người khác trên trang web này, nhưng họ đã không giúp đỡ. Có ai có kinh nghiệm với điều này. Cuối cùng, tôi muốn phát triển một ứng dụng wxPython có thể chuyển đổi các định dạng video. Cảm ơnSử dụng ffmpeg với Python 2.7

Mã cuối cùng mà tôi đã viết rằng làm việc cho tôi (rất thô sơ, nhưng nó hoạt động ....):

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 sẽ không cung cấp chức năng mã hóa. Vì vậy, khi tôi xây dựng một ứng dụng wx để chuyển đổi một video tùy chỉnh thành avi, tôi chỉ sử dụng mô-đun subprocess để giao tiếp với ffmpeg thực thi. không phải là một giải pháp thông minh nhưng nó hoạt động. nếu không, có một python liên kết với [libVLC] (http://wiki.videolan.org/LibVLC) có thể thực hiện công việc. – otterb

+1

oops. libVLC dường như cũng bị giới hạn chỉ giải mã. – otterb

+0

@otterb - Tôi đã không sử dụng mô-đun subprocess, nhưng đã có một cách tiếp cận tương tự. Tôi đã sử dụng os.system (...) để dừng và bắt đầu ffmpeg, và truyền lệnh cho dòng lệnh. "Không phải là một giải pháp thông minh, nhưng nó hoạt động ...." – suffa

Trả lời

0

Vì đây không có câu trả lời thích hợp, tôi muốn tạo một. Thật không may là trình bao bọc pyffmpeg không thể thực hiện mã hóa video. Vì vậy, như là một giải pháp tôi đề nghị bạn một số wrappers python thay thế mà có khả năng nhu cầu của chúng tôi để mã hóa các video.

Ngoài các bạn có thể sử dụng chức năng FFmpeg đầy đủ bằng cách sử dụng python subprocess mô-đun để thực hiện đầy đủ các lệnh FFmpeg. Ngoài ra, bạn có thể tạo trình bao bọc của riêng mình nếu cần. Here Zulko mô tả cách tốt nhất để sử dụng subprocess với FFmpeg. Đôi khi bạn sẽ nhận được một số sự kiện gây nhầm lẫn như this khi sử dụng subprocess. Nhưng luôn luôn có một giải pháp!

Hy vọng điều này sẽ giúp một số người có cùng vấn đề bằng cách sử dụng pyffmpeg để mã hóa video!