代码之家  ›  专栏  ›  技术社区  ›  Cody Hatch

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

  •  29
  • Cody Hatch  · 技术社区  · 15 年前

    我有一个看起来很简单的问题,但事实证明比我预想的要难得多。问题是:

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

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

    我最初的想法是ffmpeg,但在浪费了一天的时间之后,它似乎根本不支持alpha频道。要么我漏掉了什么,要么底层的libavcodec就是做不到。

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

    注意:在你的视频中有一个alpha香奈儿其实并不少见,如果你想在另一个视频剪辑或静止图像上合成它,它真的很有用。据我所知,未压缩视频、Quicktime动画编解码器和Sorenson video 3编解码器都支持Transparency,我听说H.264也支持Transparency。我们真正谈论的是32位的颜色深度,这是相当广泛的支持;两个都很快。mov文件和窗口。avi文件可以处理它,可能还有更多。

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

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

    5 回复  |  直到 15 年前
        1
  •  35
  •   Bonts    14 年前

    是的,ffmpeg确实支持视频文件中的alpha通道。ffmpeg中并非所有的编解码器都支持alpha-tho。在一个动画中运动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用户可能需要添加引号,并像往常一样交换一些。

        2
  •  23
  •   satoc    12 年前

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

    FFMPEG和Quicktime动画(RLE)或FFVHUFF/HUFFYUV都可以。

    • ffmpeg-i yoursequence%d.png-vcodec qtrle movie_with_alpha。压敏电阻
    • ffmpeg-i yoursequence%d.png-vcodec ffvhuff movie_with_alpha。阿维
    • ffmpeg-i yoursequence%d.png-vcodec huffyuv movie_with_alpha。阿维

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

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

    这也有效。 -ffmpeg-i yoursequence%d.png-vcodec png movie_with_alpha。压敏电阻

        3
  •  9
  •   thirdender    11 年前

    对于遇到这个问题并沮丧地把头撞在墙上的web开发人员来说,创建一个 transparent WebM video ,但目前您可能需要从源代码处编译ffmpeg和所需的库。

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

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

    此命令加载所有带有文件名的PNG input0000.png 通过 input9999.png 把它们变成视频。透明度很快就丧失了。通过梳理输出,我意识到ffmpeg选择了一种不透明的格式:

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

    此时,我意识到可能需要从头开始重新编译ffmpeg。我努力使用其他一些工具,但最终还是使用了ffmpeg。在从最新的源代码编译libvbx和ffmpeg之后,一切都很顺利。

        4
  •  -1
  •   johndpope    4 年前

    检查您的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跑步时隐藏上面的内容,以免它们不断出现

    -隐藏横幅