首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在视频的第一帧之前放置静止图像?

如何在视频的第一帧之前放置静止图像?
EN

Stack Overflow用户
提问于 2014-06-08 01:56:06
回答 3查看 13.6K关注 0票数 16

当我用FFMpeg编码视频时,我想把一个jpg图像放在第一个视频帧之前,因为当我将视频嵌入到带有“视频”html5标记的网页上时,它会将第一张图片显示为一幅飞溅的图像。或者,我希望将图像编码为1帧视频,并将其连接到我编码的视频中。我不想使用“视频”html5元素的“海报”属性。

EN

回答 3

Stack Overflow用户

发布于 2014-06-08 22:21:01

您可以使用concat过滤器来完成这一任务。准确的命令取决于您希望花多长时间显示屏幕。我很确定你不想要一个1帧的飞溅屏幕,这是大约1/25至1/30秒,取决于视频;)

答案

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

代码语言:javascript
运行
复制
$ 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。记住这个号码。

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

代码语言:javascript
运行
复制
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

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

代码语言:javascript
运行
复制
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 =从步骤1得到的tbr

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:这意味着:生成几秒钟的沉默(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(真正的输入音频和视频),concat将它们合并在一起。选项nva意味着有两个片段,一个输出视频和一个输出音频。

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

更多信息

  • 您可以查看破碎机的文档,这是-loop 1背后神奇之处的核心。
  • 过滤器的文档也很有用。
  • 另一个很好的信息来源是连接的FFmpeg wiki
票数 30
EN

Stack Overflow用户

发布于 2019-06-27 08:27:06

上面的答案对我有用,但在我的例子中,执行起来花费了太多的时间(也许是因为它重新编码了整个视频)。我找到了另一个更快的解决方案。其基本思想是:

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

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

代码语言:javascript
运行
复制
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传输流。由于我们有两个MP4视频,它们可以被无损地转换为MPEG-2 TS:

代码语言:javascript
运行
复制
ffmpeg -i image.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts image.ts

至于主要视频:

代码语言:javascript
运行
复制
ffmpeg -i video.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts video.ts

连接MPEG-2 TS文件

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

代码语言:javascript
运行
复制
ffmpeg -i "concat:image.ts|video.ts" -c copy -bsf:a aac_adtstoasc output.mp4

尽管有4条命令要运行,但合并起来仍然比重新编码整个视频要快得多。

票数 15
EN

Stack Overflow用户

发布于 2022-04-20 10:09:38

我的解决方案。它将视频前5秒的图像和对齐视频设置为1280x720。图像应该有16/9的纵横比。

代码语言:javascript
运行
复制
ffmpeg -i video.mp4 -i image.png -filter_complex '
       color=c=black:size=1280x720 [temp]; \
       [temp][1:v] overlay=x=0:y=0:enable='between(t,0,5)' [temp]; \
       [0:v] setpts=PTS+5/TB, scale=1280x720:force_original_aspect_ratio=decrease, pad=1280:720:-1:-1:color=black [v:0]; \
       [temp][v:0] overlay=x=0:y=0:shortest=1:enable='gt(t,5)' [v]; \
       [0:a] asetpts=PTS+5/TB [a]'
-map [v] -map [a] -preset veryfast output.mp4
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24102336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档