2020年1月19日日曜日

動画ファイルの連結 ffmpeg のフロントエンド



新しいPCにして初めてのpythonなり~( ゚Д゚)

ffmpegで連結
分割動画の連結を最近結構やるようになった
ツールもあるんだろうけど、ffmpegのコマンドラインでやっている
コマンドではまず対象ファイルのリストをテキストで作成する必要があり、リスト作成用のpythonとコマンド実行のpythonの二つを書いて使っていた
このpythonは非GUIの本当に簡単なスクリプト

GUI化
でも頻度が増えて面倒になったので、TotalCommanderから使えるGUIを作ることにした
QtかPyQtかで悩むところだけど、慣れたPyQtで作った
でも新PCで初めてのPyQtのGUIだったので、環境自体が整ってなくてちょっと悩みながら作った
=========================
from PyQt5.QtWidgets import QApplication,QWidget ,QMainWindow
from PyQt5.QtCore import QSettings
import untitled # これが ui
import sys,os , re , subprocess

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui=untitled.Ui_MainWindow()
        self.ui.setupUi(self)

        args = sys.argv
        if len(args)>=3 :
            self.d,self.a =os.path.split(args[1]) 
            self.b=os.path.split(args[2])[1]
            self.ui.listWidget.addItem(self.d)
            self.ui.listWidget.addItem(self.a)
            self.ui.listWidget.addItem(self.b)
            self.ui.lineEdit.setText( re.sub( r'(.+)(-.)(\..*)' , r'\1\3' , self.a )  )

        try:
            settings = QSettings("OsamuApp", "goffmpeg")
            self.restoreGeometry( settings.value( "geometry" ) )
        except:
            pass

    def makehoge( self ) : # 連結するファイルリストの作成
        fname=os.path.join(os.path.dirname(__file__) , 'hoge.txt')
        args = sys.argv
        f= open( fname , 'w' )
        pp = re.sub( r'\\' , r'\\\\' , args[1] )
        f.write(f'file {pp}\n')
        pp = re.sub( r'\\' , r'\\\\' , args[2] )
        f.write(f'file {pp}\n')
        f.close
        self.ui.listWidget.addItem('(・∀・)ノ')

    def gompeg( self ) :  # ffmpeg の起動
        fname=os.path.join(os.path.dirname(__file__) , 'hoge.txt')
        outname=os.path.join(self.d , self.ui.lineEdit.text())
        ffmpeg = r''
        command=(ffmpeg ,'-f','concat','-safe','0','-i',fname,'-c','copy', outname)
        subprocess.run( command )

    def closebutton(self):
        self.close()

    def closeEvent (self,e) :
        settings = QSettings("OsamuApp", "goffmpeg")
        settings.setValue("geometry", self.saveGeometry())


if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())
=========================

VSCode
pythonはテキストエディタで書くかこの環境を使うかだが、インストはしてあったが設定が未だに済んでなくて使いづらい
どうしたら前と同じになるのかわかんない┐('д')┌
もともとちゃんと使えてたのかも妖しいんだけども( ´∀`)
TotalCommanderとの連携になるので実行時に引数が必要となる、その設定もよくわかんない
QtCreatorの方が良かったかなと少し思った

何とか完成
分割は2分割にしか対応してない、今のところそれがほとんどなので
ファイルを二つ選択してTotalCommanderから起動すると、GUIのリストにファイルのディレクトリとベースネームを二つ表示する
その下の一行エディットには元のファイル名から連番を取った除いた出力ファイル名が表示される
Hogeでリストのテキストをスクリプトフォルダに生成する
Goでffmpegに渡すと元ファイルと同じ場所に新ファイルが生成される
ffmpegの実行中は制御が戻ってこないつくり

ToDo
3つ以上の分割にも対応するか?
DDには対応した方が良いな
分割ファイルは末尾に-1と連番が振られてることを前提としてるが、順番が逆になる場合があるので、ソートを実装すべき
ffmpegの実行はスレッドにして制御はGUIに戻した方が良いのかな
リストを作成してすぐffmpegを実行するとエラーになるのでボタンを分けたが理由がわかんないので解明したい

いまのところこれで十分なのでこれはもう更新しないと思う( ´∀`)
ffmpegはスーパーツール、汎用のフロントエンドなら作りたいけどねえ

0 件のコメント:

コメントを投稿