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.
I've tried:
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.
More details:
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 1.5.1.0)
MKVToolNix 35.0.0
MP4Box 0.8.0-rev47-gbafe4cd3-master
MakeMKV 1.10.4