MP4結合時の音ズレを防止

昨今では動画形式のデファクトスタンダードの一つになりつつあるMP4。

年に数回しかいぢる機会はないんだけど、そういう時に限ってトラブルが起こるもの。
先日2つのMP4ファイルを結合したところ見事に音ズレ・・・

結合前のファイルでズレは発生していないので結合時に問題があるみたい。
結構有名なフリーソフト使ったんだけどなぁ・・・

いつものようにググってみると割と多い症状らしく情報はタップリありました。

てか、これだけ普及してるのに多いんだ・・・
私がMP4を過大評価してるだけなのか?(全然詳しくはないんだけどw)

さて、原因としては映像と音声の長さが微妙に違うことが原因らしい。

「そんなの俺のせいじゃねーよ。」

出かかった言葉を飲み込みつつ、再エンコードなんて嫌なので無劣化での結合方法を探してみる。

単に結合する為だけに大袈裟なアプリをインストールするまでもない。
やはりMP4BOXを使った方法がベストのようです。

ネット上の情報によると・・・

A.mp4B.mp4 を結合する場合、

MP4BOXでA.mp4のトラック情報を取得。

MP4BOX -info “A.mp4”

出力結果からDurationの短い方を取得。
(出力結果から必要部分のみ抜粋)

Track # 1 Info – TrackID 1 – TimeScale 24000 – Duration 00:29:02.574
Track # 2 Info – TrackID 2 – TimeScale 48000 – Duration 00:29:02.741

この場合は 00:29:02.574

同様にMP4BOXでB.mp4のトラック情報を取得。

MP4BOX -info “B.mp4”

出力結果からDurationの短い方を取得。

Track # 1 Info – TrackID 1 – TimeScale 24000 – Duration 00:28:54.566
Track # 2 Info – TrackID 2 – TimeScale 48000 – Duration 00:28:54.741

この場合は 00:28:54.566

それぞれの短い方のDurationを指定して結合。(AB.mp4として保存)

MP4BOX -new “AB.mp4” -add “A.mp4:dur=00:29:02.574” -cat “B.mp4:dur=00:28:54.566”

ひょっとするとA.mp4のDuration指定だけでもいいのかもしれない。
まあ両方やっておけば大丈夫かな~と。

ただ、例えば3つ結合しようとした場合に

-new “ABC.mp4” -add “A.mp4:dur=???” -cat “B.mp4:dur???” -cat “C.mp4:dur=???”

というのはダメらしい。

正しくは先の例で作成したAB.mp4C.mp4を結合する必要があるらしい。

ということは、4つの場合は、

A.mp4 + B.mp4 => AB.mp4
AB.mp4 + C.mp4 => ABC.mp4
ABC.mp4 + D.mp4 => ABCD.mp4

という3段階を踏まねばならん。

メンドクセーーー

と、いうワケで「なんちゃってツール」作ってみました。
もはやバッチファイルで処理するより.NETで書いた方がわかりやすい。

JoinMP4Files1.0.2.0を別エントリーで紹介しています。

JoinMP4Files1.0.1.0(2013/04/29修正版)

JoinMP4Files(旧版)

ダウンロードはこちらから。

上の「4つの場合」の動作を自動化するだけのGUIツールになります。
ちゃんとしたトコロに公開する程のシロモノでもないのでここに放置。

使い方はMP4BOXと同じフォルダに置いて起動するだけ。
あとは見ての通り。

自己責任でよければお使いくださいw

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク

コメント

  1. 匿名 より:

    上記ソフト大変助かりました。
    他のソフトではどうしても音ずれが出てしまいこまっていたところです。

  2. ぬっき~ より:

    @匿名 さま

    コメントありがとうございます。

    拙作のツールというよりはMP4BOXが優秀なのですが、お役に立ててなによりです。

  3. Nezu より:

    はじめまして、Nezuと申します。MP4の動画を結合する際にこちらのソフトを使わせて頂きました。画質の劣化や音ずれが無く無事に結合出来ました、本当にありがとうございました。

    元々はMP4BOXで結合しようと思っていたのですが、動画が全部で4つあり、コマンドの入力がややこしく使いこなせなくて困っていた所でしたので本当に助かりました。

    今後もMP4を結合する際にはこちらのソフトにお世話になりたいと思います。素晴らしいソフトをありがとうございました。

  4. ぬっき~ より:

    @Nezu さま

    コメントありがとうございます。

    コマンドそのものは難しくないのですが、やはり「面倒」の一言に尽きますよね。。
    私も同じ理由で作った次第ですのでご活用ください。

  5. えいじ より:

    40個に分割ダウンロードされたFLVをMP4に変換し、それを結合しました。もう腹話術の世界です。しかしこれを使ってしまえば完璧に結合できました。正直あなたは天才ですか?と思いました。

  6. ぬっき~ より:

    @えいじ さま

    コメントありがとうございます。

    お役にたてて何よりです。

    すべてはMP4BOXの機能と結合方法を発見された方のお手柄です。
    私は処理を自動化しただけですので(^ ^;

  7. yama より:

    初めまして、こちらの記事を参考にさせていただきました
    ありがとうございました

    当方では、バッチ処理で日常のエンコ作業を行っているため、こちらで作成しておられるソフトは使用させていただけませんでしたが、バッチファイルを作成して自動化してみました。

    ところで記事中に

    >ただ、例えば3つ結合しようとした場合に
    >(略)
    >というのはダメらしい。

    と言及されてますが、当方では一見問題がないかのように結合が完了しています。具体的にはどんな不具合があるのか、教えていただければ幸いです。

    当方で使用しているmp4boxは
    http://pop.4-bit.jp/bin/MP4Box_0.4.6-r3531.zip

    コマンドは
    mp4box.exe -add “a01.mp4″#:dur=1234.567 -cat “a02.mp4″#:dur=1357.246 -new “a.mp4”
    のように記述しています

  8. yama より:

    重ねてコメント失礼します
    少し訂正させてください

    先のコメントでのコマンドの「記述」のでは -cat 部分のファイルが1つになっていますが、実際には -add 部分と合わせて5つのファイルを結合させております。

    失礼しました

  9. 私にとっての神、それがあなた より:

    本気で泣きそう、こんな素晴らしいもの作ってくれてありがとう(泣)
    制作期間3ヶ月の自作動画がやっと完成し、あとは結合して完成!!ってところで
    まさかの音ズレ・・・、
    なんとかしようと調べて調べて試行錯誤。
    でも皆の言ってる事がさっぱり分からないんだな、これが
    いきなりC:\users\とか言ってくるんすもん、さっぱりですわ

    でもね、こんな僕にも神はいたんですよ、ここにね

    難しいことはさっぱりだけど、私の求めていたそのものですよこれは
    音ズレ解消の為に費やした労力は一体?みたいな感じもあるけども!
    これに出会えてなかったら俺は死んでいたのもまた確か!

    あなたは神!感謝感謝!!!
    ちなみに私の結合する予定だったファイルは53個…、この訪れによる絶望たるや

  10. ぬっき~ より:

    @yama さま

    コメントありがとうございます。

    本来MP4BOXで複数ファイルを一度に結合することは問題ありません。

    ただし音ズレが発生するファイルをまとめて結合すると Duration を指定しても修正されないことがあるという意味で文中では「ダメらしい」と表現しました。

    その場合は記事の通り後方に1つずつ結合することで解消されるのですが、バッチ処理ですとファイル名の処理が煩わしいので.NETで自動化・汎用化した次第です。

    音ズレはMP4BOXの処理が起因となる問題ではなく、結合元ファイルの映像と音声の長さが微妙に違うことが原因のようなので、結合元ファイルに問題がなければ複数ファイルを一度に結合しても不具合は生じないかもしれません。

    とは言え、私も某掲示板や他の方のブログなどを参考にして軽く検証した程度なのですけどね(^ ^;

  11. ぬっき~ より:

    @私にとっての神、それがあなた さま

    コメントありがとうございます。

    3ヶ月の集大成の最後で音ズレとかヘコみますね・・・

    どちらかと言うとMP4BOXが神というかド定番ツールなワケですが、コマンドラインに慣れていないと確かに不便ですね。

    結合するだけであれは無料のソフトを使いたいですし、自分も音ズレに困った経緯で自動化ツールを作成しておいたのですが、お役に立ててなによりです。

    自作動画頑張ってください!

  12. yama より:

    早速のお返事ありがとうございました

    なるほど、納得致しました
    参考にさせていただいて、バッチファイルをそのように書き換えたいと思います
    某掲示板の方もチェックしてみます

  13. rtokiwa より:

    こんにちは

    JoinMP4Files+ mp4box 0.4.4でズレなくうまく出来ましたが、個数が多いと非常に時間が掛かりますね。mp4box 0.5 では正常に連結できませんでした。
    seraphyのプログラム公開所で公開されているmp4catというソフトを使うとかなり速くズレもなく連結出来ました。ご参考までに。

  14. ぬっき~ より:

    @rtokiwa さま

    コメントありがとうございます。

    基本的にはただのフロントエンドなので処理速度はMP4BOXに依存しますが、音ズレ防止として本文中のような反復処理が必須ですから数が多いとどうしても時間がかかりますね・・・

    コンテナ内のコーデックやフォーマットによって得手不得手がありますし、常用のツールでうまくいかなかった場合のお試し用というコトでお願いします(^ ^;

    MP4BOX 0.5 での動作不具合の件ですが、当方で確認してみたところGPACの版ですとNightly Builtを含め問題ないようでした。

    http://gpac.wp.mines-telecom.fr/downloads/

    ただし、有志の方がビルドされた版においてコマンドラインの結果が標準出力ではなく標準エラーに出力されているものがありました。

    この場合、標準出力のみをリダイレクトして解析している拙作のツールでは正常に結合できませんでしたので修正しておきます。

    ご報告ありがとうございました。

  15. HIROKAZU より:

    MP4Box -info “A.mp4”
    [Durationの短い方を取得]
    MP4Box -new “AB.mp4” -add “A.mp4:dur=**:**:**.***” -cat “B.mp4”

    MP4Box -info “AB.mp4”
    [Durationの短い方を取得]
    MP4Box -new “ABC.mp4” -add “AB.mp4:dur=**:**:**.***” -cat “C.mp4”

    MP4Box -info “ABC.mp4”
    [Durationの短い方を取得]
    MP4Box -new “ABCD.mp4” -add “ABC.mp4:dur=**:**:**.***” -cat “D.mp4”

    MP4Box -info “ABCD.mp4”
    [Durationの短い方を取得]
    MP4Box -new “ABCDE.mp4” -add “ABCD.mp4:dur=**:**:**.***” -cat “E.mp4”

    上記のやり方のほうが音ズレがさらにに少なくなると思われますし、
    結合に掛かる時間も少なくなると思われます。
    また、映像と音声の短いほうに合わせてカットする量も減ると思われるのですが、
    私の認識が間違っておりますでしょうか?

  16. ぬっき~ より:

    @HIROKAZU さま

    コメントありがとうございます。
    Akismetにはじかれてスパムに埋もれており発見するのが遅くなりました。すみません。

    さて、Duration指定の件ですが「両方やっとけばいいかなー」くらいのノリでした。

    生憎手頃な音ズレ素材が手元にないのですが所要時間の方は検証してみました。
    以下、1.5GB程度のMP4ファイル2つを結合するのに掛かった時間です。

    MP4Box -new “AB.mp4″ -add “A.mp4:dur=***” -cat “B.mp4″ => 2分12秒
    MP4Box -new “AB.mp4″ -add “A.mp4:dur=***” -cat “B.mp4:dur=***″ => 2分23秒

    たしかに追加するMP4ファイルのdurをしない方が若干早いようです。

    お恥ずかしながら動画関係はあまり詳しくないので恐縮です。
    参考にしつつ折をみてツールの方にも反映させてみます。

    ちなみに記事中で「ひょっとするとB.mp4のDuration指定だけでもいいのかもしれない。」と
    ウソこいておりましたのでひっそりと「A.mp4」に修正させていただきました。。

  17. misamisa より:

    とても使いやすく重宝させて頂いています。
    欲を言えば、結合するmp4ファイルにチャプターを作る事ができたら、ありがたいです。
    お時間と気が向いたらでいいので、機能を追加してほしいです。

    本当は自分もこのような、GUIツールを作れたらいいんですけどね^^
    プログラム未経験の人は何から覚えればいいのでしょうか?
    お勧めのプログラム言語がありましたらアドバイスを宜しくお願いします。

  18. ぬっき~ より:

    @misamisa さま

    コメントありがとうございます。

    結合点に自動でチャプター追加ぐらいであればできると思うので検討してみます。
    (どのみち mp4box.exe か mp4chaps.exe をバックエンドにするでしょうけど・・・)

    開発言語は用途によって使い分けている人が多いと思いますよ。

    汎用性が高いのはやはりC言語ですが、Windowsで簡単なGUIツールということであれば C# や VB.NET あたりでしょうか。

    VisualStudioのExpressが無料で使えますし、WEBで検索すればTIPがたくさんあって重宝します。

    最初は短めのサンプルプログラムを色々真似してみて、文法やデータ型などの基本を反芻しながら身につけるのがいいかもしれませんね。

  19. 白旗march より:

    はじめまして。
    制作されたソフトの方、ダウンロードさせて使わせていただきました。

    わたしも他の皆さんと同様、動画制作の完成間際でこの音ずれ問題にぶちあたり、
    またMP4BOXのコマンド(?)←(すみません、勉強不足でわかっていません・・・。)
    も理解できず、四苦八苦していたので、
    日本語で、しかも自動で処理してくれるこのソフトに
    とてもとても助けられました。バッチリ完成させることができました。

    本当にありがとうございます!!!!!感謝しています!!

    なお、返信はお気になさらず!ただ感謝です。

  20. ぬっき~ より:

    @白旗march さま

    コメントありがとうございます。
    無事に動画が完成して何よりです(^ ^)

    コマンドはコマンドで便利な点もあるのですが、ちょっとした利用の際には面倒なのも確かですね。。

    丁度、コメント欄で皆様にいただいたリクエストや不具合を修正した版をこちらで公開したところでした。

    また結合をされる際にはお試しください。

  21. みなを より:

    ツールに大変お世話になっております。
    私は類似名のmp4ファイルの結合を行うc#プログラムを作成しようとしているのですが、mp4boxの呼び出しができずにいます。
    Dosコマンドをprocessを使って実行しようとしているのですが、うまく行きません。
    そこで、不躾なお願いではありますが当該箇所なのソースをご教示いただけませんか。
    是非ともよろしくお願いいたします。

    もしソースをいただけると大変ありがたいです。

  22. ぬっき~ より:

    @みなを さま

    コメントありがとうございます。

    C#でProcessを使ったMP4BOXの呼び出しとのコトですが、私はスタンダードな方法でやっています。

    string filename = @"C:\MP4BOX\MP4BOX.EXE";
    string command = @"-info ""C:\MP4BOX\sample.mp4""";
    
    using (Process p = new Process())
    {
    	p.StartInfo.FileName = filename;
    	p.StartInfo.Arguments = command;
    	p.Start();
    	p.WaitForExit();
    }
    

    「C:\MP4BOX\sample.mp4」の情報を表示させる例として、基本的にはこんな感じです。

    ソースについてはだいぶ書きなぐっている状態なので、人様にお見せするのははばかられます・・・
    申し訳ありません(^ ^;

    それではツール作成頑張ってください!

  23. みなを より:

    @ぬっき~
    ありがとうございます。
    どうやらwaitforexit と stopの順番という初歩的なミスだったようです。

    ただ、cmd.exeを起動したり、色々試していたので確実な方法がわかって大変感謝しております。

    ありがとうございます。

  24. ぬっき~ より:

    @みなを さま

    解決して何よりです。

    Processまわりのプチ情報ですが、リダイレクトなどを使用したい場合はcmd.exeを使用する必要があります。(例:mp4box.exe -info “aaa.mp4” > “aaa.txt” 2>&1)

    また、連続的に処理が必要な場合は動的にバッチファイルを出力してProcessで実行させるという手もあります。JoinMP4Filesでもチャプター処理の部分で実際にやっています。

    こうやって手法を考えながらプログラミングするのは(嫌いでなければ)楽しいと思いますので頑張ってください。

  25. ぽちゃ より:

    久しぶりに訪問させて頂きました。
    ・cmd window 非表示で、こんなに速くなるんですね
    ・ListBox へ大量に D&D すると、あとで順番入れ替えが大変
    FileSystemObject とかの標準仕様なのですが・・・
    →実装依存ですが、ArrayList.Sort なんて、どうでしょうか?
    ・(詳細未確認)大量ファイルを Chapter 付き指定で連結すると、末尾は
    Chapter が付かないかも?、です。
    26 ファイル結合で、25~26 間に Chapter が付かない?、使用ミスかも、
    「普段 Chaper は付けない派」ですし、こんな馬鹿な使い方しないでしょ。
    一応、ご報告まで。

  26. ぬっき~ より:

    ぽちゃ 様

    コメントありがとうございます。

    コマンド画面はいちいちフォーカスを持っていかれるので邪魔なんですよね。。

    並び替えについてはファイル名でソートであればできると思うので検討しておきます。

    最後のチャプターについてですが、26個のファイルで試してみたところ問題なく作成されていました。チャプター追加時のダイアログをキャンセルするとチャプター時間が書かれたテキストファイルが作成されるのですが、そちらにも問題はないようでした。

    ただ、今回は同一ファイルを26個複製したものを結合する簡易的なテストでしたので、うまくDurationが取得できないような動画が含まれている場合は妙な動作をするかもしれません(^ ^;