#!/usr/bin/env python import sys, os.path import gst, gst.interfaces import gtk import gobject class Quality: high, medium, low = range(3) def encode_eos_cb(bus, message, pipeline): if message.type == gst.MESSAGE_EOS: pipeline.set_state(gst.STATE_NULL) gtk.main_quit () def do_query(pipeline, progress): try: ## Don't ask me why in the hell this is working :) pos = pipeline.query_position(gst.FORMAT_PERCENT) if pos: if pos[0] != 0: dur = pipeline.query_duration(gst.FORMAT_BYTES) progress.set_fraction(float (pos[0]) / dur[0] ) progress.set_text ("Progress: %d%%" % (pos[0] * 100 / dur[0])) except gst.QueryError: print 'query failed' return False return True def encode(origfile, destfolder, quality, progress): destfile = destfolder + '/' + createdestname (os.path.basename (origfile)) if quality == Quality.high: xres = 352 vbitrate = 524288 abitrate = 128 fps = 20 elif quality == Quality.medium: xres = 288 vbitrate = 393216 abitrate = 64 fps = 16 elif quality == Quality.low: xres = 176 vbitrate = 131072 abitrate = 48 fps = 10 ##strpipeline = 'filesrc location="%s" name="filesrc" ! decodebin name=d { avimux name=mux ! filesink location="%s" } { d. ! queue ! ffmpegcolorspace ! videoscale ! video/x-raw-yuv,width=%s ! videorate ! video/x-raw-yuv,framerate=(fraction)%s/1 ! ffenc_mpeg4 bitrate=%s ! queue ! mux. } { d. ! queue ! audioconvert ! audiorate ! audioresample ! lame bitrate=%s ! queue ! mux. }' % (origfile, destfile, xres, fps, vbitrate, abitrate) strpipeline = 'avimux name=mux forcefourcc="DIVX" ! filesink location="%s" { filesrc location="%s" name="filesrc" ! decodebin name=d { d. ! queue ! ffmpegcolorspace ! videoscale ! video/x-raw-yuv,width=%s ! videorate ! video/x-raw-yuv,framerate=(fraction)%s/1 ! ffenc_mpeg4 bitrate=%s ! queue ! mux. } { d. ! queue ! audioconvert ! audiorate ! lame bitrate=%s ! queue ! mux. }}' % (destfile, origfile, xres, fps, vbitrate, abitrate) print strpipeline pipeline = gst.parse_launch (strpipeline) bus = pipeline.get_bus() bus.add_signal_watch() bus.connect('message', encode_eos_cb, pipeline) pipeline.set_state(gst.STATE_PLAYING) query_id = gobject.timeout_add(500, do_query, pipeline, progress) def createdestname (orig): dot = orig.rfind ('.') start = orig[0:dot] return start + '_770.avi' class MainWindow: def callback(self, widget): if self.high.get_active(): quality = Quality.high elif self.medium.get_active(): quality = Quality.medium elif self.low.get_active(): quality = Quality.low encode (self.origbutton.get_filename(), self.destbutton.get_current_folder(), quality, self.progress) self.encodebutton.set_sensitive (gtk.FALSE) def delete_event(self, widget, event, data=None): gtk.main_quit() return False def __init__(self, file): self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.set_title("Video transcoder for Nokia 770") self.window.connect("delete_event", self.delete_event) self.window.set_border_width(10) self.vbox = gtk.VBox (False, 0) self.window.add(self.vbox) self.box1 = gtk.HBox(False, 0) self.vbox.add(self.box1) self.origlabel = gtk.Label("Original file:") self.box1.pack_start(self.origlabel, True, True, 0) self.origbutton = gtk.FileChooserButton("") self.origbutton.set_filename(file) self.box1.pack_start(self.origbutton, True, True, 0) self.box2 = gtk.HBox(False, 0) self.vbox.add(self.box2) self.destlabel = gtk.Label("Destination folder:") self.box2.pack_start(self.destlabel, True, True, 0) self.destbutton = gtk.FileChooserButton("") self.destbutton.set_filename(file) self.destbutton.set_action (gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER) self.box2.pack_start(self.destbutton, True, True, 0) self.qualitylabel = gtk.Label("Choose quality for resulting file:") self.vbox.add(self.qualitylabel) self.high = gtk.RadioButton (None, "High") self.medium = gtk.RadioButton (self.high, "Medium") self.low = gtk.RadioButton (self.high, "Low") self.vbox.add(self.high) self.vbox.add(self.medium) self.vbox.add(self.low) self.progress = gtk.ProgressBar() self.progress.set_text("Progress: 0%") self.vbox.add(self.progress) self.encodebutton = gtk.Button ("Transcode") self.encodebutton.connect ("clicked", self.callback) self.vbox.add(self.encodebutton) self.window.show_all() def main (): ##encode (args[1]) gtk.main() if __name__ == "__main__": import sys if sys.argv.count == 2: mainwindow = MainWindow(os.path.abspath(sys.argv[1])) else: mainwindow = MainWindow('') main()