MP4結合時の音ズレを防止 「JoinMP4Files 1.0.8.0」

MP4ファイル結合時の音ズレを防止する為のMP4BOXフロントエンドです。

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

1.0.8.1 変更点

・画面表示不具合を修正しました。

1.0.8.0 変更点

・チャプター位置取得を調整しました。

・チャプター名で連番の後ろ部分にも文字列を追加できるように変更しました。

・その他、細かいバグを修正しました。

備考

ツールと無関係ですが、諸事情によりブログのキャッシュプラグインを無効にしました。

スポンサーリンク

シェアする

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

フォローする

スポンサーリンク

コメント

  1. かこん より:

    早速テスト用のMP4ファイルで試したところチャプター位置の取得はうまくいっているようです。

    これから150~200チャプターの結合を試してみます。

    ところでチャプター名の連番の後ろ部分に文字列を追加できるようになってますが、このテキストボックスの位置が英語版Windowsだと「追加ファイルのDurationを指定」と同じ行の本来あったであろう位置の真下に来ています。

    不思議なことに「結合時にコマンド画面を表示しない」直下のバーを上下に動かしてもこのテキストボックスだけは位置が変わりません。固定位置になっているようです。

  2. ぬっき~ より:

    @かこん さま

    早速確認いただきありがとうございます。

    テキストボックスの件は間違えてテスト版のEXEファイルをアップしまいました。
    お恥ずかしい(^ ^;

    修正したバージョンをこっそり公開しておきます。

  3. かこん より:

    @ぬっき~ さま

    今のところ高速モードのみ試していますが、かなり良くなりました。しかし、まだチャプター位置が微妙に前のチャプターに引っかかるところがあるようです。フレーム単位で検査したところ、どうやら半フレーム分くらい手前になってしまっているようです。

    なぜこのようなことが起きるのかについてはまだ良いセオリーが思い付きませんが、一つ気になるのは、問題が起きる該当チャプター前後を単体で結合してもこの問題は起きません。ひょっとすると高速モード特有のなにかかもしれません。

    まずは高速モードを使わなくても起きるか試してみます。ただ、明日から週末まで自宅を離れるので連絡はその後になるかもしれません。

    なお、1.0.8.1でテキストボックスの位置が直りました。ありがとうございました。

  4. ぬっき~ より:

    @かこん さま

    なんともおしい感じですね(^ ^;

    以前と比べると通常モードとのチャプター位置の差はだいぶ小さくしたつもりですが、単体でOKとなるとやはり高速モードのロジックですか・・・

  5. かこん より:

    @ぬっき~ さま

    少し時間が空いてしまいましたが、ようやく時間が出来たので色々試して見ました。

    フレーム単位でタイムスタンプ等を調べていたところ、理由は断定できないですが一つはっきりしたことが分かりました。それはチャプター位置と該当フレームが最大1フレーム近くずれることがあるということです。これはひょっとするとタイムスタンプと実際のサンプルとのマッピングによるものかもしれません。

    試しに1フレーム分後ろにずらすと問題が出ていたMP4ファイルでもチャプター開始位置が全くずれることがなくなりました。

    1フレームの算出方法はmp4boxの映像トラックのMedia Durationをsamplesで割ることで算出しました。例えば、映像トラックがMedia Duration 21:21:57.424の1844148 samplesとなっていた場合、21:21:57.424 / 1844148 = 0.041708…を四捨五入ではなく切り上げて0.042としました。

    この1フレーム分後ろにずらすロジックを既存のロジックに追加することでチャプター位置が該当フレームより手前になることが全くなくなるようです。

    さらに試したところ「高速モードで結合」を有効にしたり、「追加ファイルのDurationを指定」を無効にしたりした時のチャプター位置がずれがちになる問題もこの1フレーム分後ろにずらすロジックを入れると全く問題がなくなるみたいです。

  6. かこん より:

    @ぬっき~ さま

    書きそびれてしまいましたが、この1フレーム分後ろにずらす必要がある問題ですが、高速モード特有の問題ではありません。

    どのモードでも多数のファイルを結合すると起きる場合、なぜか該当チャプターの前後のファイルを2つだけ結合した場合は起きません。

  7. ぬっき~ より:

    @かこん さま

    いつも検証いただきありがとうございます。

    チャプター位置を1フレーム分のミリ秒後方に補正するというワケですか。
    やや力技ではありますが前のキーフレームから再生されてしまうよりは良いかもしれませんね。

    ちなみに少しテストしてみたところ、MP4BOXで結合した場合はdur指定の有無にかかわらずVFRになるようです。
    29.97fpsのファイルを2つ結合したところ、結合ファイルのSamples÷Durationの値は29.97より小さくなりました。

    MP4BOXのInfoではわからない(ダンプ関係は見方がわからない)ですが、MediaInfoで確認すると29.97fps以外のフレームレートが混在しています。
    前半ファイルの末尾部分が調整されているのではないでしょうか。

    微妙にずれるのはこのあたりが何が原因なのかもしれませんね。
    解決策は見当もつきませんが・・・

    ただ、1フレームあたりの秒数は最終的な結合ファイルからではなく、結合元ファイルから都度算出した方がより確実な気がします。多少面倒ですが(^ ^;

  8. かこん より:

    @ぬっき~ さま

    いったい何が正しくて何が間違っているかとは言い切れないところが難しいところですが、確かに1フレームあたりの秒数は結合元ファイルから算出する方が正しいかもしれませんね。

    いずれにしてもMP4BOXとmp4chapsという異なるツールを使い、処理の詳細が分からない状態でフレーム単位ではなく時間単位で位置を指定しなければならないという事そのものにそこまでの精度を要求する方が無理なのかもしれません。

    ただチャプター位置そのものはそこまでの精度は必要ないとは言え、数秒も前のキーフレームから再生されてしまうというのはちょっと残念なので力技で対応するしかなさそうです。

  9. ぬっき~ より:

    @かこん さま

    たしかに動画の世界は難解ですね・・・

    おっしゃるとおりチャプターに関してはそこまで精度を要する内容ではありませんし、個人的に力技も嫌いではないのでここは押し切りましょうw

    ということで修正版を公開してみました。

    以前強制的に3ms調整していた部分を削除して、かわりに1フレーム換算の秒数(Duration÷Samples)を加算しています。

  10. かこん より:

    @ぬっき~ さま

    修正版公開ありがとうございます。早速試してみます。

    ところで1フレーム換算の秒数ですが、ms以下は切り捨てではなく切り上げ(例:ceil関数)になっていますでしょうか?

    それから3ms調整の部分ですが、基準としている時間(前半部分に指定するDuration、後半部分に指定するDurationもしくは映像Duration、結合後の映像Duration)がms単位なので、mp4boxの内部処理が暗黙的に行う切り捨てもしくは切り上げに依存することとなります。この場合、運が悪いと問題になる可能性は依然として存在すると思います。

    今までの経験からチャプター位置が後ろになる分には例え1msでも前になるより問題が圧倒的に少ないのでなるべく後ろにずらす処理は残しておいた方が安全かと思います。

    今後さらに変更・修正をされる場合はこの2点を考慮していただけないでしょうか?
    実質的には1フレーム調整でまず問題は出なくなると思いますが、どうも経験上気になってしまいまして申し訳ありません。

  11. かこん より:

    @ぬっき~ さま

    1.0.9.0を試してみました。動作は完璧だと思います。
    1フレーム調整も切り捨てではなく切り上げになっているようですね。

    3ms調整の部分に関してあれから考えてみたのですが、確かに理論的には起きなくは無いと思いますが、実際に対象フレームが1フレーム分めいっぱいこちらに不利な方向にずれて、しかも各Duration値も全てこちらに不利になるように切り捨てか切り上げが行われるような事が全部同時に発生する確率は恐らくありえないといえるくらい低い確立になるそうなのでそこまで心配する必要はない気がしてきました。

  12. ぬっき~ より:

    @かこん さま

    ようやくご期待に沿う結果がだせてひと安心です(^ ^;

    念の為、どうしても気になる・ずれが生じる場合に微調整できるように、全チャプターに対する調整量は設定ファイル「JoinMP4Files.xml」に隠しパラメータとして設定してあります。

    ①調整ミリ秒数 ChapterAdjustMilliSeconds(デフォルト0)
    ②調整フレーム数 ChapterAdjustFrames(デフォルト1)

    たとえば①=3&②=0にすれば、前バージョンと同じ処理になるはずです。
    (②については前記の通りDuration÷Samplesの換算値です。)

    なお、起動時に読み込むので書き換えた場合はJoinMP4Filesを一旦終了して再起動してください。

    もちろんうまくいくかどうかは結合元ファイルのGOP長次第ですが・・・

  13. かこん より:

    @ぬっき~ さま

    隠しパラメーターですか、それは良いアイデアですね。

    ところでそのパラメーターですが、当方ではChapterAdjustMilliSecondsのデフォルトが3になっています。

    JoinMP4Files.xmlを一旦削除してから起動・終了させてもう一度このファイルを作らせてもやはりこの値は3になっています。

    作成されるチャプターファイルを見てみてもやはり1フレーム調整と3ms調整が両方行われているようです。

    どうやら3ms調整の部分を削除し忘れてしまったという事でしょうか?

    それはそれで隠しパラメーターで変更できるのでデフォルトでは最悪の状態を想定しているということで、このままで良いかと思います。

  14. ぬっき~ より:

    @かこん さま

    ChapterAdjustMilliSecondsですが、確認したところソースでもデフォルトが「3」になっていました。「0」にするつもりで抜けていたようです・・・

    おっしゃるとおり3msシフトさせても問題はないと思われるので、このままにしておくことにします(^ ^;