I have an mp4 file (converted from an mkv file) that has a longer audio than video stream. This file doesn't play back nicely in my media streaming app (or MPC-HC) when I reach the end of the file.
Example output from mp4info:
File: major brand: mp42 minor version: 200 compatible brand: isom compatible brand: iso2 compatible brand: avc1 compatible brand: mp41 fast start: yes Movie: duration: 1553152 ms time scale: 1000 fragments: no Found 3 Tracks Track 1: flags: 3 ENABLED IN-MOVIE id: 1 type: Video duration: 1524398 ms language: und media: sample count: 36549 timescale: 90000 duration: 137195807 (media timescale units) duration: 1524398 (ms) bitrate (computed): 8508.739 Kbps display width: 1444.000000 display height: 1080.000000 frame rate (computed): 23.976 Sample Description 0 Coding: avc1 (H.264) Width: 1444 Height: 1080 Depth: 24 AVC Profile: 77 (Main) AVC Profile Compat: 40 AVC Level: 40 AVC NALU Length Size: 4 AVC SPS: [674d4028eca02d8113cf2e02d404040500000300010002bf200f183196] AVC PPS: [68cb8132c8] Codecs String: avc1.4D4028 Track 2: flags: 3 ENABLED IN-MOVIE id: 2 type: Audio duration: 1553152 ms language: eng media: sample count: 72804 timescale: 48000 duration: 74551296 (media timescale units) duration: 1553152 (ms) bitrate (computed): 125.679 Kbps Sample Description 0 Coding: mp4a (MPEG-4 Audio) Stream Type: Audio Object Type: MPEG-4 Audio Max Bitrate: 125678 Avg Bitrate: 125678 Buffer Size: 0 Codecs String: mp4a.40.2 MPEG-4 Audio Object Type: 2 (AAC Low Complexity) MPEG-4 Audio Decoder Config: Sampling Frequency: 48000 Channels: 1 Extension: Object Type: Spectral Band Replication SBR Present: no PS Present: no Sampling Frequency: 0 Sample Rate: 48000 Sample Size: 16 Channels: 2 Track 3: flags: 2 IN-MOVIE id: 3 type: Text duration: 1524356 ms language: ``` media: sample count: 5 timescale: 1000 duration: 1524356 (media timescale units) duration: 1524356 (ms) bitrate (computed): 0.001 Kbps Sample Description 0 Coding: text
Specifically, the "Movie" duration is 1553152ms (25:53.152), which is too long. The duration of the video stream is 1524398ms (25:24.398), which is correct. The duration of the audio stream is 1553152ms (25:53.152), and seems to be driving the "Movie" duration.
I want to set the "Movie" duration to the video duration value without re-encoding. It seems like this would be an easy thing to do, but I can't find any solution.
ffmpeg -i file.mp4 -shortest -codec copy out.mp4- doesn't have any effect (other than removing the mp4 faststart, which I want to keep).
mp4box -add file.mp4 -new out.mp4- also doesn't fix the duration.
- Remuxing the original mkv file using MkvToolnix.
ffmpeg with the
-t option may work, but I've got a few thousand files to go through and I don't want to manually type a different command for each one.
I have a bunch of BluRays that I ripped a couple of years ago with MakeMKV 1.10.4. The MKV files themselves have the same problem: the segment duration is 25:53.088, with a track 1 movie DURATION tag of 25:24.397875. The track 2 (audio) movie DURATION tag is 25:53.14133333. Re-ripping the BluRays is an acceptable solution, if this problem has been fixed (I haven't pulled the BluRays out of storage and tried it).
I converted these MakeMKV mkv files using HandBrake into h265 mkv files. These files also have the segment duration vs movie DURATION tag mismatch.
When playing the MKV files, my media streaming app (and MPC-HC) correctly determine the length of the file from the movie DURATION tag. There's no problem there, even though the mkv file durations are wrong.
What I want to do is enable several older players by encoding to h264 mp4s with faststart. I believe my media streaming app will then be able to serve the files directly instead of re-encoding to h264 or remuxing (depending on the client, it always does one or the other right now).
I have HandBrake all set up with my new h264/mp4 settings and would like to continue using that application to re-encode the MakeMKV source files.
An ideal solution would be to fix the mkv segment duration in the MakeMKV source files. Fixing the mp4 files after the fact would also be acceptable, but at that point I don't want a re-encode.
Versions are current on everything except MakeMkv since I ripped these a couple years ago:
ffmpeg 4.1.4 mp4info 1.3.4 (Bento4 126.96.36.199) MKVToolNix 35.0.0 MP4Box 0.8.0-rev47-gbafe4cd3-master MakeMKV 1.10.4