Just beat IT

情報系学生が技術的なことから昨日の夕飯のことまで

【PowerShell】FFmpegの動画結合を簡単にやりたい!

はじめに

どうも!最近,昼夜逆転しているロピタルです( 一一)

今回は,人生で初めてPowerShellのコマンドレットを作成した話を書きますね~

目次

経緯

私はwindowsで動画を結合する際,PowerShellFFmpegを使用しています.

ffmpeg.org

しかし,FFmpegの動画結合って手順が面倒なんですよね~"(-""-)

コマンド実行前に,結合する動画の名前を列挙したテキストファイルを作成する必要があるのです('Д')

その手順が面倒に感じていたので,コマンド一発で結合を行えるようにコマンドレットを作成しました!

コマンドレットとは?

PowerShellで利用できるコマンドのことです( *´艸`)

様々なコマンドレットがデフォルトで用意されていますが,自作の方法もマイクロソフトの公式サイトに書かれております!

docs.microsoft.com

自作することで,面倒な一通りの処理を一度に行うコマンドが作成できるわけです( *´艸`)

さあ,自作すんで~!!!!

f:id:lhopital:20200727225455j:plain

作成手順

一応,システム開発と同じ流れで書いてみます.やったことは激ショボです(´・ω・`)

要件定義

まず,コマンドで実行できることを定義しましょう。とりあえず実現したかった事として,

  • 動画が結合できる
  • 事前にテキストファイルを作らなくてよい

といった所ですね!

基本設計

さて,動画の結合に関してはコマンド内部で ffmpegを利用して結合を行います.

必要な機能についてはオプションを作成します.

テキストファイルについてはffmpegの結合コマンドにファイル入力が必要不可欠でした.そこで,コマンド内部でテキストファイルを生成し,終了時に削除することで利用者は意識しなくて大丈夫にします.

コマンド名は,覚えやすいように concatenate movie を略した catmov としました(^^)

詳細設計

結合する動画については,オプション指定しない場合は '<動画名><数字>.mp4' という形式の動画名が連番で続くまで全て結合します.

例えば,hoge1.mp4, hoge2.mp4, hoge3.mp4 のような形です.


また,実行中に生成するテキストファイルは,ユーザが意識しないよう隠しファイルとして生成することにします.


そして,コマンドの実行形式は

catmov <動画名> [オプション]

という形式にします.

オプションは,以下の表に示すものを実装します!

オプション名 記述例 意味 デフォルト
out 出力ファイル名の指定 -out hoge <動画名>.<拡張子>
start 先頭になる入力動画の添え字 -start 3 1
end 末尾になる入力動画の添え字 -end 5 なし(存在するだけ結合)
sep 結合子の指定 -sep - なし
ext 動画の拡張子指定 -ext avi mp4
copy 動画を再エンコードしない -copy False
alp 添え字にアルファベットを使用 -alp False(数字)

コーディング

設計通りにコーディングしていきます!

f:id:lhopital:20200727231749j:plain

完成しました!!

なお,テストは行っていません(笑)

コードはこちらに置いているので,暇な方は使ってみてください(^^)/

github.com

試用

使ってみます.

ディレクトリにhoge_A.avi, hoge_B.avi, hoge_C.avi, hoge_D.avi, hoge_E.avi が存在している状態で,hoge_B.avi, hoge_C.avi, hoge_D.aviを結合した動画を作成します!

> catmov hoge -start B -end D -alp -copy -sep _ -ext avi

このコマンド一発で動画が出力されました( *´艸`)

まとめ

今回は動画結合コマンドレットの作成についてでした!!

もう少し高度なコマンドレットを作成してみたいな~( 一一)