将图像序列转换为带透明度的视频

44

我遇到了一个看起来很简单的问题,但实际上比我预想的要困难得多。问题如下:

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

我想要编程将它们转换成视频剪辑。格式并不重要,但其必须是无损的,并且具有alpha通道。在Quicktime容器中的未压缩视频可能是最理想的。

我的初始想法是使用FFmpeg,但经过一整天的浪费之后,似乎它根本不支持alpha通道。要么我忽略了什么,要么是底层的libavcodec根本就不会实现它。

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

注意:在您的视频中具有alpha通道实际上并不常见,但如果您想将其合成到另一个视频剪辑或静止图像之上,则非常有用。就我所知,未压缩视频、Quicktime动画编解码器和Sorenson Video 3编解码器都支持透明度,我听说H.264也支持。我们真正要讨论的仅是32位颜色深度,这是相当广泛支持的;Quicktime .mov文件和Windows .avi文件都可以处理它,可能还有更多。

Quicktime Pro非常乐意将图像序列转换为32位.mov文件。点击导出,将颜色深度更改为“数百万种颜色+”,选择Animation编解码器,将质量调高到100,然后就可以得到无损压缩的视频,带有Alpha通道,并且由于该编解码器从Quicktime 1.0版本开始就已经存在,所以几乎在任何地方都可以回放。问题是,Quicktime Pro没有任何命令行界面(至少在Windows上)。ffmpeg支持使用Quicktime Animation编解码器(它称之为qtrle)进行编码,但它只支持24位的位深度。

问题不在于找到支持alpha通道的视频格式。Quicktime Animation会很理想,但即使是无压缩视频也应该可以。问题在于找到支持它的工具。

4个回答

34

是的,FFmpeg 支持视频文件中的 Alpha 通道。然而,FFmpeg 中并不是所有的编解码器都支持 Alpha 通道。将 Motion PNG 嵌入到 .MOV 文件中是一种良好的 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 用户可能需要添加引号并像往常一样更改某些 \ 为 /。


23

我知道这个话题有点旧了,但我还是要发表一下意见。

使用 Quicktime 动画(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


9
对于那些在寻找答案时感到沮丧的Web开发人员......创建透明的WebM视频是可能的,但目前您可能需要从源代码编译ffmpeg和所需的库。
我想在网站上显示一个渲染的Blender视频并保留透明度。第一步是将Blender输出呈现为单个PNG文件。之后,我花了很长时间试图强制ffmpeg将这些PNG文件转换为单个视频。基本命令很简单:
ffmpeg -i input%04d.png output.webm

这个命令将加载所有PNG文件, 文件名从input0000.pnginput9999.png, 并将它们转换为视频。透明度会被立即丢失。通过输出的排查, 我意识到ffmpeg正在自动选择一个不支持透明度的格式:Incompatible pixel format 'yuva420p' for codec 'flv', auto-selecting format 'yuv420p'。此时我意识到我可能需要从头重新编译ffmpeg。我尝试了其他一些工具,但最终还是回到了ffmpeg。在编译了最新的libvbx和ffmpeg源码后, 一切运作正常。

-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

注意:您可以通过传递-hide_banner来隐藏每次运行ffmpeg时出现的上述内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接