ffmpeg 使用过滤器分割 RGB 和 Alpha 通道
Posted
技术标签:
【中文标题】ffmpeg 使用过滤器分割 RGB 和 Alpha 通道【英文标题】:ffmpeg splitting RGB and Alpha channels using filter 【发布时间】:2012-06-30 22:25:51 【问题描述】:我正在尝试使用 ffmpeg 将输入文件拆分为两个单独的文件:
-
只有 R、G 和 B 通道的 MP4
带有“提取”A 通道的 MP4(所谓的 Key 剪辑,请参阅 http://ffmpeg-users.933282.n4.nabble.com/quot-Extracting-quot-Alpha-Channel-td3700227.html)
我已经设法做到这两点,但现在我想将它们组合成一个命令。这是我的工作:
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
INSERT_FILTER_HERE 在哪里:
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 的任何想法?
提前致谢!
【问题讨论】:
【参考方案1】:您需要使用-map
将过滤器的输出显式映射到输出文件。来自the documentation for -filter_complex
:
输出链接标签用
-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
之类的东西。查看答案中链接的文档以了解所有细节。
嗨,有没有办法让图像叠加层不透明?以上是关于ffmpeg 使用过滤器分割 RGB 和 Alpha 通道的主要内容,如果未能解决你的问题,请参考以下文章
从 YUV420P 到 RGB 的 FFMPEG Api 转换产生奇怪的输出
想要使用ffmpeg来完成如下两个功能: 1.视频截图 2.视频分割功能