MKVとMP4に字幕を追加する方法(再エンコードなしで)
MKVとMP4に字幕を追加する方法を、再エンコードなしで解説します。MKVToolNixとFFmpegの手順、1つのファイルに複数言語を収める方法、デフォルトと強制のフラグ、字幕トラックが表示されない原因まで紹介します。
MKVに字幕を追加するのに、再エンコードは必要ありません。字幕を別のトラックとしてmuxすれば済みます。MKVToolNixならGUIで、FFmpegならコマンド1つで実行でき、どちらも映像には手を加えず、ファイルをコピーするのとほぼ同じ時間で終わります。MP4にも字幕トラックは入れられますが、プレーンテキストに限られます。
この記事では、2つのツールの手順を順に説明します。あわせて、言語タグを正しく付けて1つのファイルに複数の言語を収める方法、デフォルトフラグと強制フラグが視聴者の画面にどう影響するか、muxしたトラックが表示されないときのよくある原因も取り上げます。
MKVへの字幕追加に再エンコードが不要な理由
動画ファイルは、独立したストリームをいくつも収めたコンテナで、字幕の追加はそこにストリームをもう1本足すだけです。映像と音声は、動画を作ったときにすでに一度圧縮されています。muxingはmultiplexing(多重化)の略で、コンテナ内の既存のストリームを一切デコードすることなく、追加のストリームをインターリーブして格納する処理です。そのため出力は、ビット単位で元とまったく同じ動画に、字幕トラックが1本加わったものになります。
字幕の焼き込みは、これと反対の処理です。テキストをすべてのフレームに描き込む必要があるため、全フレームをデコードし、文字を描いて、もう一度圧縮することになります。時間がかかり、画質もわずかに落ちますが、配信先が字幕トラックを無視する場合は、それでも焼き込みが正しい選択です。その方法は字幕の焼き込みガイドで解説しています。どちらが必要かまだ決めていない場合は、ハードサブとソフトサブの比較がその判断を手短にまとめています。
Matroska(.mkv)は、ソフトサブという使い方を前提に設計されたコンテナです。映像・音声・字幕のトラックをいくつでも収められ、フォントなどのファイルも添付できます。そして、どのトラックにもそれぞれ固有のメタデータが付いています:
- 言語:
engやspaのようなコードです。プレイヤーはこれを使ってトラックの表示名を決めたり、使うトラックを自動で選んだりします。 - 名前: プレイヤーのメニューに表示される自由入力のテキストです。「English」や「English (SDH)」などが使われます。
- デフォルトフラグ(default flag): 視聴者がトラックを選んでいないときに、プレイヤーが自動でオンにするトラックを示します。
- 強制フラグ(forced flag): 視聴者が字幕をオフにしていても表示されるトラックを示します。外国語のセリフ用です。
この4つを正しく設定することが、作業の大半を占めます。muxそのものは簡単な部分です。
MP4にも字幕トラックを追加できますか?
できますが、MP4が字幕として保持できるのは、プレーンなタイムテキスト形式のmov_textだけです。FFmpegはSRTを取り込む際にこの形式へ変換し、フォント・色・位置指定は引き継がれません。そのためコンテナの選択は、好みの問題ではなく、結果を実際に左右する判断になります:
| MKV | MP4 | |
|---|---|---|
| 保持できる字幕形式 | SRT、ASS、PGSなど | mov_textのみ |
| スタイル(フォント・色・位置) | ASSトラックなら保持される | 失われる |
| フォントファイルを動画に添付できるか | できる | できない |
| 1つのファイルに複数言語を入れられるか | できる | できる、ただしプレーンテキスト |
| Apple標準のプレイヤーで開けるか | 開けるとは限らない | 開ける |
| VLCとmpvで開けるか | 開ける | 開ける |
| トラックの追加に再エンコードが必要か | 不要 | 不要 |
たいてい決め手になるのは、表の中のApple標準プレイヤーの行です。QuickTimeはMKVをまったく開けず、iPhone標準のアプリでも扱いが安定しない一方で、どちらもmov_textトラックはきちんと表示します。そのため、Appleデバイス向けのファイルは、字幕がプレーンテキストになるとしてもMP4にすべきです。VLC、mpv、Plex、Kodiは、MKVをスタイルも添付フォントもそのまま保って再生します。3つ目のケースがブラウザです。ブラウザの動画プレイヤーは、一般に埋め込まれた字幕トラックを無視し、別ファイルのWebVTTを前提としています。形式の比較記事がVTTをWeb向けの形式として扱っているのは、そのためです。
字幕トラックを追加する3つの方法
- MKVToolNix: 無料で、GUIがあり、Windows・macOS・Linuxで使えます。字幕ファイルがすでにある場合に最適なツールです。
- FFmpeg: 無料で、コマンド1つで済み、3つの中でMP4を書き出せる唯一のツールです。スクリプトやバッチ処理に最適です。
- Sablate: 字幕がまだない場合向けです。文字起こしをして、翻訳をレイヤーとして重ね、言語ごとにトラックを持つMKVを1本書き出します。
Subtitle Editでもmuxでき、メニューのVideo → Add/remove embedded subtitlesから実行できます。処理自体は内部でFFmpegが実行します。
方法1: MKVToolNixでMKVに字幕を追加する
MKVToolNixはMatroskaファイルの定番ツールキットで、GUIを使えば作業全体が4つの手順で済みます:
- mkvtoolnix.downloadからインストールします。バージョン102.0は2026年9月14日にリリースされました。macOS版にはmacOS 13 Ventura以降が必要です。
- MKVToolNix GUIを開き、そのままMultiplexerタブで、動画とすべての字幕ファイルをSource filesエリアにドラッグします。字幕ファイルはそれぞれ独立したトラックとして表示されます。
- 字幕トラックを1本ずつクリックし、LanguageとTrack nameの欄に入力します。最初に再生したいトラック1本だけにDefault trackフラグを設定し、ほかのトラックでは外します。Forced displayは、そのトラックが外国語のセリフだけを対象にしている場合を除き、オフのままにしておきます。
- 画面下部で出力先のファイル名を指定し、Start multiplexingボタンをクリックします。
何もエンコードしないため、2時間の映画でも、ファイルをコピーするのとほぼ同じ時間で終わります。同じ作業をコマンドラインで行うと次のようになり、バッチ処理にはこちらを使います:
mkvmerge -o film.subtitled.mkv film.mp4 \
--language 0:eng --track-name 0:English --default-track-flag 0:yes en.srt \
--language 0:spa --track-name 0:Spanish --default-track-flag 0:no es.srt
オプションは、その直後に書いたファイルに適用されます。0は各SRTの中のトラックIDで、SRTには常にトラックが1本だけ入っています。アクセント付きの文字が文字化けする場合、そのSRTはUTF-8ではありません。そのファイルの前に--sub-charset 0:windows-1252(またはそのファイルの実際のエンコーディング)を指定するか、先にUTF-8で保存し直してください。
あとからmuxし直さずにフラグを変更するには、mkvpropeditで既存のファイルをその場で編集します:
mkvpropedit film.subtitled.mkv --edit track:s1 --set flag-default=0 --edit track:s2 --set flag-default=1
track:s1は1本目の字幕トラックを指します。新しいファイルを書き出すのではなく、ファイルのヘッダーを書き換えるので、大きな映画ファイルでもほぼ一瞬で終わります。
方法2: FFmpegで字幕トラックを追加する(MKVとMP4)
FFmpegなら、同じmuxがコマンド1つで済みます。出力をMP4にしなければならない場合は、こちらを使うことになります。英語とスペイン語のトラックを持つMKVを作るには、次のようにします:
ffmpeg -i film.mp4 -i en.srt -i es.srt \
-map 0:v -map 0:a -map 1 -map 2 -c copy \
-metadata:s:s:0 language=eng -metadata:s:s:0 title=English \
-metadata:s:s:1 language=spa -metadata:s:s:1 title=Spanish \
-disposition:s:0 default -disposition:s:1 0 \
film.subtitled.mkv
左から順に読むと、まず入力が3つあります。-mapは、映画から映像と音声を取り込み、続けて各字幕ファイルを順番に取り込みます。-c copyはすべてのストリームをエンコードせずにコピーします。-metadata:s:s:0は出力の1本目の字幕ストリームにタグを付け、2つの-dispositionオプションは英語をデフォルトに指定して、スペイン語のフラグを外します。
-mapを明示的に並べることには意味があります。-map 0をそのまま指定すると、元のファイルにすでにある字幕トラックも取り込まれてしまいます。MP4のmov_textトラックはMKVへそのままコピーできないため、コマンドは何も書き出さないままエラーで止まります。
MP4にする場合は、字幕をmov_textに変換し、それ以外はすべてコピーします:
ffmpeg -i film.mp4 -i en.srt -i es.srt \
-map 0:v -map 0:a -map 1 -map 2 \
-c:v copy -c:a copy -c:s mov_text \
-metadata:s:s:0 language=eng -metadata:s:s:1 language=spa \
film.subtitled.mp4
映像と音声には、今回も手を加えません。書き換えられるのは字幕テキストだけで、MP4の形式に変換されます。入力がスタイル付きの.assファイルの場合、スタイルが失われるのはこの段階です。
スタイル付きのASS字幕はMKVに入れ、フォントを添付してください。そうすれば、プレイヤーは代替フォントではなく、あなたが選んだ書体で字幕を描画します:
ffmpeg -i film.mp4 -i en.ass \
-map 0:v -map 0:a -map 1 -c copy \
-attach Montserrat-ExtraBold.ttf -metadata:s:t:0 mimetype=application/x-truetype-font \
-metadata:s:s:0 language=eng \
film.subtitled.mkv
FFmpegのドキュメントには、Matroskaの添付ファイルにはこのmimetypeタグが必要だと明記されています。mpvとVLCは、ASSをレンダリングするときに添付フォントを読み込むので、スタイルはファイルと一緒に持ち運べます。どの書体を添付するかは、それ自体が別の問題です。字幕フォントのガイドでは、読みやすい書体の選び方と、人気のキャプション用フォントがそれぞれどの文字体系を描画できないかを解説しています。
方法3: 字幕とMKVを1回の作業で作る
MKVToolNixとFFmpegは、字幕ファイルがすでにあることを前提にしています。実際には、まだないことも多いものです。手元にあるのは録画だけで、英語に加えて3言語分の翻訳が必要で、muxはずっと長い作業の最後のほんの数秒にすぎません。Sablateが想定しているのはまさにこのケースで、全工程を1つのアプリの中で完結できます:
- Whisperを使って、自分のパソコン上で動画を文字起こしします。
- エディタで文字起こしの内容を修正します。
- 同じタイミングの上に、言語ごとに翻訳レイヤーを追加します。
- 「Video with switchable subtitles (.mkv)」を書き出します。
ファイルに書き込まれるのは、方法2で手作業で組み立てるものと同じ内容です。映像と音声はストリームコピーされるので、書き出しにかかる時間はファイルをコピーするのとほぼ同じです。言語レイヤーはそれぞれ、あなたのキャプションスタイルを適用した独立したASSトラックになり、フォントはその言語の文字体系を描画できるものに差し替えられます。各トラックには言語タグと分かりやすい名前が付き、1本目のトラックにはデフォルトフラグが設定されます。スタイルにSablate同梱のキャプション用フォントが使われている場合は、そのフォントファイルが添付されるので、別のパソコンでもスタイルが保たれます。
制限は3つ、率直に述べておきます。MKVの書き出しはProの機能で、Proは$29の一度きりの支払いです。価格は料金ページに掲載しています。SablateはMP4の字幕トラックを書き出しません。mov_textではスタイルが失われてしまうためで、MP4が必要な場合は、.srtファイルを書き出して、上で紹介したMP4用のFFmpegコマンドを実行してください。また、書き出しでは元のファイルにあった字幕トラックは保持されず、置き換えられます。それらが必要な場合は、MKVToolNixで追加し直してください。
文字起こしと翻訳の部分は、多言語ワークフローで手順を追って説明しています。
どの方法を使うべきですか?
すでに手元にあるもの(字幕ファイルか、動画だけか)と、ファイルをどこで再生する必要があるかで選びます:
| MKVToolNix | FFmpeg | Sablate | |
|---|---|---|---|
| 価格 | 無料 | 無料 | $29、買い切り(Pro) |
| 対応OS | Windows、Mac、Linux | Windows、Mac、Linux | WindowsとMac |
| インターフェース | GUIとコマンドライン | コマンドライン | GUI |
| 手持ちの字幕ファイルをmuxできるか | できる | できる | 部分的にできる、ジョブへのインポート経由 |
| 音声から字幕を作れるか | できない | できない | できる |
| 字幕トラック付きのMP4を書き出せるか | できない | できる | できない |
| 言語タグとデフォルトフラグを設定できるか | できる | できる | できる、自動で設定 |
| 強制フラグを設定できるか | できる | できる | できない |
| フォントを添付できるか | できる | できる | できる、同梱のキャプション用フォント |
| muxし直さずにフラグを変更できるか | できる、mkvpropeditを使う | できない | できない |
「字幕ファイルはすでにある」 MKVToolNixです。無料で、書き出す前にすべてのトラックとフラグを確認でき、作業は2分で終わります。
「1シーズン分のエピソードを処理したい」 ループの中でmkvmergeかFFmpegを使います。ファイル名に規則性があれば、上のどちらのコマンドも人手をかけずに実行できます。
「iPhoneやQuickTimeで再生できなければならない」 FFmpegでMP4にします。字幕がプレーンテキストになることは受け入れてください。
「字幕はスタイル付きのASS」 フォントを添付したMKVにします。MP4にすると、取り込みの段階でスタイルが取り除かれます。
「手元にあるのは動画だけ」 文字起こし、翻訳、複数トラックのMKVを1か所で済ませたいなら、Sablateです。手順を自分でつなぎ合わせるのが苦にならないなら、無料で使えるSubtitle Editという道もあります。
「YouTubeにアップロードする」 どちらのコンテナも使いません。YouTubeなどのプラットフォームは、.srtや.vttを別ファイルとしてアップロードする形で受け付けます。
MKVの字幕が表示されないのはなぜですか?
ほとんどの場合、トラックはファイルの中にあり、何かがそれを表示しないようにしているだけです。まず、ファイルに実際に何が入っているかを一覧表示します:
ffprobe -v error -select_streams s -show_entries stream=index,codec_name:stream_tags=language,title:stream_disposition=default,forced -of compact=p=0 film.subtitled.mkv
字幕トラックごとに1行が出力され、コーデック、言語、名前、デフォルトフラグ、強制フラグが分かります。トラックが一覧に出ているなら、次の項目を上から順に確認してください:
- どのトラックにもデフォルトフラグが付いていない。 プレイヤーが自動でオンにするトラックがありません。
mkvpropeditで、方法1と同じようにフラグを設定してください。 - プレイヤー側の設定が優先されている。 VLC、Plex、多くのテレビは、優先する字幕言語や字幕オフの設定を保持していて、それがファイル内のフラグより優先されます。ファイルより先にプレイヤーを確認してください。
- すべてのセリフを収めたトラックに強制フラグが付いている。 字幕をオフにした視聴者にも、すべてのセリフが表示されてしまいます。強制フラグを付けるのは、一部のセリフだけを収めたトラックに限ります。
- MP4のトラックが無視されている。
mov_textを黙って読み飛ばすプレイヤーは少なくありません。ファイルをMP4にする必要がなければ、MKVにmuxし直してください。 - アクセント付きの文字が文字化けする。 元のSRTが古いエンコーディングで保存されています。UTF-8で保存し直してから再度muxするか、
mkvmergeの--sub-charset、またはFFmpegで字幕入力の前に置く-sub_charencでエンコーディングを指定してください。 - スタイル付きのテキストがプレーンなフォントで表示される。 ASSトラックが指定しているフォントが、再生するパソコンに入っていません。最後のFFmpegコマンドのように、フォントファイルを添付してください。
字幕を届けるうえで、muxは手間のかからない部分です。MKVToolNixなら1分、FFmpegなら1行で済み、再エンコードも一切ありません。手間がかかるのは、そもそもすべての言語分のきちんとした字幕ファイルを用意することです。すでに手元にあるなら、上で紹介した無料ツールだけで足ります。録画しかないなら、WindowsまたはMac版のSablateをダウンロードして文字起こしと翻訳を行い、トラックとタグとフラグの書き込みは書き出しに任せてください。