Arc*_*gon 14 video ffmpeg video-processing command-line-tool video-encoding
我有两个视频,我想将它们组合成一个视频,其中两个视频都位于静态背景图像之上.(认为像这样).我的要求是,我使用的软件是免费的,它运行在OSX,而我不必重新编码我的影片的次数过多的.我也希望能够从命令行或通过脚本执行此操作,因为我会做很多事情.(但这不是绝对必要的.)
我尝试用ffmpeg摆弄几个小时,但它似乎不太适合后期处理.我可能通过叠加功能一起破解某些东西,但到目前为止我还没有弄清楚如何做到这一点,除了痛苦 - 将图像转换为视频(这需要2倍于我的视频长度!)然后在另一个渲染步骤中将两个视频叠加到它上面.
有小费吗?谢谢!
更新:
感谢LordNeckbeard的帮助,我通过一个ffmpeg电话就能达到我想要的结果!不幸的是,编码速度非常慢,需要6秒才能编码1秒的视频.我相信这是由背景图片引起的.有关加速编码的任何提示?这是ffmpeg日志:
MacBook-Pro:Video archagon$ ffmpeg -loop 1 -i underlay.png -i test-slide-video-short.flv -i test-speaker-video-short.flv -filter_complex "[1:0]scale=400:-1[a];[2:0]scale=320:-1[b];[0:0][a]overlay=0:0[c];[c][b]overlay=0:0" -shortest -t 5 -an output.mp4
ffmpeg version 1.0 Copyright (c) 2000-2012 the FFmpeg developers
built on Nov 14 2012 16:18:58 with Apple clang version 4.0 (tags/Apple/clang-421.0.60) (based on LLVM 3.1svn)
configuration: --prefix=/opt/local --enable-swscale --enable-avfilter --enable-libmp3lame --enable-libvorbis --enable-libopus --enable-libtheora --enable-libschroedinger --enable-libopenjpeg --enable-libmodplug --enable-libvpx --enable-libspeex --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/clang --arch=x86_64 --enable-yasm --enable-gpl --enable-postproc --enable-libx264 --enable-libxvid
libavutil 51. 73.101 / 51. 73.101
libavcodec 54. 59.100 / 54. 59.100
libavformat 54. 29.104 / 54. 29.104
libavdevice 54. 2.101 / 54. 2.101
libavfilter 3. 17.100 / 3. 17.100
libswscale 2. 1.101 / 2. 1.101
libswresample 0. 15.100 / 0. 15.100
libpostproc 52. 0.100 / 52. 0.100
Input #0, image2, from 'underlay.png':
Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
Stream #0:0: Video: png, rgb24, 1024x768, 25 fps, 25 tbr, 25 tbn, 25 tbc
Input #1, flv, from 'test-slide-video-short.flv':
Metadata:
author :
copyright :
description :
keywords :
rating :
title :
presetname : Custom
videodevice : VGA2USB Pro V3U30343
videokeyframe_frequency: 5
canSeekToEnd : false
createdby : FMS 3.5
creationdate : Mon Aug 16 16:35:34 2010
encoder : Lavf54.29.104
Duration: 00:50:32.75, start: 0.000000, bitrate: 90 kb/s
Stream #1:0: Video: vp6f, yuv420p, 640x480, 153 kb/s, 8 tbr, 1k tbn, 1k tbc
Input #2, flv, from 'test-speaker-video-short.flv':
Metadata:
author :
copyright :
description :
keywords :
rating :
title :
presetname : Custom
videodevice : Microsoft DV Camera and VCR
videokeyframe_frequency: 5
audiodevice : Microsoft DV Camera and VCR
audiochannels : 1
audioinputvolume: 75
canSeekToEnd : false
createdby : FMS 3.5
creationdate : Mon Aug 16 16:35:34 2010
encoder : Lavf54.29.104
Duration: 00:50:38.05, start: 0.000000, bitrate: 238 kb/s
Stream #2:0: Video: vp6f, yuv420p, 320x240, 204 kb/s, 25 tbr, 1k tbn, 1k tbc
Stream #2:1: Audio: mp3, 22050 Hz, mono, s16, 32 kb/s
File 'output.mp4' already exists. Overwrite ? [y/N] y
using cpu capabilities: none!
[libx264 @ 0x7fa84c02f200] profile High, level 3.1
[libx264 @ 0x7fa84c02f200] 264 - core 119 - H.264/MPEG-4 AVC codec - Copyleft 2003-2011 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=3 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'output.mp4':
Metadata:
encoder : Lavf54.29.104
Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1024x768, q=-1--1, 25 tbn, 25 tbc
Stream mapping:
Stream #0:0 (png) -> overlay:main
Stream #1:0 (vp6f) -> scale
Stream #2:0 (vp6f) -> scale
overlay -> Stream #0:0 (libx264)
Press [q] to stop, [?] for help
Run Code Online (Sandbox Code Playgroud)
更新2:
有用!一个重要的调整是将underlay.png输入移动到输入列表的末尾.这大大提高了性能.这是我最后的ffmpeg电话.(此特定排列不需要最后的地图,但有时我会将一些额外的音频输入映射到我的输出.)
ffmpeg
-i VideoOne.flv
-i VideoTwo.flv
-loop 1 -i Underlay.png
-filter_complex "[2:0] [0:0] overlay=20:main_h/2-overlay_h/2 [overlay];[overlay] [1:0] overlay=main_w-overlay_w-20:main_h/2-overlay_h/2 [output]"
-map [output]:v
-map 0:a
OutputVideo.m4v
Run Code Online (Sandbox Code Playgroud)
llo*_*gan 53
ffmpeg中的复杂滤波器图形起初可能看起来很复杂,但是一旦你尝试了几次它就有意义了.您需要熟悉filtergraph语法.首先阅读过滤简介和过滤器图描述.您不必完全理解它,但它将帮助您理解以下示例.

使用scale视频过滤器将输入缩放(调整大小)为特定大小,然后使用overlay视频过滤器将视频放在静态图像上.
ffmpeg -loop 1 -i background.png -i video1.mp4 -i video2.mp4 -filter_complex \
"[1:v]scale=(iw/2)-20:-1[a]; \
[2:v]scale=(iw/2)-20:-1[b]; \
[0:v][a]overlay=10:(main_h/2)-(overlay_h/2):shortest=1[c]; \
[c][b]overlay=main_w-overlay_w-10:(main_h/2)-(overlay_h/2)[video]" \
-map "[video]" output.mkv
Run Code Online (Sandbox Code Playgroud)
-loop 1连续循环下一个输入background.png.
background.png背景图片.该流符是[0:v]它的大小1280×720.
video1.mp4这第一个视频输入(示例图像中的Big Buck Bunny).流说明符是[1:v].它的大小为640x360.
video2.mp4第二个视频输入(示例图像中的varmints).流说明符是[2:v].它的大小为640x360.
-filter_complex 启动复杂过滤器图的选项.
[1:v]scale=(iw/2)-20:-1[a]这是采取video1.mp4,称为[1:v]和缩放它.iw是输入宽度的别名,在这种情况下它是640的值.我们除以一半并减去另外20个像素作为填充,因此每个视频重叠时会有空间.-1意味着自动计算将保留方面的值.如果当然你可以省略繁琐并手动提供诸如的值scale=320:240.然后使用名为的输出链接标签,[a]以便稍后引用此输出.
[2:v]scale=(iw/2)-20:-1[b]与上面相同,但video2.mp4用作输入并将输出链接标签命名为[b].
[0:v][a]overlay=10:(main_h/2)-(overlay_h/2):shortest=1[c]使用background.png作为第一覆盖输入,并使用我们的第一尺度的过滤器,被称为的结果[a],作为第二覆盖输入.将[a]以上[0:v].main_h是主高度的别名,它指的是背景input([0:v])高度.overlay_h是叠加高度的别名,是指foreground([a])的高度.这个例子将Big Buck Bunny放在左侧.shortest=1当最短输入终止时,将强制输出终止; 否则它将永远background.png循环,因为循环.命名此过滤器的结果[c].
[c][b]overlay=overlay_w*2:overlay_h:shortest=1[video]使用[c]作为第一个覆盖输入和[b]作为第二覆盖输入.使用叠加参数overlay_w和overlay_h(叠加输入宽度和高度).此示例将verminy varmints放在右侧.将输出标记为[video].
-map "[video]"将过滤器的输出映射到输出文件.[video]filtergraph末尾的链接标签不一定是必需的,但建议使用映射显式.
默认情况下,只有遇到的第一个输入音频通道将在流选择中定义的输出中使用.您可以使用该-map选项从第二个视频输入添加额外的音轨(输出将有两个音频流).此示例将流复制音频而不是重新编码:
ffmpeg -loop 1 -i background.png -i video1.mp4 -i video2.mp4 -filter_complex \
"[1:v]scale=(iw/2)-20:-1[a]; \
[2:v]scale=(iw/2)-20:-1[b]; \
[0:v][a]overlay=10:(main_h/2)-(overlay_h/2):shortest=1[c]; \
[c][b]overlay=main_w-overlay_w-10:(main_h/2)-(overlay_h/2)[video]" \
-map "[video]" -map 1:a -map 2:a -codec:a copy output.mkv
Run Code Online (Sandbox Code Playgroud)
或者使用amerge和pan音频滤波器将两个音频输入组合成一个(假设两个输入都是立体声,你想要立体声输出):
ffmpeg -loop 1 -i background.png -i video1.mp4 -i video2.mp4 -filter_complex \
"[1:v]scale=(iw/2)-20:-1[a]; \
[2:v]scale=(iw/2)-20:-1[b]; \
[0:v][a]overlay=10:(main_h/2)-(overlay_h/2):shortest=1[c]; \
[c][b]overlay=main_w-overlay_w-10:(main_h/2)-(overlay_h/2)[video]" \
[1:a][2:a]amerge,pan=stereo:c0<c0+c2:c1<c1+c3[audio]" \
-map "[video]" -map "[audio]" output.mkv
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11260 次 |
| 最近记录: |