¿Cómo crear variantes de MPEG-DASH en resoluciones donde una dimensión no es un número entero en píxeles?

Creé un montón de variantes y un manifiesto DASH para Sintel, que más o menos funciona, pero no pasa la validación . El problema es cuando quiero escalar un video a un ancho específico, pero la altura que mantiene la relación de aspecto no es un número entero, o viceversa. Por ejemplo, probé 640:-1, 640: -2 y 640:290 como el valor de "-vf scale=", pero ffmpeg lo rechaza o la validación falla. ¿Cómo puedo transcodificar a estas resoluciones?

Registro de errores del sitio de conformidad:

### 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'

Mis comandos ffmpeg y MP4Box (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
Usar "-vf scale=1920:-1" (auto 'y') o "-vf scale=1920:-8" (divisible por 8) debería funcionar. ¿Está utilizando el ffmpeg más reciente? -- Hay validadores de flujo en línea como: viblast.com/stream-validator . Pruebe con un redimensionador diferente dentro de ffmpeg.

Respuestas (1)

El filtro de escala restablece la relación de aspecto de la muestra para que coincida con la relación de aspecto de la pantalla original. Debe agregar setsar=1después de cada escala. En cualquier caso, los videos no contienen un número de píxeles con componentes fraccionarios, y FFmpeg no los generará.

No estoy seguro acerca de DASH, pero supongo que el validador espera que cada variante tenga exactamente la misma relación de aspecto. En su lista de comandos, puedo ver 640x290y 1280x582, que no tienen el mismo aspecto. Si DASH necesita que todo sea igual, este último debe ser1280x580