如何在视频的第一帧之前放置静止图像? [英] How can I place a still image before the first frame of a video?

查看:33
本文介绍了如何在视频的第一帧之前放置静止图像?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

When I encode videos by FFMpeg I would like to put a jpg image before the very first video frame, because when I embed the video on a webpage with "video" html5 tag, it shows the very first picture as a splash image. Alternatively I want to encode an image to an 1 frame video and concatenate it to my encoded video. I don't want to use the "poster" property of the "video" html5 element.

推荐答案

您可以使用 concat 过滤器来做到这一点.确切的命令取决于您希望启动画面的长度.我很确定您不想要 1 帧的启动画面,大约 1/25 到 1/30 秒,具体取决于视频;)

You can use the concat filter to do that. The exact command depends on how long you want your splash screen to be. I am pretty sure you don't want an 1-frame splash screen, which is about 1/25 to 1/30 seconds, depending on the video ;)

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

First, you need to get the frame rate of the video. Try ffmpeg -i INPUT and find the tbr value. E.g.

$ 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.记住这个号码.

In the above example, it shows 25 tbr. Remember this number.

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

Second, you need to concatenate the image with the video. Try this command:

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

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

If your video doesn't have audio, try this:

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 步得到的值

FPS = tbr value got from step 1

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

SECONDS = duration you want the image to be shown.

IMAGE = 图像名称

INPUTVIDEO = 原始视频名称

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

[OPTIONS] = optional encoding parameters (such as -vcodec libx264 or -b:a 160k)

OUTPUT = 输出视频文件名

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

Let's split the command line I used:

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

-loop 1 -framerate FPS -t SECONDS -i IMAGE: this basically means: open the image, and loop over it to make it a video with SECONDS seconds with FPS frames per second. The reason you need it to have the same FPS as the input video is because the concat filter we will use later has a restriction on it.

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

-t SECONDS -f lavfi -i aevalsrc=0: this means: generate silence for SECONDS (0 means silence). You need silence to fill up the time for the splash image. This isn't needed if the original video doesn't have audio.

-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(真正的输入音频和视频),然后 concat 将它们一起生成.选项 nva 表示有 2 个段,1 个输出视频和 1 个输出音频.

-filter_complex '[0:0] [1:0] [2:0] [2:1] concat=n=2:v=1:a=1': this is the best part. You open file 0 stream 0 (the image-video), file 1 stream 0 (the silence audio), file 2 streams 0 and 1 (the real input audio and video), and concatenate them together. The options n, v, and a mean that there are 2 segments, 1 output video, and 1 output audio.

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

[OPTIONS] OUTPUT: this just means to encode the video to the output file name. If you are using HTML5 streaming, you'd probably want to use -c:v libx264 -crf 23 -c:a libfdk_aac (or -c:a libfaac) -b:a 128k for H.264 video and AAC audio.

  • You can check out the documentation for the image2 demuxer which is the core of the magic behind -loop 1.
  • Documentation for concat filter is also helpful.
  • Another good source of information is the FFmpeg wiki on concatenation.

这篇关于如何在视频的第一帧之前放置静止图像?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆