如何在视频的第一帧之前放置静止图像? [英] How can I place a still image before the first frame of a video?
问题描述
当我通过 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
将它们一起生成.选项 n
、v
和 a
表示有 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 concat
enate 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.
- 您可以查看
image2
分路器 这是-loop 1
背后的魔法核心. concat
过滤器 的文档也很有帮助.- 另一个很好的信息来源是 FFmpeg wiki 连接.
- 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屋!