Как создать варианты MPEG-DASH с разрешениями, где одно измерение не является целым числом в пикселях?

Я создал кучу вариантов и DASH-манифест для Sintel, который более-менее работает, но не проходит валидацию . Проблема заключается в том, что я хочу масштабировать видео до определенной ширины, но высота, поддерживающая соотношение сторон, не является целым числом или наоборот. Например, я пробовал 640:-1, 640:-2 и 640:290 в качестве значения "-vf scale=", но либо ffmpeg отклоняет его, либо проверка не проходит. Как я могу перекодировать в эти разрешения?

Журнал ошибок с сайта соответствия:

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

Мои команды ffmpeg и 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
Использование "-vf scale=1920:-1" (авто 'y') или "-vf scale=1920:-8" (делится без остатка на 8) должно работать. Вы используете новейший ffmpeg? -- Существуют онлайн-валидаторы потоков, такие как: viblast.com/stream-validator . Попробуйте изменить размер в ffmpeg.

Ответы (1)

Масштабный фильтр сбрасывает соотношение сторон образца, чтобы оно соответствовало исходному соотношению сторон дисплея. Вы должны добавить setsar=1после каждой шкалы. В любом случае видео не содержат количество пикселей с дробными компонентами, и FFmpeg их не выводит.

Я не уверен насчет DASH, но полагаю, что валидатор ожидает, что каждый вариант будет иметь одинаковое точное соотношение сторон. В вашем списке команд я вижу 640x290и 1280x582, которые не совпадают. Если DASH должен быть одинаковым, последний должен быть1280x580