MKV(Matroska)をMP4に変換したいだけなら、再エンコードは不要です。コンテナだけ差し替える「リムックス」なら数秒で完了・画質音質ゼロ劣化・ファイルサイズほぼ同じ。この記事ではコマンド1行のやり方から、MKVにしか格納できない要素があって失敗するパターン、その回避策までまとめます。所要時間:8分。
動作確認: FFmpeg 6.1 / Windows 11 / Ubuntu 24.04
この記事でわかること
- リムックス(コンテナ変換)と再エンコードの違い
- 基本コマンド:1行でMKV→MP4
- 失敗する3つの典型パターンと解決策
- 音声だけ再エンコードする折衷案(最小限のコスト)
-movflags +faststartの役割- 複数音声・字幕トラックを扱う方法
- FAQ
1. リムックスと再エンコードの違い
| 処理 | 映像・音声データ | 所要時間 | 画質・音質 | ファイルサイズ |
|---|---|---|---|---|
リムックス(-c copy) | そのままコピー | 数秒〜数十秒 | 完全に同じ | ほぼ同じ |
| 再エンコード | デコード→再圧縮 | 数分〜数時間 | わずかに劣化 | 指定次第で増減 |
MKVもMP4も「コンテナ」であり、中身(H.264・H.265・AAC など)は同じ場合が多いです。コーデックが両方のコンテナで対応していれば、再エンコードせずに包装紙だけ替えられます。
2. 基本コマンド
ffmpeg -i input.mkv -c copy -movflags +faststart output.mp4
-c copy… 全ストリームを再エンコードせずコピー-movflags +faststart… moov atom を先頭に移動(Web再生・ストリーミング用途に必須)
コーデックがMP4対応(H.264、H.265、AAC、AC-3、MP3など)であればこれで完了します。
3. 失敗する3つの典型パターン
パターン1: 字幕形式が非互換
症状:
[mp4 @ 0x...] Could not find tag for codec subrip in stream #2, codec not currently supported in container
原因: MKVには SRT / SSA / ASS などテキスト字幕が含まれることが多いが、MP4は mov_text(tx3g) しか受け付けない。
解決策 A — 字幕だけ変換:
ffmpeg -i input.mkv -c:v copy -c:a copy -c:s mov_text -movflags +faststart output.mp4
解決策 B — 字幕を落とす:
ffmpeg -i input.mkv -c copy -sn -movflags +faststart output.mp4
-snは字幕ストリーム(subtitle)を出力しないフラグ。画像字幕(PGS・VobSub)はmov_textに変換できないため、この方法で省くのが確実です。
パターン2: 音声コーデックが非標準(PCM / FLAC / OPUS等)
症状:
[mp4 @ 0x...] Could not find tag for codec pcm_s16le in stream #1
原因: MKVには PCM・FLAC・Opus・Vorbis などを格納でき、古いMP4リーダーが対応していない。最新のMP4仕様では Opus/FLAC も対応ですが、QuickTime など一部プレーヤーは未対応。
解決策 — 音声だけAACに再エンコード:
ffmpeg -i input.mkv -c:v copy -c:a aac -b:a 192k -movflags +faststart output.mp4
映像はそのまま・音声だけAAC化。処理時間は再エンコード全体の数十分の一で済みます。
パターン3: 映像コーデックがMP4未対応(VP9 / AV1 等)
症状: 一見成功するが、対応プレーヤーが少なく再生できない。
原因: VP9 / AV1 はMP4コンテナに「技術的には」格納可能(fMP4)だが、Windows標準の「映画 & テレビ」や古いiPhoneでは再生できないことが多い。
解決策 A — H.264に再エンコード(互換性最優先):
ffmpeg -i input.mkv -c:v libx264 -crf 20 -preset slow -c:a aac -b:a 192k -movflags +faststart output.mp4
解決策 B — コンテナをMP4にしつつ映像VP9のまま(fMP4、新しい環境向け):
ffmpeg -i input.mkv -c:v copy -c:a aac -b:a 192k -movflags +faststart output.mp4
AV1 / VP9 は保持して再生環境を選びたい場合、WebMへのリムックスも選択肢です:
ffmpeg -i input.mkv -c copy output.webm
4. 音声だけ再エンコードする折衷案(最も実用的)
実務では「映像はそのまま、音声だけは揃えたい」ケースが最多です。映像再エンコードが最もコストの高い部分なので、映像は-c:v copyのままキープし、音声だけ aac に変換するのが無難です。
ffmpeg -i input.mkv \
-c:v copy \
-c:a aac -b:a 192k \
-c:s mov_text \
-movflags +faststart \
output.mp4
この1コマンドで、映像・音声・テキスト字幕をすべてMP4互換にできます。
5. -movflags +faststart は必須か
| 用途 | +faststart の必要性 |
|---|---|
| ローカル再生のみ | 任意(あっても悪影響なし) |
| Web配信・ストリーミング | 必須(ない場合、動画末尾までダウンロードしないと再生開始できない) |
| SNS・Discord・Twitter に投稿 | 必須 |
| スマホ・古いプレーヤー互換 | 強く推奨 |
MP4の moov atom(インデックス情報)はデフォルトで末尾に書かれます。+faststart はこれをファイル先頭に移動するため、ブラウザが最初のバイトからストリーミング再生できます。
6. 複数音声・字幕トラックを扱う
全トラックをまとめてコピー
ffmpeg -i input.mkv -map 0 -c copy -movflags +faststart output.mp4
-map 0 で入力0の全ストリームを出力にマッピングします。
特定の音声・字幕だけ残す
# 映像(0:v)と日本語音声(0:a:1、インデックス1)と日本語字幕(0:s:ja)だけ抽出
ffmpeg -i input.mkv \
-map 0:v:0 -map 0:a:1 -map 0:s:m:language:jpn? \
-c copy -c:s mov_text \
-movflags +faststart output.mp4
? 付きの -map は「該当トラックがなくてもエラーにしない」指定です。存在不明な字幕ストリームを安全に参照できます。
ストリームの構成を事前に確認するには
ffprobe input.mkvを使うか、FFprobeで動画メタデータを調べる方法を参考にしてください。
7. トラブルシューティング
エラー1: Could not find tag for codec X in stream Y
原因: その場所のコーデック(映像 or 音声 or 字幕)がMP4未対応。
解決策: 該当ストリームだけ再エンコードするか、-sn/-an で落とす。
エラー2: 出力ファイルが再生できない(真っ黒・音なし)
原因: -c copy でVP9やAV1をMP4に包んだが、プレーヤーが未対応。
解決策: ffprobe input.mkv でコーデックを確認し、H.264に再エンコード。
エラー3: ファイルが1時間で切れる(長尺)
原因: 32bit FFmpeg環境 × MKVの特殊タイムスタンプ(PCR wrap 問題)。
解決策: 64bit公式ビルドに差し替える。Windowsなら gyan.dev の ffmpeg-full をダウンロード。
エラー4: 字幕が文字化けする
原因: SRTファイルのエンコードがShift-JISで、UTF-8に変換されないまま mov_text に詰められた。
解決策: 事前に iconv などでUTF-8化する。
iconv -f SHIFT-JIS -t UTF-8 subtitle.srt > subtitle_utf8.srt
ffmpeg -i input.mkv -i subtitle_utf8.srt -c:v copy -c:a copy -c:s mov_text output.mp4
エラー5: リムックス後のファイルサイズがより大きい
原因: MKV側で使われていた packed B-frames などを MP4側で展開した結果、少量増える場合がある。通常±5%程度。
解決策: サイズ差が問題になる場合のみ、映像を軽く再エンコード(-c:v libx264 -crf 20 -preset medium)。
FAQ
Q1. リムックスで画質は本当に劣化しない?
A. はい、-c copy はビットストリームをそのままコピーするため、1ビットも変わりません(再エンコードのような損失は発生しない)。タイムスタンプやヘッダのみが書き換わります。
Q2. MP4→MKVの逆方向も同じコマンド?
A. ほぼ同じ:ffmpeg -i input.mp4 -c copy output.mkv。MKVはほぼ何でも受け入れるので、コーデック互換性のトラブルはMP4→MKVの方が少ないです。
Q3. 複数MKVをまとめてMP4にリムックスするには?
A. シェルループで十分高速です:
for f in *.mkv; do ffmpeg -i "$f" -c copy -movflags +faststart "${f%.mkv}.mp4"; done
バッチ変換の詳しい記事もどうぞ。
Q4. MP4よりMKVの方が良い点は?
A. MKVは字幕・音声トラック数の制限が緩く、Opus・FLAC など損失ない音声や PGS画像字幕 を格納できます。編集ソースや保存用途にはMKVが適しています。配布・Web再生なら MP4 が無難です。
Q5. MacのQuickTimeで再生できません
A. H.265の hvcC タグ問題か、音声がMP3以外の場合の互換問題が多いです。-tag:v hvc1 で解決することが多い → iPhone MOV/MP4変換ガイド参照。
関連リソース
FFmpeg チートシート(PDF):リムックス・コピー・コンテナ変換のよく使うコマンドをA4一枚に。
関連記事
- FFmpegでMP4を圧縮する方法(CRF・ビットレート解説)
- iPhone MOV を MP4 に変換する完全ガイド(hvc1タグ問題)
- FFprobeで動画メタデータを調べる方法
- シェルスクリプトでバッチ変換を自動化する
動作確認: ffmpeg 6.1.1 / Windows 11 + Ubuntu 24.04
一次ソース: ffmpeg.org/ffmpeg.html / ffmpeg.org/ffmpeg-formats.html / trac.ffmpeg.org/wiki/Map