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

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

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

変更点

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

・高速モードのチャプター位置精度を向上させました。

・高速モードでチャプターを自動追加しない場合の処理を高速化しました。

・チャプター名を連番指定できるようにしました。

・設定のデフォルト値を変更しました。

備考

Duration取得の内部処理を少し変更したのでバグがあるかもしれません(^ ^;

結合結果が芳しくない場合は旧バージョンもお試しください・・・

スポンサーリンク

シェアする

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

フォローする

スポンサーリンク

コメント

  1. かこん より:

    早速1.0.7.0を試してみました。

    150チャプターと200チャプターのファイルを高速モードで結合したところ全てのチャプターではないですが、確認した限りだと完璧に機能しています。

    そこで3つめの50チャプターのファイルを高速モードで結合してみたのですが、こちらは以前と同様に、ただし全てではなくその一部でチャプター位置が依然ずれているためかiPhoneだと数秒手前から再生されてしまいます。

    ひょっとすると高速モードに問題があるかもと思い、今高速モードを無効にして結合させていますが、まだ時間がかかりそうです。

    結果が出ましたらまたご連絡します。

  2. かこん より:

    高速モードを無効にしても問題が発生するのでログとファイルを比較して調べてみたところ、恐らく問題が分かりました。

    チャプター位置を計算する時に結合後のビデオトラックのDurationから後半部分のDurationを引いたものに0.003加えるということでしたが、後半部分のDurationのところで結合前のビデオトラックのDurationを使って引いてしまっていると思います。ここは結合時に指定したDurationを引かなければ音声トラックの方が短かった場合、余計に引いてしまうことになります。

    よって正しくは、チャプター位置を計算する時に結合後のビデオトラックのDurationから後半部分の結合時に指定したDurationを引いたものに0.003加える、となると思います。

    よろしくお願いします。

  3. かこん より:

    それからチャプター名を連番指定に一つ提案なのですが、チャプター名を前と後ろの両方に指定できるようにするとより便利かもしれません。

    そうすると例えば、[第] + (連番) + [章]のようなことも出来ますね。

    あと報告遅れましたが、英語版Windowsでボタンが重なる問題ですが1.0.7.0で直っているようです。修正ありがとうございました。

  4. ぬっき~ より:

    @かこん さま

    毎回検証していただき誠に恐縮です。。。

    再度提案いただいた処理ですが、A.mp4 + B.mp4 => C.mp4 を例にお話します。

    まず、結合時にオプションの「追加ファイルのDurationを指定」をチェックしない場合は、B.mp4にDurationは指定されません。

    テストしてみたのですが、B.mp4のDurationを指定する・しないにかかわらず、C.mp4のDurationはMediaInfo、映像、音声すべて同じ値になっていました。

    ことのことから、B.mp4のDuration指定の有無に関係なく「B.mp4にDurationを指定する時に使用する値」=「B.mp4の映像・音声で短い方のDuration」としてC.mp4の映像Durationから引くように手直ししてみようと思います。

    チャプター名に関しては了解しました。
    発想にはあったのですが手抜きしました、スミマセン(^ ^;

    ボタンの重なりについては配置に余裕を持たせて、最小ウィンドウサイズを設定しました。
    手元に再現できる環境がなったのでどうなるかわかりませんでしたが、うまく修正されたようでよかったです。

    それから前のエントリーでの質問のあった「高速モードのチャプター位置の誤差も修正」についてですが、高速モードのチャプター計算方法を精査して通常モードとかなり近い値にしたつもりです。30個程度のファイル結合でテストした結果は1ms以内におさまっています。

    もっとも、更に数が多い場合や長時間のファイルではどうなるかわかりませんが・・・

  5. かこん より:

    @ぬっき~ さま

    >テストしてみたのですが、B.mp4のDurationを指定する・しないにかかわらず、C.mp4のDurationはMediaInfo、映像、音声すべて同じ値になっていました。

    当方で問題が出るMP4ファイルで試したところB.mp4のDurationを指定する・しないで違いが出ました。

    Durationを短く指定した場合、C.mo4も実際に短くなっています。

    よって、B.mp4のDurationを指定した時のみ指定したDurationをC.mp4のDurationから引くようし、B.mp4のDurationを指定しなかった時は以前のままB.mp4の映像DurationをC.mp4のDurationから引かなければいけない気がします。

    ま、結局はB.mp4のDurationを指定する・しないの違いは映像と音声の長さを後半結合時に切り詰めるか、次回の前半結合時に切り詰めるかの違いなので結果は同じになる気がしますが、チャプター位置計算はその都度なので上記のように両者を明確に分けないと結果が違ってくる気がします。

    注意点としてはMovie InfoのDurationよりもVideoトラックのMedia Durationが長い場合、Edit listsなるものでtrack durationを指定して長さのつじつまを合わせているようです。それに関しては次の返信に分けようと思います。

    ==========
    MP4BOX.EXE -new Ca.mp4 -add A.mp4:dur=1539.120 -cat B.mp4:dur=1539.498

    MP4BOX -info Ca.mp4
    * Movie Info *
    Timescale 600 – Duration 00:51:18.698
    2 track(s)
    Fragmented File: no
    File suitable for progressive download (moov before mdat)
    File Brand isom – version 1
    Created: GMT Sat Nov 23 00:45:14 2013
    Modified: GMT Sat Nov 23 00:45:14 2013

    File has root IOD (9 bytes)
    Scene PL 0xff – Graphics PL 0xff – OD PL 0xff
    Visual PL: ISO Reserved Profile (0x7f)
    Audio PL: AAC Profile @ Level 2 (0x29)
    No streams included in root OD

    Track # 1 Info – TrackID 1 – TimeScale 90000 – Media Duration 00:51:18.736
    Track has 1 edit lists: track duration is 00:51:18.698
    Media Info: Language “Undetermined” – Type “vide:avc1” – 73815 samples
    Visual Track layout: x=0 y=0 width=640 height=480
    MPEG-4 Config: Visual Stream – ObjectTypeIndication 0x21
    AVC/H264 Video – Visual Size 640 x 480
    AVC Info: 1 SPS – 1 PPS – Profile High @ Level 4.1
    NAL Unit length bits: 32
    Pixel Aspect Ratio 1:1 – Indicated track size 640 x 480
    Chroma format 0 – Luma bit depth 8 – chroma bit depth 8
    Self-synchronized

    Track # 2 Info – TrackID 2 – TimeScale 48000 – Media Duration 00:51:18.656
    Media Info: Language “Japanese” – Type “soun:mp4a” – 144312 samples
    MPEG-4 Config: Audio Stream – ObjectTypeIndication 0x40
    MPEG-4 Audio AAC LC – 2 Channel(s) – SampleRate 48000
    Synchronized on stream 1

    ==========
    MP4BOX.EXE -new Cb.mp4 -add A.mp4:dur=1539.120 -cat B.mp4

    MP4BOX -info Cb.mp4
    * Movie Info *
    Timescale 600 – Duration 00:51:18.740
    2 track(s)
    Fragmented File: no
    File suitable for progressive download (moov before mdat)
    File Brand isom – version 1
    Created: GMT Sat Nov 23 00:44:49 2013
    Modified: GMT Sat Nov 23 00:44:49 2013

    File has root IOD (9 bytes)
    Scene PL 0xff – Graphics PL 0xff – OD PL 0xff
    Visual PL: ISO Reserved Profile (0x7f)
    Audio PL: AAC Profile @ Level 2 (0x29)
    No streams included in root OD

    Track # 1 Info – TrackID 1 – TimeScale 90000 – Media Duration 00:51:18.779
    Track has 1 edit lists: track duration is 00:51:18.740
    Media Info: Language “Undetermined” – Type “vide:avc1” – 73816 samples
    Visual Track layout: x=0 y=0 width=640 height=480
    MPEG-4 Config: Visual Stream – ObjectTypeIndication 0x21
    AVC/H264 Video – Visual Size 640 x 480
    AVC Info: 1 SPS – 1 PPS – Profile High @ Level 4.1
    NAL Unit length bits: 32
    Pixel Aspect Ratio 1:1 – Indicated track size 640 x 480
    Chroma format 0 – Luma bit depth 8 – chroma bit depth 8
    Self-synchronized

    Track # 2 Info – TrackID 2 – TimeScale 48000 – Media Duration 00:51:18.656
    Media Info: Language “Japanese” – Type “soun:mp4a” – 144312 samples
    MPEG-4 Config: Audio Stream – ObjectTypeIndication 0x40
    MPEG-4 Audio AAC LC – 2 Channel(s) – SampleRate 48000
    Synchronized on stream 1

  6. かこん より:

    さて、Edit listsのtrack durationですが、これが結合時にどういった意味になるのか試してみました。

    すると、Durationを指定しなかった時とDurationに映像Track Durationを指定した時は共に警告もなく結果も同じでした。(C0.mp4、C1.mp4)

    逆に映像Track Durationよりも0.084短い音声Durationを指定した場合、警告(Warning: suspicious edit list entry found)が出て、結果が異なります。(C2.mp4)

    どうやらつじつま合わせのために長さが微調整されるようです。

    この例ですと、0.084短くなるように指定した場合、Movie Infoは0.084短くなっていますが、映像Durationは0.043、映像Track Durationは0.089、音声Durationは0.042短くなっています。これは結合後の長さなので、微調整によって結合部分の位置がどのようにずれたかは分かりませんが、今後注意が必要ですね。

    ==========
    MP4BOX.EXE -new C0.MP4 -add Ca.MP4 -cat Cb.MP4
    IsoMedia import Ca.MP4 – track ID 1 – Video (size 640 x 480)
    IsoMedia import Ca.MP4 – track ID 2 – Audio (SR 48000 – 2 channels)
    Appending file Cb.MP4
    Saving Cx.MP4: 0.500 secs Interleaving

    ==========
    MP4BOX.EXE -new C1.MP4 -add Ca.MP4:dur=3078.74 -cat Cb.MP4
    IsoMedia import Ca.MP4 – track ID 1 – Video (size 640 x 480)
    IsoMedia import Ca.MP4 – track ID 2 – Audio (SR 48000 – 2 channels)
    Appending file Cb.MP4
    Saving Cz.MP4: 0.500 secs Interleaving

    MP4BOX -info C0.MP4
    * Movie Info *
    Timescale 600 – Duration 01:42:37.475
    2 track(s)
    Fragmented File: no
    File suitable for progressive download (moov before mdat)
    File Brand isom – version 1
    Created: GMT Sat Nov 23 00:59:26 2013
    Modified: GMT Sat Nov 23 00:59:26 2013

    File has root IOD (9 bytes)
    Scene PL 0xff – Graphics PL 0xff – OD PL 0xff
    Visual PL: ISO Reserved Profile (0x7f)
    Audio PL: AAC Profile @ Level 2 (0x29)
    No streams included in root OD

    Track # 1 Info – TrackID 1 – TimeScale 90000 – Media Duration 01:42:37.515
    Track has 1 edit lists: track duration is 01:42:37.475
    Media Info: Language “Undetermined” – Type “vide:avc1” – 147631 samples
    Visual Track layout: x=0 y=0 width=640 height=480
    MPEG-4 Config: Visual Stream – ObjectTypeIndication 0x21
    AVC/H264 Video – Visual Size 640 x 480
    AVC Info: 1 SPS – 1 PPS – Profile High @ Level 4.1
    NAL Unit length bits: 32
    Pixel Aspect Ratio 1:1 – Indicated track size 640 x 480
    Chroma format 0 – Luma bit depth 8 – chroma bit depth 8
    Self-synchronized

    Track # 2 Info – TrackID 2 – TimeScale 48000 – Media Duration 01:42:37.434
    Media Info: Language “Japanese” – Type “soun:mp4a” – 288624 samples
    MPEG-4 Config: Audio Stream – ObjectTypeIndication 0x40
    MPEG-4 Audio AAC LC – 2 Channel(s) – SampleRate 48000
    Synchronized on stream 1

    ==========
    MP4BOX.EXE -new C2.MP4 -add Ca.MP4:dur=3078.656 -cat Cb.MP4
    IsoMedia import Ca.MP4 – track ID 1 – Video (size 640 x 480)
    IsoMedia import Ca.MP4 – track ID 2 – Audio (SR 48000 – 2 channels)
    Appending file Cb.MP4
    Warning: suspicious edit list entry found: duration 1847.24 sec but longest track duration before cat is 1847.24 – fixing it
    Saving Cy.MP4: 0.500 secs Interleaving

    MP4BOX -info C2.MP4
    * Movie Info *
    Timescale 600 – Duration 01:42:37.391
    2 track(s)
    Fragmented File: no
    File suitable for progressive download (moov before mdat)
    File Brand isom – version 1
    Created: GMT Sat Nov 23 01:02:01 2013
    Modified: GMT Sat Nov 23 01:02:01 2013

    File has root IOD (9 bytes)
    Scene PL 0xff – Graphics PL 0xff – OD PL 0xff
    Visual PL: ISO Reserved Profile (0x7f)
    Audio PL: AAC Profile @ Level 2 (0x29)
    No streams included in root OD

    Track # 1 Info – TrackID 1 – TimeScale 90000 – Media Duration 01:42:37.472
    Track has 1 edit lists: track duration is 01:42:37.386
    Media Info: Language “Undetermined” – Type “vide:avc1” – 147630 samples
    Visual Track layout: x=0 y=0 width=640 height=480
    MPEG-4 Config: Visual Stream – ObjectTypeIndication 0x21
    AVC/H264 Video – Visual Size 640 x 480
    AVC Info: 1 SPS – 1 PPS – Profile High @ Level 4.1
    NAL Unit length bits: 32
    Pixel Aspect Ratio 1:1 – Indicated track size 640 x 480
    Chroma format 0 – Luma bit depth 8 – chroma bit depth 8
    Self-synchronized

    Track # 2 Info – TrackID 2 – TimeScale 48000 – Media Duration 01:42:37.392
    Media Info: Language “Japanese” – Type “soun:mp4a” – 288624 samples
    MPEG-4 Config: Audio Stream – ObjectTypeIndication 0x40
    MPEG-4 Audio AAC LC – 2 Channel(s) – SampleRate 48000
    Synchronized on stream 1

  7. かこん より:

    なお、こちらが問題が出るA.mp4とB.mp4の情報です。

    ==========
    MP4BOX -info A.mp4
    * Movie Info *
    Timescale 90000 – Duration 00:25:41.717
    2 track(s)
    Fragmented File: no
    File Brand mp42 – version 0
    Created: GMT Sun Nov 17 11:22:39 2013
    Modified: GMT Sun Nov 17 11:29:03 2013

    File has root IOD (9 bytes)
    Scene PL 0xff – Graphics PL 0xff – OD PL 0xff
    Visual PL: ISO Reserved Profile (0x7f)
    Audio PL: High Quality Audio Profile @ Level 2 (0x0f)
    No streams included in root OD

    iTunes Info:
    Encoder Software: HandBrake 0.9.9 2013052900

    Track # 1 Info – TrackID 1 – TimeScale 90000 – Media Duration 00:25:39.120
    Track has 1 edit lists: track duration is 00:25:39.120
    Media Info: Language “Undetermined” – Type “vide:avc1” – 36902 samples
    Visual Track layout: x=0 y=0 width=640 height=480
    MPEG-4 Config: Visual Stream – ObjectTypeIndication 0x21
    AVC/H264 Video – Visual Size 640 x 480
    AVC Info: 1 SPS – 1 PPS – Profile High @ Level 4.1
    NAL Unit length bits: 32
    Pixel Aspect Ratio 1:1 – Indicated track size 640 x 480
    Self-synchronized

    Track # 2 Info – TrackID 2 – TimeScale 48000 – Media Duration 00:25:41.717
    Media Info: Language “Japanese” – Type “soun:mp4a” – 72268 samples
    MPEG-4 Config: Audio Stream – ObjectTypeIndication 0x40
    MPEG-4 Audio AAC LC – 2 Channel(s) – SampleRate 48000
    Synchronized on stream 1

    ==========
    MP4BOX -info B.mp4
    * Movie Info *
    Timescale 90000 – Duration 00:25:39.621
    2 track(s)
    Fragmented File: no
    File Brand mp42 – version 0
    Created: GMT Sun Nov 17 11:29:04 2013
    Modified: GMT Sun Nov 17 11:35:23 2013

    File has root IOD (9 bytes)
    Scene PL 0xff – Graphics PL 0xff – OD PL 0xff
    Visual PL: ISO Reserved Profile (0x7f)
    Audio PL: High Quality Audio Profile @ Level 2 (0x0f)
    No streams included in root OD

    iTunes Info:
    Encoder Software: HandBrake 0.9.9 2013052900

    Track # 1 Info – TrackID 1 – TimeScale 90000 – Media Duration 00:25:39.621
    Track has 1 edit lists: track duration is 00:25:39.621
    Media Info: Language “Undetermined” – Type “vide:avc1” – 36914 samples
    Visual Track layout: x=0 y=0 width=640 height=480
    MPEG-4 Config: Visual Stream – ObjectTypeIndication 0x21
    AVC/H264 Video – Visual Size 640 x 480
    AVC Info: 1 SPS – 1 PPS – Profile High @ Level 4.1
    NAL Unit length bits: 32
    Pixel Aspect Ratio 1:1 – Indicated track size 640 x 480
    Self-synchronized

    Track # 2 Info – TrackID 2 – TimeScale 48000 – Media Duration 00:25:39.498
    Media Info: Language “Japanese” – Type “soun:mp4a” – 72164 samples
    MPEG-4 Config: Audio Stream – ObjectTypeIndication 0x40
    MPEG-4 Audio AAC LC – 2 Channel(s) – SampleRate 48000
    Synchronized on stream 1

  8. ぬっき~ より:

    @かこん さま

    情報提供ありがとうございます。

    後半部分のDuration指定の有無で結合ファイルに差がでる場合もあるのですか・・・
    結合元ファイルによるのかもしれませんね。

    少し気になったのですが、問題が出るmp4ファイルの情報を見てみると「映像と音声のDurationの差」がずいぶんありますね。
    A.mp4にいたっては1.5sec以上違うようですし。

    ちなみにA.mp4を単体で、

    MP4BOX.EXE -new AA.mp4 -add A.mp4:dur=1539.120

    とした場合、AA.mp4の「映像と音声のDurationの差」は小さくなるのでしょうか?

    もし小さくなるようであれば、結合前に「映像と音声のDurationの差」を計測し、その差が0.5sec程度をこえるようであれば上のような単体でDurationを指定するコマンドを実行。(0.5secの閾値はなんとなくです)

    そしてA.mp4の代わりにAA.mp4を使用して結合・チャプター位置を計算する、といった風に発想の転換(=逃げの手段w)ができないかなと、思った次第です。

    現状で音ズレは発生せずにチャプター位置だけの問題であれば、この方法で解決できそうな気が・・・という淡い期待があります(^ ^;

  9. かこん より:

    @ぬっき~ さま

    >MP4BOX.EXE -new AA.mp4 -add A.mp4:dur=1539.120
    下記の通りやはり小さくなりますね。

    ただこれだと結合前に切り詰めているだけど、結合時に切り詰めているのと同じことの気がしますが、何か利点があるのでしょうか?逆に余分にAA.mp4を作る分だけ遅くなるのではないでしょうか?

    ==========
    MP4BOX -info AA.MP4
    * Movie Info *
    Timescale 600 – Duration 00:25:39.156
    2 track(s)
    Fragmented File: no
    File suitable for progressive download (moov before mdat)
    File Brand isom – version 1
    Created: GMT Sat Nov 23 19:28:46 2013
    Modified: GMT Sat Nov 23 19:28:46 2013

    File has root IOD (9 bytes)
    Scene PL 0xff – Graphics PL 0xff – OD PL 0xff
    Visual PL: ISO Reserved Profile (0x7f)
    Audio PL: AAC Profile @ Level 2 (0x29)
    No streams included in root OD

    Track # 1 Info – TrackID 1 – TimeScale 90000 – Media Duration 00:25:39.120
    Track has 1 edit lists: track duration is 00:25:39.120
    Media Info: Language “Undetermined” – Type “vide:avc1” – 36902 samples
    Visual Track layout: x=0 y=0 width=640 height=480
    MPEG-4 Config: Visual Stream – ObjectTypeIndication 0x21
    AVC/H264 Video – Visual Size 640 x 480
    AVC Info: 1 SPS – 1 PPS – Profile High @ Level 4.1
    NAL Unit length bits: 32
    Pixel Aspect Ratio 1:1 – Indicated track size 640 x 480
    Chroma format 0 – Luma bit depth 8 – chroma bit depth 8
    Self-synchronized

    Track # 2 Info – TrackID 2 – TimeScale 48000 – Media Duration 00:25:39.157
    Media Info: Language “Japanese” – Type “soun:mp4a” – 72148 samples
    MPEG-4 Config: Audio Stream – ObjectTypeIndication 0x40
    MPEG-4 Audio AAC LC – 2 Channel(s) – SampleRate 48000
    Synchronized on stream 1

  10. ぬっき~ より:

    @かこん さま

    あれ?私の勘違いだったでしょうか?

    問題が出るファイルとしていただいた情報は、先に挙げた A.mp4 + B.mp4 => C.mp4 の例に当てはめたときに結合点チャプターがずれる、と思っていたのですが・・・

    「A.mp4 + B.mp4」と「AA.mp4 + B.mp4」で結合結果に改善がみられるなら、イレギュラー扱いで事前処理しちゃおうかなという安易な発想だったのですけど。(^ ^;

    ひょっとしてA.mp4とB.mp4をそれぞれを後半部分として結合した時に、前半部分との結合点がずれてしまう、という事だったのですかね

    だとずれば検討違いでした・・・

    とりあえず、先に提案いただいた後半部分のDurationを修正してみます。

  11. かこん より:

    @ぬっき~ さま

    色々書いてこんがらがったかもしれませんのでまとめてみました。

    1. 結合後半のB.mp4にDurationを指定した場合、結合後のC.mp4の映像DurationからB.mp4の結合時に指定したDurationを引いた位置から0.003後ろの位置をチャプター位置とする。

    2. 結合後半のB.mp4にDurationを指定しなかった場合、結合後のC.mp4の映像DurationからB.mp4の映像Durationを引いた位置から0.003後ろの位置をチャプター位置とする。

    1.0.7.0の場合、結合後半のB.mp4にDurationを指定しているにもかかわらず、結合後のC.mp4の映像DurationからB.mp4の映像Durationを引いた位置をチャプター位置としてしまっているので、「B.mp4に指定するDuration」 < 「B.mp4の映像Duration」の場合、チャプター位置が前にずれてしまっているようだということでした。

    この説明でご理解いただけましたでしょうか?

  12. ぬっき~ より:

    @かこん さま

    わざわざまとめていただきありがとうございます。

    その処理の流れについては理解していたのですが、別件としての話題だと勘違いしていたようです。。。

    というわけで、既に修正済でしたので新しいバージョンとして公開しておきました。