Skip to content

Instantly share code, notes, and snippets.

@sinujohn
Created March 14, 2017 07:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sinujohn/49ce39eaf09f2e3828f61b347f76d2a1 to your computer and use it in GitHub Desktop.
Save sinujohn/49ce39eaf09f2e3828f61b347f76d2a1 to your computer and use it in GitHub Desktop.
A simple videocutter and converter frontend for ffmpeg written in pyQt.
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Created: Thu Jun 17 12:05:35 2010
######################################################################################
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Developer: Sinu John - https://sinujohn.github.io/
#
# Copyright 2010 Sinu John
# Enjoy!
#####################################################################################
from PyQt4 import QtCore, QtGui
from PyKDE4.phonon import Phonon #Use Qt's phonon instead of KDE's wherever possible
import os
# Enter the additional frequently used commands in the Dictionary - 'types'
types = { 'Same Quality' : '-sameq',
'3gp' : '-s 176x144 -ar 8000 -b 120000 -vcodec h263 -ab 10.2k -ac 1'
}
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(440, 461)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout_3 = QtGui.QGridLayout(self.centralwidget)
self.gridLayout_3.setObjectName("gridLayout_3")
self.gridLayout_2 = QtGui.QGridLayout()
self.gridLayout_2.setObjectName("gridLayout_2")
self.vidPlayer = Phonon.VideoPlayer(self.centralwidget)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.MinimumExpanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.vidPlayer.sizePolicy().hasHeightForWidth())
self.vidPlayer.setSizePolicy(sizePolicy)
self.vidPlayer.setMinimumSize(QtCore.QSize(430, 226))
self.vidPlayer.setObjectName("vidPlayer")
self.gridLayout_2.addWidget(self.vidPlayer, 0, 0, 1, 3)
self.horizontalLayout_3 = QtGui.QHBoxLayout()
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.vidSlider = Phonon.SeekSlider(self.centralwidget)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.vidSlider.sizePolicy().hasHeightForWidth())
self.vidSlider.setSizePolicy(sizePolicy)
self.vidSlider.setObjectName("vidSlider")
self.horizontalLayout_3.addWidget(self.vidSlider)
self.controlButton = QtGui.QPushButton(self.centralwidget)
self.controlButton.setMinimumSize(QtCore.QSize(60, 46))
font = QtGui.QFont()
font.setPointSize(24)
font.setWeight(75)
font.setBold(True)
self.controlButton.setFont(font)
self.controlButton.setObjectName("controlButton")
self.horizontalLayout_3.addWidget(self.controlButton)
self.gridLayout_2.addLayout(self.horizontalLayout_3, 1, 0, 1, 3)
self.verticalLayout = QtGui.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.horizontalLayout = QtGui.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.label_2 = QtGui.QLabel(self.centralwidget)
self.label_2.setObjectName("label_2")
self.horizontalLayout.addWidget(self.label_2)
self.inFile = QtGui.QLineEdit(self.centralwidget)
self.inFile.setObjectName("inFile")
self.horizontalLayout.addWidget(self.inFile)
self.inBrowse = QtGui.QPushButton(self.centralwidget)
self.inBrowse.setObjectName("inBrowse")
self.horizontalLayout.addWidget(self.inBrowse)
self.verticalLayout.addLayout(self.horizontalLayout)
self.horizontalLayout_2 = QtGui.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.label_3 = QtGui.QLabel(self.centralwidget)
self.label_3.setObjectName("label_3")
self.horizontalLayout_2.addWidget(self.label_3)
self.outFile = QtGui.QLineEdit(self.centralwidget)
self.outFile.setObjectName("outFile")
self.horizontalLayout_2.addWidget(self.outFile)
self.outBrowse = QtGui.QPushButton(self.centralwidget)
self.outBrowse.setObjectName("outBrowse")
self.horizontalLayout_2.addWidget(self.outBrowse)
self.verticalLayout.addLayout(self.horizontalLayout_2)
self.horizontalLayout_5 = QtGui.QHBoxLayout()
self.horizontalLayout_5.setObjectName("horizontalLayout_5")
self.label = QtGui.QLabel(self.centralwidget)
self.label.setObjectName("label")
self.horizontalLayout_5.addWidget(self.label)
self.typeCombo = QtGui.QComboBox(self.centralwidget)
self.typeCombo.setObjectName("typeCombo")
self.horizontalLayout_5.addWidget(self.typeCombo)
self.typeText = QtGui.QLineEdit(self.centralwidget)
self.typeText.setObjectName("typeText")
self.horizontalLayout_5.addWidget(self.typeText)
self.verticalLayout.addLayout(self.horizontalLayout_5)
self.gridLayout_2.addLayout(self.verticalLayout, 2, 0, 1, 3)
spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
self.gridLayout_2.addItem(spacerItem, 3, 0, 1, 1)
self.horizontalLayout_4 = QtGui.QHBoxLayout()
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
self.gridLayout = QtGui.QGridLayout()
self.gridLayout.setObjectName("gridLayout")
self.label_4 = QtGui.QLabel(self.centralwidget)
self.label_4.setObjectName("label_4")
self.gridLayout.addWidget(self.label_4, 0, 0, 1, 1)
self.stime = QtGui.QLineEdit(self.centralwidget)
self.stime.setObjectName("stime")
self.gridLayout.addWidget(self.stime, 0, 1, 1, 1)
self.smark = QtGui.QPushButton(self.centralwidget)
self.smark.setObjectName("smark")
self.gridLayout.addWidget(self.smark, 0, 2, 1, 1)
self.label_5 = QtGui.QLabel(self.centralwidget)
self.label_5.setObjectName("label_5")
self.gridLayout.addWidget(self.label_5, 2, 0, 1, 1)
self.emark = QtGui.QPushButton(self.centralwidget)
self.emark.setObjectName("emark")
self.gridLayout.addWidget(self.emark, 2, 2, 1, 1)
self.etime = QtGui.QLineEdit(self.centralwidget)
self.etime.setObjectName("etime")
self.gridLayout.addWidget(self.etime, 2, 1, 1, 1)
self.horizontalLayout_4.addLayout(self.gridLayout)
self.convertButton = QtGui.QPushButton(self.centralwidget)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.MinimumExpanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.convertButton.sizePolicy().hasHeightForWidth())
self.convertButton.setSizePolicy(sizePolicy)
self.convertButton.setMinimumSize(QtCore.QSize(0, 0))
self.convertButton.setObjectName("convertButton")
self.horizontalLayout_4.addWidget(self.convertButton)
self.gridLayout_2.addLayout(self.horizontalLayout_4, 3, 1, 1, 1)
spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
self.gridLayout_2.addItem(spacerItem1, 3, 2, 1, 1)
self.gridLayout_2.setRowStretch(0, 1)
self.gridLayout_3.addLayout(self.gridLayout_2, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 440, 22))
self.menubar.setObjectName("menubar")
self.menuFile = QtGui.QMenu(self.menubar)
self.menuFile.setObjectName("menuFile")
self.menuHelp = QtGui.QMenu(self.menubar)
self.menuHelp.setObjectName("menuHelp")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.actionQuit = QtGui.QAction(MainWindow)
self.actionQuit.setObjectName("actionQuit")
self.actionAbout = QtGui.QAction(MainWindow)
self.actionAbout.setObjectName("actionAbout")
self.menuFile.addAction(self.actionQuit)
self.menuHelp.addAction(self.actionAbout)
self.menubar.addAction(self.menuFile.menuAction())
self.menubar.addAction(self.menuHelp.menuAction())
self.vidSlider.setMediaObject(self.vidPlayer.mediaObject())
self.typeCombo.addItems(types.keys())
self.setCommand()
self.retranslateUi(MainWindow)
QtCore.QObject.connect(self.controlButton, QtCore.SIGNAL("clicked()"), self.controlVideo)
QtCore.QObject.connect(self.convertButton, QtCore.SIGNAL("clicked()"), self.convertVideo)
QtCore.QObject.connect(self.emark, QtCore.SIGNAL("clicked()"), self.markEnd)
QtCore.QObject.connect(self.smark, QtCore.SIGNAL("clicked()"), self.markStart)
#QtCore.QObject.connect(self.vidPlayer, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), MainWindow.show)
#QtCore.QObject.connect(self.vidSlider, QtCore.SIGNAL("destroyed()"), MainWindow.show)
QtCore.QObject.connect(self.actionQuit, QtCore.SIGNAL("activated()"), MainWindow.close)
QtCore.QObject.connect(self.actionAbout, QtCore.SIGNAL("activated()"), self.aboutHelp)
QtCore.QObject.connect(self.inBrowse, QtCore.SIGNAL("clicked()"), self.openFile)
QtCore.QObject.connect(self.outBrowse, QtCore.SIGNAL("clicked()"), self.saveFile)
QtCore.QObject.connect(self.typeCombo, QtCore.SIGNAL("currentIndexChanged(int)"), self.setCommand)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def __init__(self):
self.playing = False
self.media = Phonon.MediaSource()
def controlVideo(self):
if self.playing:
self.vidPlayer.pause()
self.playing=False
self.controlButton.setText("I>")
else:
if self.media.fileName() != self.inFile.text():
self.media = Phonon.MediaSource(self.inFile.text())
self.vidPlayer.play(self.media)
self.playing=True
self.controlButton.setText("II")
def convertVideo(self):
inFile=self.inFile.text().__str__()
outFile=self.outFile.text().__str__()
extraOption = self.typeText.text().__str__()
try:
startTime=int(self.stime.text())
except:
startTime = 0
try:
endTime = int(self.etime.text())
except:
endTime = 0
duration=endTime - startTime
if duration<0:
print "Swapping start and end time"
t=startTime
startTime = endTime
endTime = t
duration = -duration
print duration
if(duration==0):
command='ffmpeg -ss ' + startTime.__str__() + ' -i ' + inFile + ' ' + extraOption + ' ' + outFile
else:
command='ffmpeg -ss ' + startTime.__str__() + ' -i ' + inFile + ' -t ' + duration.__str__() + ' ' + extraOption + ' ' + outFile
terminalFound = ''
if os.system('konsole -v')==0:
terminalFound = 'konsole --hold -e'
elif os.system('xterm -v')==0:
terminalFound = 'xterm -hold -e'
command = terminalFound + ' ' + command
if terminalFound == '':
QtGui.QMessageBox.information(None,"Convert","No Terminal Emulators found. You'll be alerted once the conversion is over.")
if(os.system(command))==0:
result = 'Success'
else:
result = 'Fail'
if result == 'Fail':
result = 'Conversion Failed\nBut please do check the output file, sometimes failure is reported even when correct conversion is done.\nNasty error, right? Help me fix this.'
else:
result = 'Conversion Successful'
QtGui.QMessageBox.information(None,"Result",result)
else:
QtGui.QMessageBox.information(None,"Convert","Command:\n" + command +'\n\nEven if conversion fails, please do check the output file. Sometimes failure is reported even when correct conversion is done.\nNasty error, right? Help me fix this.')
print 'Command: ',command
os.system(command)
def markEnd(self):
self.etime.setText((self.vidPlayer.currentTime()/1000).__str__())
def markStart(self):
self.stime.setText((self.vidPlayer.currentTime()/1000).__str__())
def openFile(self):
fname = unicode(QtGui.QFileDialog.getOpenFileName(None,"Input","."))
self.inFile.setText(fname)
def saveFile(self):
fname = unicode(QtGui.QFileDialog.getSaveFileName(None,"Output","."))
self.outFile.setText(fname)
def aboutHelp(self):
QtGui.QMessageBox.information(None,"About",'<html>A simple video cutter and converter frontend for ffmpeg<br>Developer: Sinu John<br><a href="www.sinujohn.wordpress.com">www.sinujohn.wordpress.com</a></html>')
def setCommand(self):
key = unicode(self.typeCombo.currentText())
self.typeText.setText(types[key])
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "Sinu\'s VideoCutter", None, QtGui.QApplication.UnicodeUTF8))
self.controlButton.setToolTip(QtGui.QApplication.translate("MainWindow", "Play/Pause", None, QtGui.QApplication.UnicodeUTF8))
self.controlButton.setText(QtGui.QApplication.translate("MainWindow", "I>", None, QtGui.QApplication.UnicodeUTF8))
self.label_2.setText(QtGui.QApplication.translate("MainWindow", "Input File ", None, QtGui.QApplication.UnicodeUTF8))
self.inBrowse.setText(QtGui.QApplication.translate("MainWindow", "Browse", None, QtGui.QApplication.UnicodeUTF8))
self.label_3.setText(QtGui.QApplication.translate("MainWindow", "Output File:", None, QtGui.QApplication.UnicodeUTF8))
self.outBrowse.setText(QtGui.QApplication.translate("MainWindow", "Browse", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("MainWindow", "Output Type", None, QtGui.QApplication.UnicodeUTF8))
self.label_4.setText(QtGui.QApplication.translate("MainWindow", " Start ", None, QtGui.QApplication.UnicodeUTF8))
self.smark.setText(QtGui.QApplication.translate("MainWindow", "Mark", None, QtGui.QApplication.UnicodeUTF8))
self.label_5.setText(QtGui.QApplication.translate("MainWindow", " End", None, QtGui.QApplication.UnicodeUTF8))
self.emark.setText(QtGui.QApplication.translate("MainWindow", "Mark", None, QtGui.QApplication.UnicodeUTF8))
self.convertButton.setText(QtGui.QApplication.translate("MainWindow", "Convert", None, QtGui.QApplication.UnicodeUTF8))
self.menuFile.setTitle(QtGui.QApplication.translate("MainWindow", "File", None, QtGui.QApplication.UnicodeUTF8))
self.menuHelp.setTitle(QtGui.QApplication.translate("MainWindow", "Help", None, QtGui.QApplication.UnicodeUTF8))
self.actionQuit.setText(QtGui.QApplication.translate("MainWindow", "Quit", None, QtGui.QApplication.UnicodeUTF8))
self.actionQuit.setShortcut(QtGui.QApplication.translate("MainWindow", "Ctrl+Q", None, QtGui.QApplication.UnicodeUTF8))
self.actionAbout.setText(QtGui.QApplication.translate("MainWindow", "About", None, QtGui.QApplication.UnicodeUTF8))
self.actionAbout.setShortcut(QtGui.QApplication.translate("MainWindow", "F1", None, QtGui.QApplication.UnicodeUTF8))
self.outFile.setToolTip(QtGui.QApplication.translate("MainWindow", "Choose the extension carefully", None, QtGui.QApplication.UnicodeUTF8))
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment