【问题标题】:FFmpeg - feeding output of encode operation to filterFFmpeg - 将编码操作的输出馈送到过滤器
【发布时间】:2017-08-21 13:08:13
【问题描述】:

我想知道我们是否可以使用如下命令将编码操作的输出提供给“filter_complex”:

ffmpeg -i input.mp4 -c:v libx264 -s:v 1920x1080 -b:v 10000k "[encoder-output-1]" \
-c:v libx264 -s:v 1280x720 -b:v 5000k "[encoder-output-2]" \
-c:v libx264 -s:v 640x360 -b:v 2000k "[encoder-output-3]" \
-filter_complex "[encoder-output-1][0:v]psnr" -f null - \
-filter_complex "[encoder-output-2][0:v]psnr" -f null -\
-filter_complex "[encoder-output-3][0:v]psnr" -f null - 

如果我们可以做这样的事情,应该如何命名编码器的输出焊盘,以便可以在 filter_complex 中引用/映射它 如果没有,请让我知道实现此类目标的最简单方法是什么。

注意:

  1. 我将使用无法在内部计算 PSNR 分数的第三方编码器。因此,我想在 FFmpeg 过滤器中计算 PSNR。

【问题讨论】:

    标签: ffmpeg


    【解决方案1】:

    过滤器需要解码帧,所以不能直接使用编码输出。您可以将其通过管道传输到另一个 ffmpeg 进程。

    ffmpeg -i input.mp4 -map 0:v -map 0:v -map 0:v
           -c:v libx264 -b:v:0 10000k -b:v:1 5000k -b:v:2 2000k -f nut - | 
     ffmpeg -i input.mp4 -f nut -i -
            -filter_complex "[1:v:0][0:v]psnr;[1:v:1][0:v]psnr;[1:v:2][0:v]psnr" -f null -
    

    为避免对视频进行两次解码,请使用

    ffmpeg -i input.mp4 -map 0:v -map 0:v -map 0:v -map 0:v
           -c:v libx264 -c:v:3 rawvideo -b:v:0 10000k -b:v:1 5000k -b:v:2 2000k -f nut - | 
     ffmpeg -f nut -i -
            -filter_complex "[1:v:0][1:v:3]psnr;[1:v:1][1:v:3]psnr;[1:v:2][1:v:3]psnr" -f null -
    

    【讨论】:

    • 感谢您的意见。我试图避免对输入进行两次解码,因为它是一个非常高比特率的输入内容。因此,我试图避免使用管道。有没有办法在第一个管道中的编码器之后引入解码器?
    • 太棒了!这应该有效。我需要一个小小的说明。如果我使用的第三方编码器不支持 x264 等多比特率模式,我将需要该编码器的多个实例。在这种情况下,我应该使用命名管道来管道输出吗?
    • 你能举个例子吗?多比特率模式是 ffmpeg 的特性,而不是编码器。 ffmpeg 为每个映射流创建上下文并为它们调用编码器。
    • 不知道多比特率模式是 FFmpeg 的一个特性。我的用例可能涉及多个流,每个流具有不同的分辨率
    • 在这种情况下,我将为这些分辨率中的每一个设置多个 x264 实例。我认为解决这个问题的方法是使用多个命名管道,正如link 中所建议的那样。我想知道是否有更好的方法将多个输出传递给下一个 ffmpeg 实例。
    猜你喜欢
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 2022-01-05
    • 2019-08-07
    相关资源
    最近更新 更多