複数の動画を1本にまとめる(結合する、連結する)方法は、つなぎ方で2つに分かれます。 条件のそろった動画どうしなら、圧縮し直さずにつなげられ、画質は元のまま変わりません。 大きさやフレームレートの違う動画を混ぜるときや、つないだ後に字幕や音を足すときは、動画を書き出し直してつなぎます。
この記事では、2つのつなぎ方の違いと選び方、つなげる前に確かめる条件を説明します。 オープンソースの無料ソフト「ffmpeg」で試験用の動画を実際につなぎ、画質とかかる時間を確かめた結果も紹介します。 後半では、つないだ映像にナレーションと字幕を付けて1本に仕上げる方法を、NoLangの画面で紹介します。
動画を結合する2つのつなぎ方
動画のファイルは、映像と音声を圧縮して保存しています。 2本をつなげるときに、圧縮したデータをそのまま並べるか、いったん元の映像と音声に戻してから圧縮し直すかで、結果が変わります。
| 比べる点 | 圧縮し直さずにつなぐ | 書き出し直してつなぐ |
|---|---|---|
| 画質 | 元の動画のまま | 圧縮し直すぶん変わる |
| かかる時間 | 短い | 動画の長さに応じてかかる |
| つなげる動画 | 条件のそろった動画だけ | 条件の違う動画もつなげる |
| 字幕・音・効果 | 足せない | 足せる |
書き出すときに解像度や画質を選ぶ編集アプリやオンラインのサービスでは、つないだ動画を圧縮し直して保存します。 つないだ後に字幕や切り替え効果を入れる場合も、映像を作り直すので、書き出し直すことになります。
試験用の5秒の動画2本で比べたところ、圧縮し直さずにつなぐ場合は0.1秒もかからず、つないだ動画の映像は元の2本と1コマ残らず同じでした。 同じ2本を書き出し直してつなぐと1.2〜2.1秒かかり、すべてのコマが元とわずかに違うものになりました(詳しくは、このあとの「試した結果」で紹介します)。
目的別の選び方
どちらのつなぎ方を選ぶかは、つなぐ動画の条件と、つないだ後にしたいことで決まります。
- 条件のそろった動画を、画質を変えずに1本にしたい:圧縮し直さずにつなぎます。つなげる前に、次の節の条件がそろっているかを確かめます。手順は「ffmpegで画質を落とさずに結合する手順」で紹介します。
- 縦と横の動画や、フレームレートの違う動画を混ぜたい:大きさとフレームレートをそろえて、書き出し直してつなぎます。手順は「条件の違う動画は書き出し直してつなぐ」で紹介します。
- つないだ映像に、ナレーションや字幕、BGMを付けて仕上げたい:書き出し直してつなぎます。動画を素材として並べ、声と字幕を付けて書き出せるツールを使います。NoLangでの手順は「NoLangで動画をつなげて、ナレーションと字幕を付ける」で紹介します。
つなげる前に確かめる条件
圧縮し直さずにつなげるのは、映像と音声の形式がそろった動画どうしです。 ffmpegの公式ドキュメントも、この方法でつなぐファイルには、同じ種類のデータ(同じコーデックなど)が入っている必要があるとしています。
| 項目 | 例 |
|---|---|
| 映像のコーデック(圧縮の方式) | H.264、H.265 |
| 解像度(縦横の画素数) | 1920×1080、1080×1920 |
| フレームレート | 30fps、60fps |
| 音声のコーデック | AAC |
| 音声のサンプリングレートとチャンネル数 | 48kHz、2チャンネル |
試した範囲では、拡張子が違っても(MP4とMOV)、中の映像と音声の形式がそろっていれば、圧縮し直さずにつなげました。 ファイルサイズ(データ量)が大きく異なる2本でも、上の項目がそろっていればつなげました。
ffprobeで条件を表示する
ffmpegに付いている「ffprobe」で、動画の条件を表示できます。 つなぐ動画ごとに、次のコマンドを実行します(clip-a.mp4は動画のファイル名に置き換えます)。
ffprobe -v error -show_entries stream=codec_type,codec_name,width,height,r_frame_rate,sample_rate,channels -of compact=p=0 clip-a.mp4
試験用の動画では、次のように表示されました。
codec_name=h264|codec_type=video|width=1920|height=1080|r_frame_rate=30/1
codec_name=aac|codec_type=audio|sample_rate=48000|channels=2|r_frame_rate=0/0
1行目が映像で、コーデックはH.264(h264)、解像度は1920×1080、フレームレートは30fps(30/1)です。 2行目が音声で、コーデックはAAC、サンプリングレートは48kHz(48000)、チャンネル数は2です(音声の行の r_frame_rate は使いません)。 つなぐ動画のすべてで、この2行の内容が同じなら、圧縮し直さずにつなげます。
ffmpegで画質を落とさずに結合する手順
ffmpegは、動画や音声の変換と編集をコマンドで行う、無料のオープンソースのソフト(フリーソフト)です。 公式サイトで配布されているのはソースコードで、すぐに使えるビルド済みのもの(Windows・macOS・Linux向け)は、公式サイトのダウンロードのページから案内されている配布先で入手します。 この記事のコマンドは、Linux上のffmpeg 6.1.1で試したものです。
- つなぐ動画を、1つのフォルダに入れます。
- 同じフォルダに、つなぐ順番どおりにファイル名を書いたテキストファイル(ここでは list.txt)を作ります。1行に1本ずつ、
fileに続けてファイル名を'で囲んで書きます。 - そのフォルダで、次のコマンドを実行します。できあがる merged.mp4 が、つないだ動画です。
- merged.mp4 を最初から最後まで再生し、つなぎ目で映像や音が途切れないかを確かめます。ffprobeで長さを表示し、つないだ動画の合計になっているかも確かめます。
list.txt の中身:
file 'clip-a.mp4'
file 'clip-b.mp4'
実行するコマンド:
ffmpeg -f concat -i list.txt -c copy merged.mp4
-f concat は、リストに書いた動画を順に読む指定です。
-c copy は、映像と音声を圧縮し直さずに、そのまま書き出す指定です。
ファイル名に日本語や空白が入っていると、Unsafe file name と表示されて止まります。
その場合は、-f concat -safe 0 -i list.txt のように -safe 0 を加えると実行できます。
試した結果
ffmpegで作れる試験用の映像と音声から、条件の違う5秒の動画を作って試しました。
| 動画 | 条件 |
|---|---|
| clip-a | 1920×1080、30fps、H.264、AAC 48kHz 2チャンネル |
| clip-b | clip-aと同じ条件(映像と音声の中身だけ違う) |
| clip-c | clip-aと同じで、60fps |
| clip-d | clip-aと同じで、縦の1080×1920 |
clip-aとclip-bを上の手順でつなぐと、エラーなしで0.04〜0.08秒で終わりました(4回の実行)。 できた動画は10.02秒で、映像の300コマは、元の2本のコマとすべて同じでした(各コマのハッシュで照合)。 音声のデータも、2本の合計どおり入っていました。
実行中に、音声の時刻についての警告(Non-monotonic DTS)が出ましたが、できた動画の長さと音声のデータは2本の合計どおりでした。
同じ2本を書き出し直してつなぐと、1.21〜2.13秒かかりました。 すべてのコマが元と違うものになりましたが、画質の指標SSIM(1で元と同じ)は0.998で、元とほとんど同じです。 書き出し直しても画質がすぐに目立って落ちるわけではありませんが、つなぐたびに圧縮し直すことになります。
条件の違う動画は書き出し直してつなぐ
縦と横の動画や、フレームレートの違う動画は、大きさとフレームレートをそろえてから、書き出し直してつなぎます。
圧縮し直さずにつなぐと、情報と中身が食い違う
条件の違う動画を上の手順でつなぐと、コマンドはエラーにならず、ファイルはできあがりました。 ただし、ファイルに記録された条件と、中身が食い違いました。
- 30fpsと60fps(clip-aとclip-c):ffprobeでは全体が30fpsと表示されますが、中身は途中から60fpsになっていました。
- 横と縦(clip-aとclip-d):ffprobeでは全体が1920×1080と表示されますが、中身は途中から縦の1080×1920になっていました。
どちらもブラウザ(Chromium)では最後まで再生でき、途中で解像度やフレームレートが切り替わりました。 ffmpegの公式ドキュメントは、この方法でつなぐファイルには同じ種類のデータが入っている必要があるとしているので、条件の違う動画はこの方法でつなぎません。
大きさとフレームレートをそろえて書き出し直す
横の画面(1920×1080、30fps)にそろえて、横の動画と縦の動画をつなぐコマンドです。
ffmpeg -i clip-a.mp4 -i clip-d.mp4 -filter_complex "[0:v]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=30[v0];[1:v]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=30[v1];[v0][0:a][v1][1:a]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" -c:v libx264 -crf 20 -pix_fmt yuv420p -c:a aac -b:a 128k merged.mp4
- scale と pad:それぞれの動画を1920×1080の枠に収まるまで縮め、余ったところを黒で埋めます。
- fps=30:フレームレートを30fpsにそろえます。
- concat=n=2:v=1:a=1:2本の映像と音声を順につなぎます。3本なら n=3 にして、3本目の映像と音声も同じように並べます。
- -c:v libx264 -crf 20:映像をH.264で圧縮し直します。crfは画質の指定で、数字が小さいほど画質を優先します。
試験では、2.21秒の処理で、1920×1080・30fps、長さ10.03秒の動画ができ、縦の動画の部分の左右に黒い帯が入りました。 縦の画面(1080×1920)にそろえるときは、scale と pad の 1920:1080 を 1080:1920 にします。 この場合は、横の動画の部分の上下に黒い帯が入ります。
フレームレートだけが違う動画(clip-aとclip-c)は、fps=30 でそろえてつなぐと、全体が30fpsの動画になりました。
NoLangで動画をつなげて、ナレーションと字幕を付ける
つないだ映像にナレーションや字幕を付けて仕上げたいときは、NoLangで動画を素材として並べる方法があります。 NoLangは、文章や資料、動画などから、ナレーションと字幕の付いた動画を作るサービスです。 動画を素材にする方法は、新規作成で動画を添付する方法と、編集画面でシーンとして追加する方法の2つです。
新規作成で、動画を素材として添付する
手元の動画を添付して、それを素材にした1本の動画を作ります。
- ホームの作り方の一覧で「もっとみる」を押し、「どうやって作りますか?」で「動画から」を選びます。
- 「動画から作る」の「1. 動画を追加して設定」に、つなぎたい動画を追加します。「過去の動画から選択」から、以前にアップロードした動画も選べます。
- 追加した動画ごとに、「文字起こし」と「動画素材」のどちらで使うかを選びます。映像を素材として使う動画は「動画素材」にします。
- 「2. 生成方法を設定」で、作り方を選びます。映像に声を付けるなら「ナレーションをつける」を選びます。選ばずに進めることもできます。
- 「この方法で作る」を押すと、ホームの入力欄に指示文と動画が入ります。作りたい動画に合わせて指示を書き足し、「動画を生成」を押します。
添付した動画の場面をどの順で、どの長さで使うかは、指示に合わせてAIが組み立てます。
編集画面で、動画をシーンとして追加する
NoLangで作った動画の編集画面では、手元の動画を1本ずつシーンとして追加できます。 作った動画の途中や最後に、撮った映像をつなげたいときに使います。
- 編集画面の「読み上げ台本」で、シーンとシーンの間にマウスを重ね、表示される「シーンを追加」を押します。
- 開いたメニューで「動画からシーンを作成」を選びます。
- 「動画を挿入」で、入れたい動画を選びます。一覧にない動画は「ファイルを選択」からアップロードします。
- 「挿入する」を押します。選んだ動画だけのシーンにするときは、「動画だけのシーンとして挿入」を押します。
作例:短い映像をつなげたカフェの紹介動画
架空の喫茶店を題材に、外観、店内、コーヒー、料理、看板メニューの短い映像をつなげ、ナレーションと字幕を付けた約66秒の動画です。 つなげた映像も、NoLangで生成したものです。 最初に看板メニューを予告し、料理の場面ではテンポを上げ、最後に店名と営業時間を出しています。
カフェの紹介動画(店内・料理・外観の映像をつなげる)
店内・料理・外観の短い映像をつなげて、ナレーションと字幕を付けたカフェの紹介動画に。看板メニューを最初に予告し、最後に店名と営業時間を出して。
動画づくりの全体の流れは、動画の作り方で紹介しています。
つないだ後に確かめること
つないだ動画は、書き出したファイルを最初から最後まで再生して、次の点を確かめます。
- 長さ:つないだ動画の長さの合計になっているか。ffprobeでは
ffprobe -v error -show_entries format=duration -of csv=p=0 merged.mp4で秒数を表示できます。 - つなぎ目:前後の動画で音の大きさが急に変わらないか、映像が途切れたり止まったりしないか。
- 縦横:縦と横の動画を混ぜたときに、黒い帯の入り方が意図どおりか。
会社で撮りためた現場や製品の映像を、説明付きの1本にまとめたいなら、NoLangを使う方法もあります。 動画を素材として並べ、ナレーションと字幕の付いた動画を作れます。 会社での使い方はお問い合わせから相談でき、詳しい資料は下のボタンから請求できます。
資料をダウンロード