Kon*_*tin 4 video ffmpeg image splash-screen poster
当我通过FFMpeg对视频进行编码时,我想在第一个视频帧之前放置一个jpg图像,因为当我将视频嵌入带有"video"html5标签的网页时,它会将第一张图片显示为初始图像.或者,我想将图像编码为1帧视频并将其连接到我的编码视频.我不想使用"video"html5元素的"poster"属性.
Mar*_*nne 13
上面的答案对我有用,但就我而言,执行时间太长(可能是因为它重新编码了整个视频)。我找到了另一个更快的解决方案。基本思想是:
创建一个只有图像的视频:
ffmpeg -loop 1 -framerate 30 -i image.jpg -c:v libx264 -t 3 -pix_fmt yuv420p image.mp4
Run Code Online (Sandbox Code Playgroud)
请注意该-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
Run Code Online (Sandbox Code Playgroud)
对于主要视频:
ffmpeg -i video.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts video.ts
Run Code Online (Sandbox Code Playgroud)
连接 MPEG-2 TS 文件
现在使用以下命令连接上述中间文件:
ffmpeg -i "concat:image.ts|video.ts" -c copy -bsf:a aac_adtstoasc output.mp4
Run Code Online (Sandbox Code Playgroud)
虽然有 4 个命令要运行,但结合起来,它们仍然比重新编码整个视频要快得多。
Tim*_* Gu 12
您可以使用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
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,它显示了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
Run Code Online (Sandbox Code Playgroud)
如果您的视频没有音频,请尝试以下操作:
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
Run Code Online (Sandbox Code Playgroud)
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(真实输入音频和视频),并将concat它们一起打开.选项n,v并且a意味着有2个段,1个输出视频和1个输出音频.
[OPTIONS] OUTPUT:这只是意味着将视频编码为输出文件名.如果您使用的是HTML5流媒体,则可能需要使用-c:v libx264 -crf 23 -c:a libfdk_aac (or -c:a libfaac) -b:a 128kH.264视频和AAC音频.
image2复用器的文档,这是背后的魔力核心-loop 1.concat过滤器的文档也很有帮助.| 归档时间: |
|
| 查看次数: |
4341 次 |
| 最近记录: |