【问题标题】:FFMPEG Scale video without filteringFFMPEG 缩放视频而不过滤
【发布时间】:2015-06-23 02:10:22
【问题描述】:

我有兴趣在不应用任何过滤器或任何东西的情况下将视频缩放到更大的尺寸。输出视频应该看起来非常像素化。我如何在 FFMPEG 中做到这一点?

根据 Ronald S. Bultje 的建议,我正在使用邻居标志。我还决定使用 rawvideo 编解码器来避免压缩。

我正在运行的当前命令是

ffmpeg -i vid.avi -s 800x800 -sws_flags neighbor -sws_dither none -vcodec rawvideo vid2.avi

该命令的命令行输出是

ffmpeg version 2.7 Copyright (c) 2000-2015 the FFmpeg developers
  built with Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
  configuration: --prefix=/opt/local --enable-swscale --enable-avfilter --enable-avresample --enable-libmp3lame --enable-libvorbis --enable-libopus --enable-libtheora --enable-libschroedinger --enable-libopenjpeg --enable-libmodplug --enable-libvpx --enable-libspeex --enable-libass --enable-libbluray --enable-lzma --enable-gnutls --enable-fontconfig --enable-libfreetype --enable-libfribidi --disable-indev=jack --disable-outdev=xv --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/clang --enable-vda --arch=x86_64 --enable-yasm --enable-gpl --enable-postproc --enable-libx264 --enable-libxvid
  libavutil      54. 27.100 / 54. 27.100
  libavcodec     56. 41.100 / 56. 41.100
  libavformat    56. 36.100 / 56. 36.100
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 16.101 /  5. 16.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.100 /  1.  2.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, avi, from 'vid.avi':
  Duration: 00:00:25.00, start: 0.000000, bitrate: 226 kb/s
    Stream #0:0: Video: rawvideo, pal8, 80x80, 206 kb/s, 4 fps, 4 tbr, 4 tbn, 4 tbc
File 'vid2.avi' already exists. Overwrite ? [y/N] y
Output #0, avi, to 'vid2.avi':
  Metadata:
    ISFT            : Lavf56.36.100
    Stream #0:0: Video: rawvideo, pal8, 800x800, q=2-31, 200 kb/s, 4 fps, 4 tbn, 4 tbc
    Metadata:
      encoder         : Lavc56.41.100 rawvideo
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> rawvideo (native))
Press [q] to stop, [?] for help
frame=  100 fps=0.0 q=0.0 Lsize=   62608kB time=00:00:25.00 bitrate=20515.4kbits/s    
video:62600kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.012614%

【问题讨论】:

  • 术语:规模本身就是一个过滤器......所以你的请求有点混乱

标签: ffmpeg


【解决方案1】:
ffmpeg -i infile -vf scale=WIDTH:HEIGHT:flags=neighbor outfile

ffmpeg -i infile -s WIDTHxHEIGHT -sws_flags neighbor outfile

这里的关键部分是flags-sws_flags,它们选择过滤器(以及其他与缩放相关的标志)。默认滤镜值为 bicublin (IIRC),这意味着 bicubic 亮度和bilinear 色度滤镜。 Nearest-neighbour 会满足你的要求。

有关其他缩放算法的列表,请参阅 scaler options

【讨论】:

  • 这更接近但仍然不完全正确。放大的“像素”仍然不均匀。有一些条带,它们的大小也不一样,好像做了一些压缩
  • 很明显,因为你不能有半像素。看,假设您有一个 2x2 图像,并且您正试图从中创建一个 3x3 图像。您可以进行“最近邻”缩放,其中中间像素(行/列)将具有其相邻像素之一的值(取决于您的舍入方式),而边缘像素将具有原始边缘值;或者,您可以应用一些过滤器并给中间像素一些值(数学上)从边缘像素导出(过滤)。不能给一半像素一个值,一半像素另一个值,一个像素只能有一个值。
  • 我正在从 80x80 缩放到 800x800,所以应该没有问题。我确实通过使用-vcodec rawvideo 选项部分解决了这个问题,但现在我无法使用-sws_dither none 选项消除抖动噪音。
  • 我当前的命令是ffmpeg -i vid.avi -s 800x800 -sws_flags neighbor -sws_dither none -vcodec rawvideo vid2.avi
  • 尝试添加一个特定的 -pix_fmt,例如-pix_fmt rgb24 或 -pix_fmt yuv420p(在 -sws_flags 邻居之后)。
【解决方案2】:

您可以通过按比例缩小然后按比例放大来丰富您的目标,例如:

ffmpeg -i in.mp4 -vf scale=iw/4:ih/4,scale=4*iw:4*ih:flags=neighbor out.mp4 

4您可以根据自己的需要进行修改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 2021-03-11
    • 2016-04-20
    • 2014-11-05
    • 2018-12-21
    相关资源
    最近更新 更多