我正在尝试将一系列 png 图像转换为无损视频,同时进行升级(保持相同的宽高比)。我已附加一张 png 图像
但是,我使用的每个无损选项显然都不是无损的,或者会导致视频损坏。
我尝试过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 中,输出类似,但是中心没有深绿色圆圈,左上角的文字变成了非常明亮的浅绿色,并且以较低分辨率但更大的字体在其下方重复,并变成了带有黑色轮廓的深粉色。我不明白这怎么可能发生
然后我尝试像以前一样添加 -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:a libmp3lame -b:a 320k output.avi
然而,输出只是 VLC 中的一个空白黑屏,在 Windows 10 机器和 Ubuntu 机器上都是新安装的。此命令的输出是
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 图像转换为无损压缩的视频?
感谢您的任何帮助