IT干货网

ffmpeg之在 Python 2.7 中使用 ffmpeg

davidwang456 2025年05月04日 编程设计 342 0

我一直试图在 Python 2.7 中安装 pyffmpeg 失败。我找到了一个 Python 2.6 的包,但我无法让它工作。所以,我一直在考虑 2.7。我在这个网站上看过其他人以前的帖子,但他们没有帮助。有人对这个有经验么。最终,我想开发一个转换视频格式的 wxPython 应用程序。谢谢

我最终编写的代码对我有用(非常简陋,但它有效....):

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

请您参考如下方法:

由于这没有正确的答案,我想形成一个。不幸的是 pyffmpeg 包装器无法执行视频编码。因此,作为一种解决方案,我建议您使用一些替代的 python 包装器,它们能够满足我们对视频的编码需求。

  • Python Video Converter
  • FFmpegWrapper
  • FFVideo

  • 除此之外,您还可以使用 python subprocess 使用完整的 FFmpeg 功能。模块来执行完整的 FFmpeg 命令。如果需要,您还可以创建自己的包装器。 Here Zulko 描述了一种使用 subprocess 的好方法与 FFmpeg。有时您会遇到一些令人困惑的事件,例如 this使用 subprocess 时.但总有解决办法!

    希望这对使用 pyffmpeg 对视频进行编码有同样问题的人有所帮助!


    评论关闭
    IT干货网

    微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!