Wie erstellt man MPEG-DASH-Varianten bei Auflösungen, bei denen eine Dimension keine ganze Zahl in Pixeln ist?

Ich habe eine Reihe von Varianten und ein DASH-Manifest für Sintel erstellt, das mehr oder weniger funktioniert, aber die Validierung nicht besteht . Das Problem ist, wenn ich ein Video auf eine bestimmte Breite skalieren möchte, aber die Höhe, die das Seitenverhältnis beibehält, keine ganze Zahl ist - oder umgekehrt. Ich habe zum Beispiel 640:-1, 640: -2 und 640:290 als Wert von "-vf scale=" ausprobiert, aber entweder lehnt ffmpeg ihn ab oder die Validierung schlägt fehl. Wie kann ich in diese Auflösungen transcodieren?

Fehlerprotokoll von der Konformitätsseite:

### error: moov-1:trak-1:tkhd-1 
### Width in TrackHeaderBox is not matching with out of box width information 
WARNING: Sample description width 2560 not the same as track width 2558.532104
Warning: Unknown atom found "pasp": video sample descriptions would not normally contain this
WARNING: unknown mvex atom 'trep'
WARNING: unknown/unexpected atom 'meta'

Meine ffmpeg- und MP4Box-Befehle (OSX):

OUTDIR="sintel-transcoded"
#VIDOPTS24="-an -c:v libx264 -r 24 -tune animation -force_key_frames expr:gte(t,n_forced*3)"
VIDOPTS24="-an -c:v libx264 -tune animation -x264opts keyint=72:min-keyint=72:no-scenecut -vsync passthrough"

mkdir -p $OUTDIR

ffmpeg -i $SOURCEDIR/sintel_4k.mov \
$VIDOPTS24 -vf scale=320:146 -profile:v baseline -level 3.0 -crf 31 -maxrate 170k -bufsize 170k $OUTDIR/sintel_320.mp4 \
$VIDOPTS24 -vf scale=480:-2 -profile:v baseline -level 3.0 -crf 30 -maxrate 330k -bufsize 330k $OUTDIR/sintel_480.mp4 \
$VIDOPTS24 -vf scale=640:290 -profile:v baseline -level 3.1 -crf 30 -maxrate 500k -bufsize 500k $OUTDIR/sintel_640.mp4 \
$VIDOPTS24 -vf scale=640:290 -profile:v baseline -level 3.1 -crf 25 -maxrate 1000k -bufsize 1000k $OUTDIR/sintel_640_hq.mp4 \
$VIDOPTS24 -vf scale=960:-2 -profile:v main -level 3.1 -crf 19 -maxrate 2800k -bufsize 2800k $OUTDIR/sintel_960.mp4 \
$VIDOPTS24 -vf scale=1280:582 -profile:v main -level 3.1 -crf 19 -maxrate 4000k -bufsize 4000k $OUTDIR/sintel_1280.mp4 \
$VIDOPTS24 -vf scale=1920:-2 -profile:v high -level 4.0 -crf 20 -maxrate 6800k -bufsize 6800k $OUTDIR/sintel_1920.mp4 \
$VIDOPTS24 -vf scale=2560:1162 -profile:v high -level 5.0 -crf 19 -maxrate 12000k -bufsize 12000k $OUTDIR/sintel_2560.mp4 \
$VIDOPTS24 -profile:v high -level 5.1 -crf 20 -maxrate 20000k -bufsize 20000k $OUTDIR/sintel_3840.mp4 \
-vn -c:a aac -b:a 64k $OUTDIR/sintel_audio_64k.mp4 \
-vn -c:a aac -b:a 96k $OUTDIR/sintel_audio_96k.mp4 \
-vn -c:a aac -b:a 128k $OUTDIR/sintel_audio_128k.mp4

cd $OUTDIR

MP4Box -dash-strict 3000 -rap -frag-rap -profile dashavc264:live -bs-switching no -out Manifest.mpd \
sintel_3840.mp4:bandwidth=20000000 \
sintel_2560.mp4:bandwidth=12000000 \
sintel_1920.mp4:bandwidth=6800000 \
sintel_1280.mp4:bandwidth=4000000 \
sintel_960.mp4:bandwidth=2800000 \
sintel_640_hq.mp4:bandwidth=1000000 \
sintel_640.mp4:bandwidth=500000 \
sintel_480.mp4:bandwidth=330000 \
sintel_320.mp4:bandwidth=170000 \
sintel_audio_128k.mp4 \
sintel_audio_96k.mp4 \
sintel_audio_64k.mp4

mkdir dist
mv *dash* Manifest.mpd dist
Die Verwendung von "-vf scale=1920:-1" (auto 'y') oder "-vf scale=1920:-8" (gerade teilbar durch 8) sollte funktionieren. Benutzt du das neuste ffmpeg? -- Es gibt Online-Stream-Validatoren wie: viblast.com/stream-validator . Probieren Sie einen anderen Resizer innerhalb von ffmpeg aus.

Antworten (1)

Der Skalierungsfilter setzt das Abtast-Seitenverhältnis zurück, damit es mit dem ursprünglichen Anzeige-Seitenverhältnis übereinstimmt. setsar=1Sie sollten nach jeder Skala hinzufügen . In jedem Fall enthalten Videos keine Pixelanzahl mit Bruchteilen, und FFmpeg gibt diese nicht aus.

Ich bin mir bei DASH nicht sicher, aber ich nehme an, der Validator erwartet, dass jede Variante genau das gleiche Seitenverhältnis hat. In Ihrer Befehlsliste kann ich 640x290und sehen 1280x582, die nicht denselben Aspekt haben. Wenn DASH alle gleich sein müssen, sollte Letzteres so sein1280x580