44

我有一个看起来应该是一个非常简单的问题,但事实证明它比我预期的要困难得多。这是问题:

我有一个相当大的图像序列,由编号的帧组成(从 Maya 输出,值得一提)。这些图像目前是 Targa (.tga) 格式,但如果这很重要,我可以将它们转换为 PNG 或其他任意格式。重要的是,他们有一个 Alpha 通道。

我想做的是以编程方式将它们变成视频剪辑。格式并不重要,但它必须是无损的并且具有 Alpha 通道。Quicktime 容器中的未压缩视频可能是理想的。

我最初的想法是 ffmpeg,但是在浪费了一天的大部分时间之后,它似乎根本不支持 alpha 通道。要么我遗漏了一些东西,要么底层的 libavcodec 没有做到这一点。

那么,这里的正确方法是什么?像 ffmpeg 这样的命令行工具会很好,但是任何在 Windows 上运行并且可以从脚本调用的解决方案都可以。

注意:在您的视频中包含一个 alpha 通道实际上并不少见,如果您想将它合成到另一个视频剪辑或静止图像的顶部,它非常有用。据我所知,未压缩视频、Quicktime Animation 编解码器和 Sorenson Video 3 编解码器都支持透明,而且我听说 H.264 也支持。我们真正谈论的是 32 位色深,它得到了相当广泛的支持;Quicktime .mov 文件和 Windowss .avi 文件都可以处理它,而且可能更多。

Quicktime Pro 非常乐意将图像序列转换为 32 位 .mov 文件。点击导出,将颜色深度更改为“Millions of Colors+”,选择动画编解码器,将质量提高到 100,就可以了 - 无损压缩视频,带有 alpha 通道,它几乎可以在编解码器后的任何地方播放自 1.0 版以来一直是 Quicktime 的一部分。问题是,Quicktime Pro 没有任何类型的命令行界面(至少在 Windows 上)。ffmpeg 支持使用 Quicktime Animation 编解码器(它称为 qtrle)进行编码,但它仅支持 24 位的位深度。

问题在于找不到支持 Alpha 通道的视频格式。Quicktime Animation 将是理想的,但即使是未压缩的视频也应该可以工作。问题是找到一个支持它的工具。

4

4 回答 4

35

是的,ffmpeg 确实支持视频文件中的 alpha 通道。并非 ffmpeg 中的所有编解码器似乎都支持 alpha。.MOV 文件中的 Motion PNG 是 alpha 的一种很好的组合。

要将带有 alpha 的图像编码/导入到带有 alpha 的视频中,请尝试:ffmpeg -i %d.png -vcodec png z.mov

Quicktime 将播放它。

要将带有 alpha 的视频解码/导出为带有 alpha 的图像,请尝试:ffmpeg -i z.mov -f image2 export2\%d.png

请注意,我将它们导出到名为“export2”的目录中。请务必将 %d 部分留在其中。这些命令将按原样在 Windows 系统上运行。Linux/Mac 用户可能需要像往常一样添加引号并将一些 \ 换成 /。

于 2010-12-07T00:02:01.507 回答
23

我知道这个话题有点老了,但我还是在发帖。

带有 Quicktime Animation (RLE) 或 FFVHUFF/HUFFYUV 的 FFMPEG 可以。

  • ffmpeg -i yoursequence%d.png -vcodec qtrle movie_with_alpha.mov
  • ffmpeg -i yoursequence%d.png -vcodec ffvhuff movie_with_alpha.avi
  • ffmpeg -i yoursequence%d.png -vcodec huffyuv movie_with_alpha.avi

您将获得保留透明度(Alpha 通道)的视频文件。

我还听说 On2-VP6 变体(还不是 WebM-VP8)可以处理 alpha,但我手头没有他们的编解码器。

这也有效。- ffmpeg -i yoursequence%d.png -vcodec png movie_with_alpha.mov

于 2012-10-18T09:17:21.930 回答
9

对于遇到这个问题并沮丧地撞到墙上的 Web 开发人员来说……创建一个透明的 WebM 视频是可能的,但目前您可能需要从源代码编译 ffmpeg 和所需的库。

我想在网站上显示渲染的 Blender 视频,但要保持透明度。第一步是将 Blender 输出渲染为单独的 PNG 文件。在那之后,我花了很长时间试图强制 ffmpeg 将这些 PNG 文件转换为单个视频。基本命令很简单:

ffmpeg -i input%04d.png output.webm

此命令input0000.png通过文件名加载所有 PNG,input9999.png并将它们转换为视频。透明度很快就消失了。梳理输出我意识到 ffmpeg 有助于选择非透明格式:

Incompatible pixel format 'yuva420p' for codec 'flv', auto-selecting format 'yuv420p'

在这一点上,我意识到我可能必须从头开始重新编译 ffmpeg。我在其他一些工具上苦苦挣扎,但最终还是回到了 ffmpeg。从最新的源代码编译 libvbx 和 ffmpeg 之后,事情变得很有吸引力。

于 2014-01-29T18:13:19.497 回答
-1

检查您的 ffmpeg 版本

ffmpeg -version

ffmpeg 版本 n4.1.4 版权所有 (c) 2000-2019 FFmpeg 开发人员使用 gcc 7 (Ubuntu 7.4.0-1ubuntu1~18.04.1) 构建

您需要更新到 v4 才能使用 alpha 支持

sudo snap install ffmpeg 

注意,您需要从系统中丢弃旧的 ffmpeg。

sudo apt-get remove ffmpeg  
ffmpeg -version

ffmpeg version n4.1.4 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 7 (Ubuntu 7.4.0-1ubuntu1~18.04.1)
  configuration: --prefix= --prefix=/usr --disable-debug --disable-doc --disable-static --enable-avisynth --enable-cuda --enable-cuvid --enable-libdrm --enable-ffplay --enable-gnutls --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfontconfig --enable-libfreetype --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopus --enable-libpulse --enable-sdl2 --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libv4l2 --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxvid --enable-nonfree --enable-nvenc --enable-omx --enable-openal --enable-opencl --enable-runtime-cpudetect --enable-shared --enable-vaapi --enable-vdpau --enable-version3 --enable-xlib
  libavutil      56. 22.100 / 56. 22.100
  libavcodec     58. 35.100 / 58. 35.100
  libavformat    58. 20.100 / 58. 20.100
  libavdevice    58.  5.100 / 58.  5.100
  libavfilter     7. 40.101 /  7. 40.101
  libswscale      5.  3.100 /  5.  3.100
  libswresample   3.  3.100 /  3.  3.100
  libpostproc    55.  3.100 / 55.  3.100

注意 - 您可以通过传递来隐藏上述内容,以免每次运行 ffmpeg 时不断出现

-hide_banner

于 2020-07-05T11:50:08.310 回答