Kürzen Sie den Audiostream auf die Länge des Videostreams

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.
  • Remuxen der ursprünglichen mkv-Datei mit MkvToolnix.

ffmpegmit der -tOption 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

Antworten (1)

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
Dies führte dazu, dass die mp4-Datei teilweise abgeschnitten wurde. Ich bin mir nicht sicher, was los war. Dieser Ansatz hat jedoch funktioniert, um die mkv-Datei zu korrigieren, sodass ich eine geeignete Quelle habe, aus der ich mein mp4 codieren kann. Vielen Dank! Letzte Befehlszeile:ffmpeg -i file.mkv -map 0 -c copy -fflags +shortest -max_interleave_delta 0 out.mkv
@StephenCleary: Ärgerlicherweise gilt die shortestLogik 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 Sie ffmpeg -i original.mkv -c copy -sn -fflags +shortest -max_interleave_delta 0 trimmed-no-subs.mkvdie Untertitel danach wieder ein:ffmpeg -i trimmed-no-subs.mkv -i original.mkv -map 0 -map 1:s -c copy trimmed.mkv