MKV(Matroska)をMP4に変換したいだけなら、再エンコードは不要です。コンテナだけ差し替える「リムックス」なら数秒で完了・画質音質ゼロ劣化・ファイルサイズほぼ同じ。この記事ではコマンド1行のやり方から、MKVにしか格納できない要素があって失敗するパターン、その回避策までまとめます。所要時間:8分。

動作確認: FFmpeg 6.1 / Windows 11 / Ubuntu 24.04


この記事でわかること

  1. リムックス(コンテナ変換)と再エンコードの違い
  2. 基本コマンド:1行でMKV→MP4
  3. 失敗する3つの典型パターンと解決策
  4. 音声だけ再エンコードする折衷案(最小限のコスト)
  5. -movflags +faststart の役割
  6. 複数音声・字幕トラックを扱う方法
  7. 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.devffmpeg-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 6.1.1 / Windows 11 + Ubuntu 24.04
一次ソース: ffmpeg.org/ffmpeg.html / ffmpeg.org/ffmpeg-formats.html / trac.ffmpeg.org/wiki/Map