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

时间:2009-03-13 21:27:13

标签: command-line video transparency ffmpeg codec

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

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

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

我最初的想法是ffmpeg,但是在浪费了大部分时间之后,它似乎根本没有对alpha通道的支持。要么我缺少某些东西,要么底层的libavcodec不会这样做。

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

注意:在你的视频中使用alpha chanel实际上并不是那么罕见,如果你想将它合成在另一个视频片段或静止图像之上,它真的很有用。据我所知,未压缩的视频,Quicktime动画编解码器和Sorenson Video 3编解码器都支持透明度,我也听说过H.264。我们真正谈论的是32位色深,这得到了广泛支持; Quicktime .mov文件和Windowss .avi文件都可以处理它,也可能更多。

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

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

6 个答案:

答案 0 :(得分:27)

是的,ffmpeg当然支持视频文件中的alpha通道。并非ffmpeg中的所有编解码器似乎都支持alpha。 .MOV文件中的动态PNG是alpha的一个很好的组合。

使用alpha编辑/导入带有alpha的图像,并尝试使用alpha:ffmpeg -i %d.png -vcodec png z.mov

Quicktime会播放它。

使用alpha尝试使用alpha解码/导出带有alpha的视频:ffmpeg -i z.mov -f image2 export2\%d.png

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

答案 1 :(得分:14)

我知道这个话题有点旧,但无论如何我都在发帖。

使用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

答案 2 :(得分:3)

对于网页开发人员来说,这是一个问题并且沮丧地撞到了墙上......可以创建一个transparent WebM video,但目前你可能需要从源代码编译ffmpeg和所需的库。

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

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

此命令会加载文件名为input0000.pnginput9999.png的所有PNG,并将其转换为视频。透明度很快就失去了。通过输出我意识到ffmpeg有助于选择不透明的格式:

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

此时我意识到我可能需要从头开始重新编译ffmpeg。我在使用其他一些工具时遇到了困难,但最终还是以ffmpeg回归。在从最新的源代码编译libvbx和ffmpeg之后,事情变得很有魅力。

答案 3 :(得分:1)

我假设您或其他人很可能希望在交互式闪存中使用此类视频。这是一个关于这样做的教程,包括ffmpeg使用png中的alpha通道编译到未压缩的avi。

http://away3dtutorials.blogspot.com/2011/02/ffmpeg-to-compile-jpeg-to-video-with.html

答案 4 :(得分:0)

科迪,

您可以使用Quicktime SDK for Windows编写自己的命令行实用程序,我建议您坚持使用更高级别的Quicktime COM apis,如果您真的需要,只需深入研究C-API。

-Nick

答案 5 :(得分:-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