ffmpeg - 使用 -filter_complex 对视频素材进行颜色分级并将原始源显示为画中画

Posted

技术标签:

【中文标题】ffmpeg - 使用 -filter_complex 对视频素材进行颜色分级并将原始源显示为画中画【英文标题】:ffmpeg - color-grading video material AND display original source as picture-in-picture, using -filter_complex 【发布时间】:2020-01-31 16:53:55 【问题描述】:

这是我在这个论坛上的第一篇文章,所以请小心,以防我不小心碰到任何我还不知道的论坛规则:)。

我想对水下 GoPro 镜头应用一些颜色分级。为了更快地衡量我的颜色设置的效果(到目前为止,试错),希望在底部将原始输入视频流视为 PIP(例如,缩小到 50% 甚至 30%) - 转换后的输出影片的右上角。

我有一部要进行颜色分级的输入电影。 PIP 应该使用原始文件作为输入,只是它的缩小版本。

我想使用 ffmpeg 的“-filter_complex”选项来制作 PIP,但我可以在“-filter_complex”上找到的所有示例都将使用两部已经存在的电影。相反,我想让颜色校正的流成为“-filter_complex”的即时输入,然后呈现 PIP。

这是否可行,一气呵成?

下面的两个单独的 sn-ps 都可以正常工作,我现在想将它们组合起来并跳过中间颜色分级 TMP 输出的创建,然后在最终的 PIP 创建过程中与原始输出组合。 非常感谢您帮助将这两个单独的步骤组合成一个“-filter_complex”操作!

提前致谢, 掠夺。

[existing code snippets (M$ batch files)]

::declarations/defines::
set "INPUT=<path-to-movie>"
set "TMP=<path-to-intermediate-output-movie>"
set "OUTPUT=<path-to-movie>"
set "FFMPG=<path-to-executable>"
set "QU=9" :: quality settings

set "CONV='"0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 
0 -1 0:0 -1 0 -1 5 -1 0 -1 0'"" :: sharpening convolution filter

::color-grading part::
%FFMPG% -i %INPUT% -vf convolution=%CONV%,colorbalance=rs=%rs%:gs=%gs%:bs=%bs%:rm=%rm%:gm=%gm%:bm=%bm%:rh=%rh%:gh=%gh%:bh=%bh% -q:v %QU% -codec:v mpeg4 %TMP%

::PIP part::
%FFMPG% -i %TMP% -i %INPUT% -filter_complex "[1]scale=iw/3:ih/3 
[pip]; [0][pip] overlay=main_w-overlay_w-10:main_h-overlay_h-10" -q:v 
%QU% -codec:v mpeg4 %OUTPUT%

[/existing code]

【问题讨论】:

您的代码调整了分级视频的大小并将其叠加在原始视频之上,但您说您希望缩放原始视频并将其叠加在分级视频之上。是哪个? 您好 Gyan,非常感谢您的回复,并发现我的错误 :)。在上面的代码中,我现在交换了视频:颜色分级 = 大,原始视频 = 小画中画,缩放 1/3,右下角。感谢您的通知:)!! @raven 为什么使用 mpeg4? @Ilogan:我对格式没有什么特殊要求,我的GoPro就是这样,所以我想,为什么不用它呢?您是否建议切换到另一种格式?如果是这样,您会推荐哪种格式?这个脚本的目的是在一个很小的(又名完全动力不足的!)平板电脑上运行,并在一个批处理过程中,在一夜之间执行基本的颜色分级。在第二天切割/加入分级的视频材料。 MP4 似乎可以正常工作,而不会让那个可怜的 8 英寸平板电脑陷入太多困境:)。 我假设 gopro 视频格式是 H.264。使用 mpeg4 将输出老一代的 MPEG-4 Part 2 视频。我会使用-c:v libx264 并使用-preset ultrafast 提高编码速度并添加-crf 18 以获得高质量,因为这似乎仅用于预览。 【参考方案1】:

这是一个经过修改(现在可以使用)的颜色分级批处理文件。

[revised code (M$ batch file)]

@echo off
cls
rem ------------------------------------------------------------------------
rem Purpose: color correction, saturation, sharpening for underwater video. 
rem Function: color-grades video, inserts the original video in lower right
rem corner as a PIP (picture-in-picture) overlay, for comparison
rem Error handling: basic. 
rem                 Checks for availability of input video (%IN%)
rem                 Deletes possibly pre-existing output file (%OUTP%) 
rem Inputs: %IN%
rem Outputs: %OUTP% (with ungraded video as PIP) 
rem Parameters: To be tested with actual GoPro footage (manual 6500K setting) 
rem ------------------------------------------------------------------------

::declarations/defines::
set "IN=<path-to-movie>"
set "OUTP=<path-to-movie>"
set "FFMPG=<path-to-executable>"

::test availability of input file::
if not exist %IN% (
echo "Error: No input file (in.mp4) found. Aborting script."
goto eof
)

::remove potentially existing output file:: 
if exist %OUTP% DEL %OUTP%

::convolution (sharpening)::
set "CONV='0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0'"

::equalizer settings::
set "CONTRAST=1.0"        :: Contrast in range -1000 to 1000 (normal is 1.0)
set "BRIGHT=0.0"          :: Brightness in range -1.0 to 1.0 (normal is 0.0)
set "SATUR=1.05"          :: Saturation in range 0.0 to 3.0 (normal is 1.0; the higher, the more pure the colors will get)
set "GAMMA=1.15"          :: Gamma in range 0.1 to 10.0 (normal is 1.0; greater 1.0 is more contrast, darker shades, brighter highlights)

::colorlevels settings::
set "rmin=0.10"           :: colorlevel red minimum
set "gmin=0.05"           :: colorlevel green minimum
set "bmin=0.05"           :: colorlevel blue minimum
set "rmax=0.70"           :: colorlevel red maximum
set "gmax=1.00"           :: colorlevel green maximum
set "bmax=0.95"           :: colorlevel blue maximum

::colorbalance and hue::
set "HUE=-5"              :: Color correction (hue), negative shifts towards red and positive towards blue, normal is 0, typical is -30...+30 range
set "rs=+0.00"            ::   red - cyan    :: Adjust red, green and blue shadows (darkest pixels) 
set "gs=-0.10"            :: green - magenta ::
set "bs=-0.10"            ::  blue - yellow  ::

set "rm=+0.10"            ::   red - cyan    :: Adjust red, green and blue midtones (medium pixels)
set "gm=-0.25"            :: green - magenta ::
set "bm=-0.25"            ::  blue - yellow  ::

set "rh=+0.05"            ::   red - cyan    :: Adjust red, green and blue highlights (brightest pixels)
set "gh=-0.20"            :: green - magenta ::
set "bh=-0.20"            ::  blue - yellow  ::

::equalizer (contrast, brightness, saturation, gamma)::
set "EQUALIZER=contrast=%CONTRAST%:brightness=%BRIGHT%:saturation=%SATUR%:gamma=%GAMMA%"

::colorlevels::
set "COLORLEVELS=rimin=%rmin%:gimin=%gmin%:bimin=%bmin%:rimax=%rmax%:gimax=%gmax%:bimax=%bmax%"

::colorbalance::
set "COLORBALANCE=rs=%rs%:gs=%gs%:bs=%bs%:rm=%rm%:gm=%gm%:bm=%bm%:rh=%rh%:gh=%gh%:bh=%bh%"

::applying all of these filter settings (color-grading and PIP combined)::
::using libx264 encoding and "-preset ultrafast", "-crf 18" for high quality, as recommended (for quick preview purposes rather than smallest file sizes)::
%FFMPG% -i %IN% -filter_complex "[0]scale=iw/3:-1[pip];[0]colorbalance=%COLORBALANCE%[1],[1]hue=h=%HUE%[2],[2]colorlevels=%COLORLEVELS%[3],[3]eq=%EQUALIZER%[4],[4]convolution=%CONV%[bg];[bg][pip]overlay=main_w-overlay_w-10:main_h-overlay_h-10 [v]" -map "[v]" -map 0:a -c:a copy -c:v libx264 -preset ultrafast -crf 18 %OUTP%
goto eof

:: End
:eof

[/revised code]

很好的回答,学到了不少东西,非常感谢:))!!

干杯,乌鸦。

【讨论】:

【参考方案2】:
ffmpeg -i input -filter_complex "[0]scale=iw/3:-1[pip];[0]convolution,colorbalance[bg];[bg][pip]overlay=main_w-overlay_w-10:main_h-overlay_h-10[v]" -map "[v]" -map 0:a -c:a copy output

这是一个简化的命令。您需要输入卷积和色彩平衡值并将其集成到批处理文件中。

说明:

    [0] 指的是第一个(并且仅在这种情况下)输入文件,并且是比例过滤器的输入。 scale 的输出被任意命名为[pip]。你可以给它任何你喜欢的名字。请参阅Filtering Introduction, Filtergraph description, and Filtergraph syntax 了解更多信息。 [0] 也用作卷积的输入。卷积的输出直接馈送到色彩平衡。过滤器的线性链通过逗号连接(见上面的链接)。 colorbalance 的输出命名为[bg]。 覆盖需要两个输入,它们是[bg][pip][pip] 覆盖在 [bg] 上。覆盖的输出名为[v]-map option 用于手动选择要放入输出的流。除非您完全了解默认的 stream selection 行为,否则养成使用 -map 的习惯通常是个好主意。 我假设输入音频是 AAC,因此您可以流式复制音频而不是重新编码。如果没有,那么您可以删除 -c:a copy 并根据您的输出文件格式选择默认编码器,或者您可以选择特定的编码器。

【讨论】:

好的,谢谢,我会尝试...你能解释一下你在这里使用的语法吗?我假设该命令将名称 [0] 分配给输入流“i”,然后采用 [0] 并创建一个 [pip] 子流,并采用 [0] 并创建一个 [bg] 子流。 [bg] 子流经过颜色分级和锐化。最后,您正在制作覆盖层......它被命名为 [v]......但是......“-map”命令有什么作用?最后,您不是重新编码流,而是简单地复制它......这个假设是真的吗?如果是这样,为什么推荐复制与重新编码?我很抱歉问了很多:)!! 我已经在我的脚本中尝试过您建议的方法(见下文),但收到如下错误消息:“无法识别的选项 '1'。拆分参数列表时出错:找不到选项”[代码] %FFMPG% -i %IN% -filter_complex "[0]scale=iw/3:-1[pip];[0]colorbalance=%COLORBALANCE%,convolution=%CONV%[bg];[bg][pip] overlay=main_w-overlay_w-10:main_h-overlay_h-10 [v]" -map "[v]" -map 0:a -c:a copy %OUT% [/code] 我哪里做错了,我哪里做错了错过?提前致谢!乌鸦。 @raven 先在cmd 或PowerShell 中运行命令。一旦你确认它可以工作,你就可以将它添加到你的批处理文件中。现在很难判断是 ffmpeg 命令还是批处理文件是罪魁祸首。 我会尽力而为......在 cmd shell 中运行原始命令并不容易 - 这些过滤器细节本身就是小怪物......但我确实设法创建了一个代理过滤器设置 - 并且有用!这是我放入 cmd 的内容(没有 [tags]): [code]ffmpeg -i in.mp4 -filter_complex "[0]scale=iw/3:-1[pip];[0] eq=gamma=1.5 :saturation=1.3[bg];[bg][pip]overlay=main_w-overlay_w-10:main_h-overlay_h-10[v]" -map [v]" -map 0:a -c:a copy out.mp4 [/code] ...实际上效果很好! 看起来你已经掌握了窍门。

以上是关于ffmpeg - 使用 -filter_complex 对视频素材进行颜色分级并将原始源显示为画中画的主要内容,如果未能解决你的问题,请参考以下文章

C语言下,ffmpeg怎么用?

FFmpeg使用 FFmpeg 处理音视频格式转换流程 ( 解复用 | 解码 | 帧处理 | 编码 | 复用 )

Mac M1芯片安装ffmpeg 以及使用

ffmpeg使用详解

怎么使用ffmpeg连续截图

iOS: FFmpeg编译和使用 学习