Video ffmpeg使用滤波器分割RGB和Alpha通道

Video ffmpeg使用滤波器分割RGB和Alpha通道,video,ffmpeg,video-processing,Video,Ffmpeg,Video Processing,我尝试使用ffmpeg将输入文件拆分为两个单独的文件: 仅具有R、G和B通道的MP4 带有“提取”通道的MP4(所谓的按键剪辑,请参阅) 我已经设法做到了这两个,但现在我想把它们合并成一个命令。我是这样做的: ffmpeg -r $FPS -y -i input.flv -vcodec libx264 -vpre ipod640 -acodec libfaac -s 256x256 -r $FPS -filter_complex INSERT_FILTER_HERE rgb.mp4 alpha.

我尝试使用ffmpeg将输入文件拆分为两个单独的文件:

  • 仅具有R、G和B通道的MP4
  • 带有“提取”通道的MP4(所谓的按键剪辑,请参阅)
  • 我已经设法做到了这两个,但现在我想把它们合并成一个命令。我是这样做的:

    ffmpeg -r $FPS -y -i input.flv -vcodec libx264 -vpre ipod640 -acodec libfaac -s 256x256 -r $FPS -filter_complex INSERT_FILTER_HERE rgb.mp4 alpha.mp4
    
    此处插入过滤器的位置为:

    format=rgba, split [rgb_in][alpha_in];
    [rgb_in] fifo, lutrgb=a=minval [rgb_out];
    [alpha_in] format=rgba, split [T1], fifo, lutrgb=r=maxval:g=maxval:b=maxval, [T2] overlay [out];
    [T1] fifo, lutrgb=r=minval:g=minval:b=minval [T2]
    
    简而言之,我将文件分为两个流,对于第一个流,我“删除”alpha通道,对于第二个流,我提取alpha通道的灰度表示。当我把它放到graph2dot中时,它工作得很好,输出为nullsink

    但是,当我使用-filter_complex在ffmpeg中运行它时,我得到:

    ffmpeg version N-41994-g782763e Copyright (c) 2000-2012 the FFmpeg developers
      built on Jun 28 2012 17:45:15 with gcc 4.6.3
      configuration: --enable-gpl --enable-nonfree --enable-pthreads --enable-filters --enable-libfaac --enable-libmp3lame --enable-libx264 --enable-libtheora --enable-libvpx --enable-postproc --enable-avfilter
      libavutil      51. 63.100 / 51. 63.100
      libavcodec     54. 29.101 / 54. 29.101
      libavformat    54. 11.100 / 54. 11.100
      libavdevice    54.  0.100 / 54.  0.100
      libavfilter     3.  0.100 /  3.  0.100
      libswscale      2.  1.100 /  2.  1.100
      libswresample   0. 15.100 /  0. 15.100
      libpostproc    52.  0.100 / 52.  0.100
    Input #0, flv, from 'input.flv':
      Metadata:
        audiodelay      : 0
        canSeekToEnd    : true
      Duration: 00:01:10.56, start: 0.000000, bitrate: 1964 kb/s
        Stream #0:0: Video: vp6a, yuva420p, 800x950, 1536 kb/s, 25 tbr, 1k tbn, 1k tbc
        Stream #0:1: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s
    [graph 0 input from stream 0:0 @ 0x2e4c6e0] w:800 h:950 pixfmt:yuva420p tb:1/30 fr:30/1 sar:0/1 sws_param:flags=2
    Output pad "default" for the filter "Parsed_lutrgb_3" of type "lutrgb" not connected to any destination
    
    关于如何让ffmpeg认识到它必须将[rgb_out]写入rgb.mp4和[out]写入alpha.mp3,有什么想法吗


    提前谢谢

    您需要使用
    -map
    将过滤器的输出显式映射到输出文件。发件人:

    输出链接标签用
    -map
    引用。未标记的输出将添加到第一个输出文件中

    例如,将图像覆盖在视频上

    ffmpeg -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]'\
      -map '[out]' out.mkv
    
    因此,在您的情况下,您可能需要以下内容:

    ffmpeg ... -i input ... -filter_complex 'split [rgb_in][alpha_in]; ... [rgb_out];\
      ... [alpha_out]' -map '[rgb_out]' rgb.mp4 -map '[alpha_out]' alpha.mp4
    

    这是可行的,但似乎音频没有被正确接收。ffprobe在两个mp4上仅显示一个流(视频)。有什么想法吗?你也必须明确地映射音频。类似于
    -map 0:a的内容出现在每个输出文件之前。看一看答案中链接的文档,了解所有的细节。嗨,有没有办法给图像叠加增加透明度?