LINUX.ORG.RU

Video - 720p to 480p с учетом SAR/DAR

 


1

1

Всем привет!

Чем консольным пожать видео с 720p to 480p/240p с учетом SAR/DAR. Еще интересует формула расчета ширины для 480p/240p с учетом SAR/DAR.



Последнее исправление: max567576 (всего исправлений: 1)
Ответ на: комментарий от anonymous

Если есть пример как - буду благодарен.

max567576
() автор топика
Ответ на: комментарий от MyLittlePony

Что то не выходит c использованием -vf scale= К примеру есть файл 720p:

Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 2497 kb/s, 29.97 fps, 29.97 tbr, 11988 tbn, 59.94 tbc (default)

Мне из него нужно сделать 480p

ffmpeg -i over50-03-01-a-720p-hd-2500.mp4 -vf scale=-1:480 -c:a copy out.mp4

Получаю

[libx264 @ 0x40db8c0] width not divisible by 2 (853x480)
Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height

max567576
() автор топика
Ответ на: комментарий от MyLittlePony

[libx264 @ 0x4256880] width not divisible by 2 (853x480) И она не правильно считает.

Можешь простыми словами объяснить что такое SAR. Что такое DAR я знаю а SAR что то не могу понять.

max567576
() автор топика
Ответ на: комментарий от max567576

16:9 - это DAR.

DAR может быть и 4:3 при SAR 16:9. DAR при этом растянет 16:9 до 4:3

MyLittlePony
()
Ответ на: комментарий от MyLittlePony

Был бы благодарен так как решение пока НЕ нашел.

max567576
() автор топика
Ответ на: комментарий от Lordwind

Последний раз я жал handbrake'ом.

Как получить кратное 2 число из нектарного в параметре для ffmpeg - это то, что нужно автору, а я не ТЫЖПРОГРАММИСТ, ясное дело, можно вычесть единицу, но ему нужна

формула расчета ширины для 480p/240p с учетом SAR/DAR.

Так что, там может быть и 4:3 видео, которое прекрасно разделится на 2, а после -1 мы опять получим ошибку (уже не говоря об испорченном видео)
Значит это нужно как-то проверить
Не думаю, что это делается хотя бы без скрипта

MyLittlePony
()
Ответ на: комментарий от MyLittlePony

а после -1 мы опять получим ошибку

Можешь чуть подробнее.

Не думаю, что это делается хотя бы без скрипта

Скрипт я могу сделать.

max567576
() автор топика
Ответ на: комментарий от max567576

Можешь чуть подробнее.

Допустим есть 4:3 видео 1280x960, 960/480 = 2, 1280/2=640, то есть число, кратное двум, а если мы отнимем один?

Скрипт я могу сделать.

Я конечно не программист, но попробуй:

scale=w='if(gcd(iw/(ih/480), 2)-1, w=iw/(ih/480), w=iw/(ih/480)-1):h=480'

MyLittlePony
()
Ответ на: комментарий от MyLittlePony

scale=w='if(gcd(iw/(ih/480), 2)-1, w=iw/(ih/480), w=iw/(ih/480)-1):h=480'

[Parsed_scale_0 @ 0x40dc620] Invalid size 'if(gcd(iw/(ih/480)' [AVFilterGraph @ 0x40dcfc0] Error initializing filter 'scale' with args 'w=if(gcd(iw/(ih/480):flags=bicubic'

max567576
() автор топика

DAR = W/H * SAR, где W и H - количество пикселов в ширину и в высоту соответственно.

SAR - sample aspect ratio, тоже самое что и pixel aspect ratio (PAR), DAR - display aspect ratio или соотношение сторон итоговой картинки.

Эта формула тебе будет нужна только если ты соберёшься вручную менять SAR. Если ты его менять не собираешься, то считай новую ширину в пикселах как W_new = W_old * H_new/H_old. В случае масштабирования или кропа ffmpeg сам пересчитывает SAR и DAR.

Учти, что для кодеков часто нужно кратное 2 или 4 количество пикселов, поэтому из результата вычисления нужно вычесть остаток от деления результата на 2 или на 4. Ну или прибавить остаток, в случае деления на 2, или прибавить разницу 4 и остатка в случае деления на 4. Лол.

Допустим, у тебя видео 1024x720 с SAR 1.25, то есть DAR = 16:9, и тебе надо сжать его до 410 пикселов по вертикали. Новая ширина в пикселах будет W_new = 1024 * 410/720 ~= 583. Так кодеки h264 и h265 (hevc) не умеют в нечётное количество пикселов, то примем новую ширину равной 582 или 584.

Теперь, если перекодировать такой командой:

ffmpeg -i old.mp4 -vf scale=582:410 -c:v h264 -c:a copy -crf 20 new.mp4

то можно увидеть, что ffmpeg сохраняет DAR, изменяя при этом SAR. Если ты-таки хочешь изменить SAR *или* DAR, то используй фильтр setsar или setdar:

ffmpeg -i old.mp4 -vf scale=582:410,setsar=1:1 -c:v hevc -c:a copy -crf 20 new.mp4
anonymous
()
Ответ на: комментарий от Lordwind

А чем тогда будешь жать в следующий раз?

anonymous
()
Ответ на: комментарий от MyLittlePony

scale=w='if(gcd(iw/(ih/480),2)-1,iw/(ih/480),iw/(ih/480)-1)':h=480

В кавычки двойные поместил и все заработало.

scale=w="'if(gcd(iw/(ih/480),2)-1,iw/(ih/480),iw/(ih/480)-1)'":h=480

А это получается тоже самое что и -vf scale=-1:480 только в твоем случае -1 если не дробное ?

Можно жать смело все ролики (720p,480p,360p) твоим способом ?

max567576
() автор топика
17 декабря 2017 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.