アーケードゲームのプレイを録画した際、機器によっては録画した動画の向きが横になっている場合があります。
FFmpegを使えば動画を回転して正しい向きにすることができるのですが、GUIを持たないツールであるため、コマンドラインに慣れていない方にとっては少々扱いづらいアプリケーションです。
そこで今回はHTAを使って簡易的なフロントエンドを用意したいと思います。
FFmpegの準備
まずは動画の回転に使用するFFmpegをダウンロードします。
- 「Download FFmpeg」からWindows向けFFmpegのダウンロードページを開きます。
 - 32ビット版と64ビット版に分かれているので、自分の環境に応じたファイル(zip形式)をダウンロードします。「Static」「Shared」「Dev」バージョンがありますが、特にこだわりが無ければ「Static」バージョンで良いでしょう。
 - 手順2.でダウンロードしたzipファイルを適当な場所に解凍します。
 


HTAの準備
FFmpegの準備が終わったら、次はフロントエンドとなるHTAファイルを作成します。
- メモ帳を起動し、下記コードを貼り付けます。
 - 「名前を付けて保存」から、ファイルの種類を「すべてのファイル」、文字コードを「UTF-8」、ファイルの拡張子(ファイル名)を「hta」にして適当な場所に保存します。
 
<!DOCTYPE html>
<!--
    動画回転用簡易FFmpegフロントエンド
    @kinuasa
    
    ※要ffmpeg.exe
    ※https://ffmpeg.org/download.html からダウンロード
-->
<html>
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=10">
        <title>動画回転用簡易FFmpegフロントエンド</title>
        <style>
            * {
                font-family: "Segoe UI", Meiryo, "メイリオ", sans-serif;
                font-size: 11pt;
            }
            table {
                border-style: none;
            }
            tr, td {
                border-style: none;
                padding: 5px;
            }
            #btnExec {
                border-top: 1px solid #96d1f8;
                background: #65a9d7;
                padding: 15px 30px;
                color: white;
                font-size: 16px;
                /* font-weight: bold; */
                text-decoration: none;
                vertical-align: middle;
            }
            #btnExec:hover {
                border-top-color: #28597a;
                background: #28597a;
                color: #ccc;
                cursor: pointer;
            }
            #btnExec:active {
                border-top-color: #1b435e;
                background: #1b435e;
            }
        </style>
        <script language="vbscript">
          Option Explicit
          
          Private Const FileSuffix = "_output"
          
          Private Sub window_OnLoad()
          'ウィンドウリサイズ・移動
            window.resizeTo 600, 250
            window.moveTo 250, 250
          End Sub
          
          Private Sub btnExec_OnClick()
            Dim FfmpegFilePath
            Dim SrcFilePath
            Dim DestFilePath
            Dim DestFolderPath
            Dim Rotate
            Dim Com
            Dim iptFfmpegFile
            Dim iptSrcFile
            
            Set iptFfmpegFile = document.getElementById("iptFfmpegFile")
            Set iptSrcFile = document.getElementById("iptSrcFile")
            FfmpegFilePath = iptFfmpegFile.Value
            SrcFilePath = iptSrcFile.Value
            Rotate = document.getElementById("selRotate").Value
            
            With CreateObject("Scripting.FileSystemObject")
              'ファイルチェック
              If (Len(Trim(FfmpegFilePath))) < 1 Then
                MsgBox "ffmpeg.exeファイルを指定してください。", vbCritical + vbSystemModal
                iptFfmpegFile.Focus
                Exit Sub
              End If
              If .FileExists(FfmpegFilePath) = False Then
                MsgBox "[" & FfmpegFilePath & "]ファイルが見つかりません。" & vbNewLine & _
                       "処理を中止します。", vbCritical + vbSystemModal
                iptFfmpegFile.Focus
                Exit Sub
              End If
              If (Len(Trim(SrcFilePath))) < 1 Then
                MsgBox "変換元ファイルを指定してください。", vbCritical + vbSystemModal
                iptSrcFile.Focus
                Exit Sub
              End If
              If .FileExists(SrcFilePath) = False Then
                MsgBox "[" & SrcFilePath & "]ファイルが見つかりません。" & vbNewLine & _
                       "処理を中止します。", vbCritical + vbSystemModal
                iptSrcFile.Focus
                Exit Sub
              End If
              
              '保存先ファイル設定
              DestFolderPath = .GetParentFolderName(SrcFilePath)
              DestFilePath = AddPathSeparator(DestFolderPath) & _
                             .GetBaseName(SrcFilePath) & FileSuffix & _
                             "." & .GetExtensionName(SrcFilePath)
              'MsgBox DestFolderPath & vbNewLine & DestFilePath '確認用
            End With
            
            If MsgBox("[" & DestFilePath & "]にファイルが保存されます。" & vbNewLine & _
                      "処理を続行しますか?", vbQuestion + vbYesNo + vbSystemModal) = vbNo Then
              Exit Sub
            End If
            '----------------------------------------------
            '※ffmpegに渡すパラメーター、必要に応じて変更
            '----------------------------------------------
            Com = """" & FfmpegFilePath & """ -y -i """ & SrcFilePath & """ -c copy -metadata:s:v:0 rotate=" & Rotate & " """ & DestFilePath & """"
            '----------------------------------------------
            'MsgBox Com '確認用
            CreateObject("WScript.Shell").Run Com, 1, True '変換処理実行
            If MsgBox("変換処理が終了しました。" & vbNewLine & _
                      "(ファイル:" & DestFilePath & ")" & vbNewLine & _
                      "ファイルの保存先フォルダを開きますか?", vbInformation + vbYesNo + vbSystemModal) = vbYes Then
              CreateObject("Shell.Application").Open DestFolderPath
            End If
          End Sub
          
          Private Function AddPathSeparator(ByVal Path)
            Dim ret
            
            ret = Path
            If Right(ret, 1) <> ChrW(92) Then ret = ret & ChrW(92)
            AddPathSeparator = ret
          End Function
        </script>
    </head>
    <body>
        <table>
            <tr>
                <td>ffmpeg.exe:</td>
                <td><input id="iptFfmpegFile" type="file" accept=".exe" size="40" title="ffmpeg.exeファイルを選択します。"></td>
            </tr>
            <tr>
                <td>変換元:</td>
                <td><input id="iptSrcFile" type="file" accept=".mp4" size="40" title="変換元の動画ファイルを選択します。"></td>
            </tr>
            <tr>
                <td>回転角度:</td>
                <td>
                    <select id="selRotate" title="動画の回転する角度を指定します。">
                        <option value="90">90</option>
                        <option value="180">180</option>
                        <option value="270" selected>270</option>
                    </select>
                </td>
            </tr>
            <tr>
                <td colspan="2"><input id="btnExec" type="button" value="変換実行" title="動画ファイルの変換を実行します。"></td>
            </tr>
        </table>
    </body>
</html>

回転処理の実行
HTAファイルの準備が出来たら、いよいよ回転処理の実行です。
- 上記手順で作成したHTAファイルを実行します。
 - 「ffmpeg.exe」横にある「参照」ボタンをクリックして、事前に準備しておいた「ffmpeg.exe」ファイルを選択します。
 - 「変換元」横にある「参照」ボタンをクリックして、回転したい動画ファイルを選択します。
 - 回転角度を指定した後「変換実行」ボタンをクリックします。
 - 確認ダイアログが表示されるので、問題が無ければ「はい」ボタンをクリックします。処理後のファイルは元のファイル名に「_output」が付いた形で、元のファイルと同じ場所に保存されます。
 - 処理終了後の確認ダイアログで「はい」ボタンをクリックすると、ファイルの保存先フォルダが表示されます。
 - 出力されたファイルを再生すると、ちゃんと回転されていることが確認できます。
 











おわりに
フロントエンドといっても単にffmpeg.exeにパラメーターを渡しているだけなので、大したことはしていません。
正直バッチファイルを用意した方が手っ取り早いのですが、コマンドプロンプトでの操作に慣れていない方向けにUIを用意してみました。
WPFあたりでコードを書いた方が簡潔でユーザーフレンドリーなものになったはずですが、“メモ帳だけでも簡単に作れる”点で、今回はHTAを使うことにしました。
(もはや化石ともいえるHTAですが、一応Windows 10 + Internet Explorer 11環境でも動作します。)
参考Webページ
- FFmpeg
 - https://ja.wikipedia.org/wiki/FFmpeg
 - ffmpegの使い方
 - http://tech.ckme.co.jp/ffmpeg.shtml
 - スマホで撮影した映像をffmpegで正しい向きに変換する(+縮小変換)
 - http://qiita.com/naga3/items/639da87ad56c67549eee
 

  















この記事へのコメントはありません。