【问题标题】:How can I place a still image before the first frame of a video?如何在视频的第一帧之前放置静止图像?
【发布时间】:2014-07-28 22:25:21
【问题描述】:

当我通过 FFMpeg 对视频进行编码时,我想在第一个视频帧之前放置一个 jpg 图像,因为当我将视频嵌入到带有“视频”html5 标签的网页上时,它会将第一张图片显示为启动图像.或者,我想将图像编码为 1 帧视频并将其连接到我的编码视频。我不想使用“video”html5 元素的“poster”属性。

【问题讨论】:

    标签: image video ffmpeg splash-screen poster


    【解决方案1】:

    您可以使用 concat 过滤器来执行此操作。确切的命令取决于您希望启动屏幕的时间。我很确定你不想要一个 1 帧的初始屏幕,大约 1/25 到 1/30 秒,具体取决于视频;)

    答案

    首先,您需要获取视频的帧速率。尝试ffmpeg -i INPUT 并找到tbr 值。例如

    $ ffmpeg -i a.mkv
    ffmpeg version N-62860-g9173602 Copyright (c) 2000-2014 the FFmpeg developers
      built on Apr 30 2014 21:42:15 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
    [...]
    Input #0, matroska,webm, from 'a.mkv':
      Metadata:
        ENCODER         : Lavf55.37.101
      Duration: 00:00:10.08, start: 0.080000, bitrate: 23 kb/s
        Stream #0:0: Video: h264 (High 4:4:4 Predictive), yuv444p, 320x240 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
    At least one output file must be specified
    

    在上面的例子中,它显示25 tbr。记住这个号码。

    其次,您需要将图像与视频连接起来。试试这个命令:

    ffmpeg -loop 1 -framerate FPS -t SECONDS -i IMAGE \
           -t SECONDS -f lavfi -i aevalsrc=0 \
           -i INPUTVIDEO \
           -filter_complex '[0:0] [1:0] [2:0] [2:1] concat=n=2:v=1:a=1' \
           [OPTIONS] OUTPUT
    

    如果您的视频没有音频,请尝试以下操作:

    ffmpeg -loop 1 -framerate FPS -t SECONDS -i IMAGE \
           -i INPUTVIDEO \
           -filter_complex '[0:0] [1:0] concat=n=2:v=1:a=0' \
           [OPTIONS] OUTPUT
    

    FPS = tbr 从第 1 步得到的值

    SECONDS = 您希望图像显示的持续时间。

    IMAGE = 图片名称

    INPUTVIDEO = 原始视频名称

    [OPTIONS] = 可选编码参数(如-vcodec libx264-b:a 160k

    OUTPUT = 输出视频文件名

    这是如何工作的?

    让我们拆分我使用的命令行:

    -loop 1 -framerate FPS -t SECONDS -i IMAGE:这基本上意味着:打开图像,然后循环播放它以使其成为具有SECONDS 秒和FPS 每秒帧数的视频。您需要它与输入视频具有相同 FPS 的原因是因为我们稍后将使用的 concat 过滤器对其有限制。

    -t SECONDS -f lavfi -i aevalsrc=0:这意味着:产生 SECONDS 的静音(0 表示静音)。您需要沉默来填补启动图像的时间。如果原始视频没有音频,则不需要这样做。

    -i INPUTVIDEO:打开视频本身。

    -filter_complex '[0:0] [1:0] [2:0] [2:1] concat=n=2:v=1:a=1':这是最好的部分。您打开文件 0 流 0(图像-视频)、文件 1 流 0(静音音频)、文件 2 流 0 和 1(实际输入的音频和视频),并将它们concatenate 一起打开。选项nva表示有2个段,1个输出视频,1个输出音频。

    [OPTIONS] OUTPUT:这只是意味着将视频编码为输出文件名。如果您使用 HTML5 流媒体,您可能希望将 -c:v libx264 -crf 23 -c:a libfdk_aac (or -c:a libfaac) -b:a 128k 用于 H.264 视频和 AAC 音频。

    更多信息

    【讨论】:

    • 谢谢,它有效。但是如何通过我通常与 -vf 选项一起使用的其他过滤器:ffmpeg 说 -vf 和 -filter_complex 不能一起使用。
    • 您使用什么过滤器?对于scale,您必须先缩放图像,然后再进行concating。对于fps 或其他更改FPS 的人,您必须为-r 选项使用新的FPS。
    • 我正在为视频使用这个过滤器链:-vf 'crop=X:Y:W:Z, mp=eq2=1.35:1.02:0.05:1.04:1.0:1.0:1.0, scale =384:-1,setsar=1'
    • 有没有办法淡入/淡出启动画面? @TimothyGu
    • 对于上述命令 - 图片和视频是否必须相同大小?还是可以用命令覆盖它?
    【解决方案2】:

    上面的答案对我有用,但在我的情况下,它需要太多时间来执行(可能是因为它重新编码了整个视频)。我找到了另一个更快的解决方案。基本思路是:

    1. 创建一个只有图像的“视频”。
    2. 将上述视频与原始视频连接,无需重新编码。

    创建一个只有图片的视频:

    ffmpeg -loop 1 -framerate 30 -i image.jpg -c:v libx264 -t 3 -pix_fmt yuv420p image.mp4
    

    注意-framerate 30 选项。它必须与主视频相同。此外,图像应与主视频具有相同的尺寸。 -t 3 指定视频的长度(以秒为单位)。

    将视频转换为 MPEG-2 传输流

    根据 ffmpeg 官方文档,只有某些文件可以使用 concat 协议连接,这包括 MPEG-2 传输流。由于我们有 2 个 MP4 视频,它们可以无损地转换为 MPEG-2 TS:

    ffmpeg -i image.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts image.ts
    

    对于主视频:

    ffmpeg -i video.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts video.ts
    

    连接 MPEG-2 TS 文件

    现在使用以下命令连接上述中间文件:

    ffmpeg -i "concat:image.ts|video.ts" -c copy -bsf:a aac_adtstoasc output.mp4
    

    虽然有 4 个命令要运行,但它们组合起来仍然比重新编码整个视频要快得多。

    【讨论】:

    • 效果惊人!所有步骤本身都在瞬间执行,无需重新编码。但涉及大量的手工工作。 是否有人可以将它放在一个脚本中,一次性完成所有这些并在之后清理辅助“.ts”文件? 我想象它是这样的:insertStillframeToMP4.sh -p <durationInSecs> <picFile> -v <videoFile> -o <outputFile>-p-v 的参数顺序决定了图片是插入到视频之前还是之后。帧率是从 中读出的,带有一些 ffmpeg -i | grep parseFPSexpression.
    • 很好 :-) 这允许我在连接它们之前分别对图像和视频应用过滤器。尝试一次完成所有操作,就像蒂莫西的回答一样,给出了我无法修复的错误。
    • 顺便说一句,您可以将其更新为使用 h265。只需在第一个命令中将libx264 更改为libx265,并将h264_mp4toannexb 更改为hevc_mp4toannexb 即可。
    猜你喜欢
    • 1970-01-01
    • 2018-12-16
    • 2016-08-22
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    相关资源
    最近更新 更多