Невозможно получить сжатие без потерь для работы с ffmpeg с апскейлингом в Windows 10

452
Jack

Я пытаюсь преобразовать последовательность изображений PNG в видео без потерь при увеличении масштаба (с сохранением соотношения сторон). Я приложил одно изображение PNG

png image,

Однако каждый вариант без потерь, который я использую, явно не без потерь или приводит к повреждению видео.

Я пытался ffmpeg -framerate 60 -i %d.png -vf scale=-1:2160 -c:v libx264 -crf 0 -preset veryslow -c:a libmp3lame -b:a 320k output.mp4добавить строку вывода cmd, но этот веб-сайт жалуется, что мой вопрос - спам, если я это сделаю, и не позволяет публиковать его.

Что, я думаю, должно быть без потерь из-за -crf 0, однако при этом получается поврежденное видео в соответствии с vlc, windows media player и firefox. Тем не менее, Chrome удается играть в нее, но результаты в этом случае, очевидно, с потерями. Показанный здесь, вы можете видеть очень четко толстые концентрические полосы цвета, которых нет в реальном .png, который вместо этого плавно падает. Сжатие с потерями

Я проверил это как с полным набором изображений, которые я хочу сделать в видео, так и всего с 3 кадрами, чтобы быть уверенным, что с входными данными .png нет ничего плохого, в обоих случаях получаются одинаковые результаты.

После поиска в Интернете я обнаружил, что добавление -pix_fmt yuv420p может помочь, поэтому попробовал это

ffmpeg -framerate 60 -i %d.png -vf scale=-1:2160 -c:v libx264 -crf 0 -preset veryslow -c:a libmp3lame -b:a 320k -pix_fmt yuv420p output.mp4

Это позволяет VLC теперь открывать его (однако Firefox и Windows Media Player по-прежнему говорят, что он поврежден). Тем не менее, он все еще явно сжат с потерями как в Chrome, так и в VLC.

Я тогда попробовал ffmpeg -framerate 60 -i %d.png -vf scale=-1:2160 -c:v libvpx-vp9 -lossless 1 output.webm

То, что я собираю, должно быть без потерь из-за -lossless 1, однако выполнение этого приводит к очень странному выводу. В VLC и Firefox вывод просто черный. Тем не менее, в Chrome выводится в основном зеленый фон, который меняется от темно-зеленого в нижней части экрана до светло-зеленого в верхней части, с более темным зеленым кружком в середине, а текст в левом верхнем углу становится розовым. В Windows Media Player вывод аналогичен, однако в центре нет темно-зеленого круга, а текст в левом верхнем углу изменился на очень яркий светло-зеленый, а также был продублирован ниже самого себя в более низком разрешении, но увеличен шрифт и изменен до темно-розового с черным контуром. Я не понимаю, как это могло произойти

very weird windows media player output

Затем я попытался добавить -pix_fmt yuv420p к этому, как и раньше, ffmpeg -framerate 60 -i %d.png -vf scale=-1:2160 -c:v libvpx-vp9 -lossless 1 -pix_fmt yuv420p output.webm

При этом выходные данные в VLC и Firefox по-прежнему пустые, однако chrome и Windows Media Player теперь показывают нормальные выходные данные, однако в результате снова очевидно сжатие с потерями.

Затем я попытался ffmpeg -framerate 60 -i% d.png -vf scale = -1: 2160 -c: v ffv1 -c: libmp3lame -b: вывод 320 КБ. Avi

Тем не менее, вывод - это просто черный экран в VLC, недавно установленный как на компьютере с Windows 10, так и на компьютере с Ubuntu. Вывод cmd для этого

ffmpeg -framerate 60 -i %d.png -vf scale=-1:2160 -c:v ffv1 -c:a libmp3lame -b:a 320k output.avi ffmpeg version N-91999-g148a21611d Copyright (c) 2000-2018 the FFmpeg developers built with gcc 8.2.1 (GCC) 20180813 configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth libavutil 56. 19.101 / 56. 19.101 libavcodec 58. 30.100 / 58. 30.100 libavformat 58. 18.102 / 58. 18.102 libavdevice 58. 4.103 / 58. 4.103 libavfilter 7. 32.100 / 7. 32.100 libswscale 5. 2.100 / 5. 2.100 libswresample 3. 2.100 / 3. 2.100 libpostproc 55. 2.100 / 55. 2.100 Input #0, image2, from '%d.png': Duration: 00:00:10.00, start: 0.000000, bitrate: N/A Stream #0:0: Video: png, rgb24(pc), 3840x1408, 60 fps, 60 tbr, 60 tbn, 60 tbc Codec AVOption b (set bitrate (in bits/s)) specified for output file #0 (output.avi) has not been used for any stream. The most likely reason is either wrong type (e.g. a video option with no video streams) or that it is a private option of some encoder which was not actually used for any stream. Stream mapping: Stream #0:0 -> #0:0 (png (native) -> ffv1 (native)) Press [q] to stop, [?] for help Output #0, avi, to 'output.avi': Metadata: ISFT : Lavf58.18.102 Stream #0:0: Video: ffv1 (FFV1 / 0x31564646), bgr0, 5891x2160, q=2-31, 200 kb/s, 60 fps, 60 tbn, 60 tbc Metadata: encoder : Lavc58.30.100 ffv1 frame= 600 fps=4.0 q=-0.0 Lsize= 100850kB time=00:00:10.00 bitrate=82616.4kbits/s speed=0.067x video:100830kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.019776%

Прилагается ссылка на файл вывода https://cernbox.cern.ch/index.php/s/ggEtDZmwxqzap3Y

Как превратить последовательность изображений PNG в сжатое видео без потерь?

Спасибо за любую помощь

1
Что конкретно вы имеете в виду под «явно проигрышными» в случае первой команды? Это должно производить то, что вы хотите, за исключением того, что многие проигрыватели не могут обрабатывать YUV 4: 4: 4 как формат пикселей. Убедитесь, что вы используете несколько более позднюю версию VLC. Требуется ли воспроизведение видео на большинстве устройств / плееров? В этом случае вы не можете использовать «полностью без потерь», так как цвет должен быть субдискретизирован до 4: 2: 0. slhck 5 лет назад 0
@slhck Нет, у меня нет требований, чтобы он мог воспроизводиться на любых устройствах, кроме моего. Под «потерями» я подразумеваю, что сразу вижу, что результат очень сжат, диффузное красное круглое пятно на первом изображении получается в виде серии очень видимых толстых концентрических полос цвета. Jack 5 лет назад 0
@slhck Я отредактировал основной пост, добавив скриншот видео с потерями. (Я подумал, что, возможно, это связано с масштабированием, но я попытался без масштабирования, и те же концентрические полосы видны). Я вполне уверен, что мне следует использовать последнюю версию VLC. Я не уверен, как вы проверяете, какая у вас конкретная версия, но я только что скачал ее вчера отсюда https://www.videolan.org/vlc/download-windows.html (в частности, потому что проигрыватель Windows Media не загружается это) и когда я проверяю обновления, он говорит мне, что у меня последняя версия медиаплеера VLC. Jack 5 лет назад 0
Проблема, с которой вы столкнулись (цветовая полоса), связана с преобразованием цветового пространства RGB в YUV (строго говоря, YCbCr). Используйте видеокодек, который поддерживает цветовое пространство RGB, например, `ffv1` (без потерь, не нужно устанавливать какие-либо параметры) slhck 5 лет назад 0
Привет @slhck, большое спасибо. Извините, я очень мало знаю о кодировании видео, поэтому просто для двойной проверки, вы имеете в виду изменить ffmpeg -framerate 60 -i% d.png -vf scale = -1: 2160 -c: v libx264 -crf 0 -preset veryslow -c: libmp3lame -b: от 320k выходных.mp4 до ffmpeg -framerate 60 -i% d.png -vf scale = -1: 2160 -c: v ffv1 -c: libmp3lame -b: 320k выходных.mp4? Спасибо еще раз за помощь Jack 5 лет назад 0
@Slhck Я попытался запустить ffmpeg -framerate 60 -i% d.png -vf scale = -1: 2160 -c: v ffv1 -c: libmp3lame -b: 320k output.avi (с .mp4 ffmpeg не будет работать) и видео это просто пустой черный экран в VLC и Windows Meida Player. Jack 5 лет назад 0
Да, это должно сработать, и я мог бы успешно воспроизвести полученное видео в моем случае с VLC. (Забудьте Windows Media Player для тестирования таких вещей.) Не могли бы вы добавить полный вывод командной строки из последнего запуска и, возможно, вывод видео в качестве образца? slhck 5 лет назад 0
@slhck Привет, я добавил вывод строки cmd и ссылку на вывод видео в нижней части основного поста. Я попытался удалить и переустановить VLC, однако я все еще просто вижу черный пустой экран при попытке открыть видео. Тем не менее, я протестировал его как с 3 изображениями, так и с 600, и он длится в течение соответствующего времени (менее 1 секунды с 3 изображениями, 10 секунд с 600). Я также попытался с VLC, недавно установленным на машине с Ubuntu, и это также просто показывает черный пустой экран. Еще раз спасибо всем за помощь Jack 5 лет назад 0
Извините за поздний ответ. Видео, которое вы загрузили, выглядит хорошо для меня и не показывает никаких полос. Я могу просмотреть его с последней версией VLC (под macOS). Другой кодек, который стоит попробовать - это ProRes через `-c: v prores_ks` (также есть` prores`, но он не поддерживает кодирование 4: 4: 4). slhck 5 лет назад 0
@slhck нет проблем, вы мне очень помогли. Да странно. Я полагаю, что VLC должна лучше поддерживаться в MacOS, чем Windows и Ubuntu Я пробовал prores_ks, который также просто дает мне черный экран на новой установке VLC, мне просто придется позаимствовать чей-то Mac. Спасибо за терпение и помощь Jack 5 лет назад 0

0 ответов на вопрос

Похожие вопросы