Ich habe eine mp4-Datei (konvertiert aus einer mkv-Datei), die einen längeren Audio- als Videostream hat. Diese Datei wird in meiner Media-Streaming-App (oder MPC-HC) nicht gut wiedergegeben, wenn ich das Ende der Datei erreiche.
Beispielausgabe von 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
Insbesondere beträgt die „Film“-Dauer 1553152 ms (25:53,152), was zu lang ist. Die Dauer des Videostreams beträgt 1524398 ms (25:24,398), was korrekt ist. Die Dauer des Audiostreams beträgt 1553152 ms (25:53.152) und scheint die "Film"-Dauer zu bestimmen.
Ich möchte die „Film“-Dauer auf den Wert der Videodauer setzen, ohne sie neu zu codieren . Es scheint, als wäre dies eine einfache Sache, aber ich kann keine Lösung finden.
Ich habe es versucht:
ffmpeg -i file.mp4 -shortest -codec copy out.mp4
- hat keine Wirkung (außer dem Entfernen des mp4-Schnellstarts, den ich behalten möchte).mp4box -add file.mp4 -new out.mp4
- legt auch nicht die Dauer fest.ffmpeg
mit der -t
Option funktioniert vielleicht, aber ich muss ein paar tausend Dateien durchgehen und ich möchte nicht für jede einen anderen Befehl manuell eingeben.
Mehr Details:
Ich habe ein paar BluRays, die ich vor ein paar Jahren mit MakeMKV 1.10.4 gerippt habe. Die MKV-Dateien selbst haben das gleiche Problem: Die Segmentdauer beträgt 25:53,088, mit einem Titel-1-Film-DURATION-Tag von 25:24,397875. Das DURATION-Tag von Track 2 (Audio) ist 25:53.14133333. Das erneute Rippen der BluRays ist eine akzeptable Lösung, wenn dieses Problem behoben wurde (ich habe die BluRays nicht aus dem Speicher gezogen und es nicht versucht).
Ich habe diese MakeMKV mkv-Dateien mit HandBrake in h265 mkv-Dateien konvertiert. Bei diesen Dateien stimmt auch die Segmentdauer mit dem DURATION-Tag des Films nicht überein.
Beim Abspielen der MKV-Dateien bestimmen meine Media-Streaming-App (und MPC-HC) die Länge der Datei korrekt anhand des Film-DURATION-Tags. Es gibt dort kein Problem, obwohl die Dauer der mkv-Datei falsch ist.
Was ich tun möchte, ist, mehrere ältere Player zu aktivieren, indem ich mit Faststart in h264 mp4s kodiere. Ich glaube, dass meine Media-Streaming-App die Dateien dann direkt bereitstellen kann, anstatt sie in h264 neu zu codieren oder zu remuxen (je nach Client macht sie gerade immer das eine oder andere).
Ich habe HandBrake mit meinen neuen h264/mp4-Einstellungen eingerichtet und möchte diese Anwendung weiterhin verwenden, um die MakeMKV-Quelldateien neu zu codieren.
Eine ideale Lösung wäre, die mkv-Segmentdauer in den MakeMKV-Quelldateien zu korrigieren. Es wäre auch akzeptabel, die mp4-Dateien nachträglich zu reparieren, aber zu diesem Zeitpunkt möchte ich keine Neucodierung.
Die Versionen sind auf allem außer MakeMkv aktuell, seit ich diese vor ein paar Jahren gerippt habe:
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
Man sollte das avformat-Bibliotheksflag verwenden, um das Muxen mit dem kürzesten Stream zu stoppen.
ffmpeg -i file.mp4 -map 0 -c copy -fflags +shortest -max_interleave_delta 1G -movflags +faststart out.mp4
Stephen Klary
ffmpeg -i file.mkv -map 0 -c copy -fflags +shortest -max_interleave_delta 0 out.mkv
Genpfault
shortest
Logik auch für Untertitelspuren, die normalerweise kürzer sind als sowohl das Video als auch das Audio :( Ich musste die Untertitel im anfänglichen Kürzungs-Re-Mux entfernen: , dann kleben Sieffmpeg -i original.mkv -c copy -sn -fflags +shortest -max_interleave_delta 0 trimmed-no-subs.mkv
die Untertitel danach wieder ein:ffmpeg -i trimmed-no-subs.mkv -i original.mkv -map 0 -map 1:s -c copy trimmed.mkv