sda*_*aau 38 linux command-line video-editing
我有相当简单的编辑需求 - 我需要剪切一些视频,也许在它们之间插入一些 PNG,然后加入这些视频(不需要过渡、效果等)。基本上,pitivi
可以做我想做的事 - 除了,我使用来自相机的 640x480 30 fps AVI,一旦我放入这种材料超过几分钟,pitivi
预览时就会开始冻结,因此变得无法使用。
所以,我开始寻找 Linux 的命令行工具;我想只有ffmpeg
(命令行 - 使用 ffmpeg 剪切视频 - 超级用户)和mplayer
(Sam - 在 linux 下使用 mencoder 编辑视频文件)是目前的候选者,但我找不到我想到的使用示例。
基本上,我想有一个编码器和播放器工具(如ffmpeg
vs ffplay
; 或mencoder
vs mplayer
) - 这样,首先,可以直接在命令行上指定编辑序列,最好使用帧分辨率 - 伪代码如下所示:
videnctool -compose --file=vid1.avi --start=00:00:30:12 --end=00:01:45:00 --file=vid2.avi --start=00:05:00:00 --end=00:07:12:25 --file=mypicture.png --duration=00:00:02:00 --file=vid3.avi --start=00:02:00:00 --end=00:02:45:10 --output=editedvid.avi
Run Code Online (Sandbox Code Playgroud)
...或者,它可以有一个“播放列表”文本文件,例如:
vid1.avi 00:00:30:12 00:01:45:00
vid2.avi 00:05:00:00 00:07:12:25
mypicture.png - 00:00:02:00
vid3.avi 00:02:00:00 00:02:45:10
Run Code Online (Sandbox Code Playgroud)
...所以它可以被称为
videnctool -compose --playlist=playlist.txt --output=editedvid.avi
Run Code Online (Sandbox Code Playgroud)
这里的想法是所有视频都采用相同的格式 - 允许该工具避免转码,而只需执行“原始副本”(如mencoder
的复制编解码器:“ -oac copy -ovc copy
”) - 或者没有,未压缩的音频/视频就可以了(尽管它会占用一些空间)。在静止图像的情况下,该工具将使用视频文件设置的编码。
问题是,到目前为止,我可以看到mencoder
并且ffmpeg
可以对单个文件进行操作;例如从单个文件中剪切单个部分,或连接文件(mencoder
也有Edit Decision Lists (EDL),可用于进行精确帧剪切- 因此您可以定义多个剪切区域,但它再次归因于单个文件)。这意味着我必须首先从单个文件中切割片段(每个文件都需要在磁盘上拥有自己的临时文件),然后将它们加入最终的视频文件中。
然后我会想象,有一个相应的播放器工具,它可以读取与编码工具相同的命令行选项格式/播放列表文件——除了它不会生成输出文件,而是播放视频;例如在伪代码中:
vidplaytool --playlist=playlist.txt --start=00:01:14 --end=00:03:13
Run Code Online (Sandbox Code Playgroud)
...而且,如果有足够的内存,它会在 RAM 中生成低分辨率视频预览,并在窗口中播放,同时提供一些有限的交互(例如用于播放、暂停、倒带、步进帧mplayer
的键盘快捷键)。当然,我会想象开始和结束时间是指整个播放列表,并包括可能最终出现在播放列表中该区域的任何文件。
因此,这一切的最终结果将是:命令行操作;编辑时没有临时文件 - 渲染最终输出时也没有临时文件(或转码)......我自己认为这会很好。
所以,虽然我认为上述所有内容可能有点牵强 - 是否存在与上述工作流程近似的东西?
sda*_*aau 24
好的,因为我找不到关于melt
命令行使用的太多信息,这里有一些注释..(在此之后,请参阅此答案Using process replacement to trick program expecting files, with specific extensions as argument? - Unix & Linux Stack Exchange for a script示例通过bash
)
首先 - 有一个 Ubuntu/Debian 包melt
(我有 Ubuntu 11.04 和 MLT Melt 0.6.2);@Ielton给出的链接是“Media Lovin' Toolkit”(MLT)Wiki,它melt
是(但也是openshot
和kdenlive
)的一部分。这是来自他们的 git 的文档文本文件的链接:mltframework.org/mlt.git/tree - docs/;请注意维基有一个关于BuildScripts的页面。
目前,我遇到的最大(唯一)问题是我找不到导出未压缩视频组合(作为png
帧或某些未压缩视频格式)的方法。
首先,在命令行中melt
您可以通过帧控制播放;例如,要“创建”一个 15 帧长的白色空白,并使用内置melt
播放器查看它,请使用
melt -blank 15
Run Code Online (Sandbox Code Playgroud)
当您查看时melt
,您还将获得stderr
内置播放器的命令行信息:
$ melt -blank 15
+-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+
|1=-10| |2= -5| |3= -2| |4= -1| |5= 0| |6= 1| |7= 2| |8= 5| |9= 10|
+-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+
+---------------------------------------------------------------------+
| H = back 1 minute, L = forward 1 minute |
| h = previous frame, l = next frame |
| g = start of clip, j = next clip, k = previous clip |
| 0 = restart, q = quit, space = play |
+---------------------------------------------------------------------+
Current Position: 15
Run Code Online (Sandbox Code Playgroud)
一旦melt
完成播放,它就不会退出 - 所以你应该输入q
退出它。
我们应该注意到,在melt
. 如果未指定任何内容,则默认的“消费者”是播放视频的SDL(简单直接媒体层)窗口;所以上面的命令是一样的:
melt -blank 15 -consumer sdl
Run Code Online (Sandbox Code Playgroud)
因此,如果我们想保存melt
显示的内容,我们应该将使用者更改为支持文件格式的内容。要获取消费者列表:
$ melt -query "consumers"
---
consumers:
- sdl
- sdl_audio
- sdl_preview
- sdl_still
- gtk2_preview
- avformat
- libdv
- xml
- decklink
- null
...
Run Code Online (Sandbox Code Playgroud)
该libdv
消费者将输出DV格式的数据直接stdout
,所以保存视频到.dv
你做的文件:
melt -blank 15 -consumer libdv > test.dv
Run Code Online (Sandbox Code Playgroud)
请注意,从列出的消费者中,我尝试过的唯一格式也可以在另一个应用程序中打开是libdv
(我用作vlc
另一个应用程序);但是,对于不同类型的转码,这可能会失败(例如,如果我尝试从.flv
文件中转换片段而不是空白,则生成的 .dv 文件会打开并在 .dv 中播放vlc
,但已损坏)。
现在是编辑部分;本质上,您可以直接在命令行上指定一系列文件名/in/out 节;假设您有一个文件,video.avi
那么您可以执行以下操作:
melt video.avi in=30 out=79 -blank 15 video.avi in=30 out=79
Run Code Online (Sandbox Code Playgroud)
或稍微好一点的格式:
melt \
video.avi in=30 out=79 \
-blank 15 \
video.avi in=30 out=79
Run Code Online (Sandbox Code Playgroud)
这意味着video.avi
将播放从第 30 帧到第 79 帧;然后是 15 帧空白;然后video.avi
再次从第 30 帧到第 79 帧的序列。
要.png
在视频编辑合成中使用图像(例如):
melt \
video.avi in=30 out=79 \
test.png in=0 out=15 \
video.avi in=30 out=79 \
-blank 15
Run Code Online (Sandbox Code Playgroud)
请注意,对于test.png
,in=
参数不需要为 0 - 但是,图像将显示out
-in
时间;在这种情况下,最简单的方法是将in=0
参数完全省略。
好消息是这个编辑序列可以被保存——或者melt
称之为,序列化——到一个文件;请注意,这种序列化有两种方式:“简单”或 XML。例如,要将上述命令保存为“简单”序列化文件,我们可以将-serialise [filename]
开关添加到命令中:
$ melt video.avi in=30 out=79 -blank 15 video.avi in=30 out=79 -serialise file.melt
Project saved as file.melt.
Run Code Online (Sandbox Code Playgroud)
现在file.melt
包含:
video.avi
in=30
out=79
-blank
15
video.avi
in=30
out=79
Run Code Online (Sandbox Code Playgroud)
看起来,这种“简单”的序列化文件格式不包含“评论”字符——如果我尝试添加“ # comment
”行,则会melt
抱怨:“无法加载“#评论” ”(但除此之外,似乎这样一行被忽略,播放继续)。" .melt
" 似乎是一个melt
识别为简单序列化文件的扩展名。
现在,要重新播放这个序列化文件,我们原则上可以调用melt file.melt
- 但是,更完整的命令行是:
melt melt_file:file.melt -consumer sdl
Run Code Online (Sandbox Code Playgroud)
...这意味着:使用melt_file
“生产者”打开file.melt
,并在“消费者” sdl
(窗口)上呈现其框架。
请注意,我有经验,(比如说).flv
视频在命令行上播放没有问题 - 但是,在file.melt
序列化文件中指定它们时会导致分段错误!自己.dv
制作的视频melt
,似乎在file.melt
...
XML 类型的序列化可以通过使用-consumer xml:
开关(而不是-serialise
)来实现- 所以上面的例子现在是:
melt video.avi in=30 out=79 -blank 15 video.avi in=30 out=79 -consumer xml:file.mlt
Run Code Online (Sandbox Code Playgroud)
要“回放”新生成的file.mlt
XML 文件,现在可以直接执行melt file.mlt
- 或者,更完整的命令行是:
melt xml:file.mlt -consumer sdl
Run Code Online (Sandbox Code Playgroud)
...这意味着:使用xml
“生产者”(注意,以前它是消费者)打开file.mlt
,并在“消费者” sdl
(窗口)上呈现其框架。
请注意,在这种情况下,我遇到过.flv
使用简单序列化文件导致段错误的相同视频 - 使用 XML 序列化文件可以正常工作!
在这种情况下,生成的file.mlt
XML 文件具有更多设置,例如分辨率、帧速率、编解码器信息等 - 但直接在文本编辑器中使用也更加困难:
<?xml version="1.0" encoding="utf-8"?>
<mlt root="/path/to" title="video.avi">
<profile description="automatic" width="320" height="240" progressive="1" sample_aspect_num="1" sample_aspect_den="1" display_aspect_num="320" display_aspect_den="240" frame_rate_num="25" frame_rate_den="1" colorspace="601"/>
<producer id="producer0" in="30" out="79">
<property name="mlt_type">producer</property>
<property name="aspect_ratio">1.000000</property>
<property name="length">125</property>
<property name="eof">pause</property>
<property name="resource">video.avi</property>
<property name="meta.media.nb_streams">2</property>
<property name="meta.media.0.stream.type">video</property>
<property name="meta.media.0.stream.frame_rate">25.000000</property>
<property name="meta.media.0.stream.sample_aspect_ratio">0.000000</property>
<property name="meta.media.0.codec.frame_rate">25.000000</property>
<property name="meta.media.0.codec.pix_fmt">yuv420p</property>
<property name="meta.media.0.codec.sample_aspect_ratio">1.000000</property>
<property name="meta.media.0.codec.colorspace">601</property>
<property name="meta.media.0.codec.name">mpeg4</property>
<property name="meta.media.0.codec.long_name">MPEG-4 part 2</property>
<property name="meta.media.0.codec.bit_rate">0</property>
<property name="meta.media.1.stream.type">audio</property>
<property name="meta.media.1.codec.sample_fmt">s16</property>
<property name="meta.media.1.codec.sample_rate">22050</property>
<property name="meta.media.1.codec.channels">1</property>
<property name="meta.media.1.codec.name">mp2</property>
<property name="meta.media.1.codec.long_name">MP2 (MPEG audio layer 2)</property>
<property name="meta.media.1.codec.bit_rate">64000</property>
<property name="seekable">1</property>
<property name="meta.media.sample_aspect_num">1</property>
<property name="meta.media.sample_aspect_den">1</property>
<property name="meta.attr.title.markup"></property>
<property name="meta.attr.author.markup"></property>
<property name="meta.attr.copyright.markup"></property>
<property name="meta.attr.comment.markup"></property>
<property name="meta.attr.album.markup"></property>
<property name="audio_index">1</property>
<property name="video_index">0</property>
<property name="mlt_service">avformat</property>
</producer>
<producer id="producer1" in="30" out="79">
<property name="mlt_type">producer</property>
<property name="aspect_ratio">1.000000</property>
<property name="length">125</property>
<property name="eof">pause</property>
<property name="resource">video.avi</property>
<property name="meta.media.nb_streams">2</property>
<property name="meta.media.0.stream.type">video</property>
<property name="meta.media.0.stream.frame_rate">25.000000</property>
<property name="meta.media.0.stream.sample_aspect_ratio">0.000000</property>
<property name="meta.media.0.codec.frame_rate">25.000000</property>
<property name="meta.media.0.codec.pix_fmt">yuv420p</property>
<property name="meta.media.0.codec.sample_aspect_ratio">1.000000</property>
<property name="meta.media.0.codec.colorspace">601</property>
<property name="meta.media.0.codec.name">mpeg4</property>
<property name="meta.media.0.codec.long_name">MPEG-4 part 2</property>
<property name="meta.media.0.codec.bit_rate">0</property>
<property name="meta.media.1.stream.type">audio</property>
<property name="meta.media.1.codec.sample_fmt">s16</property>
<property name="meta.media.1.codec.sample_rate">22050</property>
<property name="meta.media.1.codec.channels">1</property>
<property name="meta.media.1.codec.name">mp2</property>
<property name="meta.media.1.codec.long_name">MP2 (MPEG audio layer 2)</property>
<property name="meta.media.1.codec.bit_rate">64000</property>
<property name="seekable">1</property>
<property name="meta.media.sample_aspect_num">1</property>
<property name="meta.media.sample_aspect_den">1</property>
<property name="meta.attr.title.markup"></property>
<property name="meta.attr.author.markup"></property>
<property name="meta.attr.copyright.markup"></property>
<property name="meta.attr.comment.markup"></property>
<property name="meta.attr.album.markup"></property>
<property name="audio_index">1</property>
<property name="video_index">0</property>
<property name="mlt_service">avformat</property>
</producer>
<playlist id="playlist0">
<entry producer="producer0" in="0" out="49"/>
<blank length="16"/>
<entry producer="producer1" in="0" out="49"/>
</playlist>
<tractor id="tractor0" title="video.avi" global_feed="1" in="0" out="115">
<track producer="playlist0"/>
</tractor>
</mlt>
Run Code Online (Sandbox Code Playgroud)
Iel*_*ton 18
就在这里。尝试使用名为“Melt”的应用程序。请参阅此处的文档。
如果您使用 Debian 派生发行版:
apt-get install melt
Run Code Online (Sandbox Code Playgroud)
小智 7
这个问题的 ffmpeg 解决方案看起来像这样:
mkfifo temp1 temp2 temp3
ffmpeg -i input.wmv -ss 30 -to 60 -c copy output.wmv temp1 2> /dev/null & \
ffmpeg -i input2.wmv -t 60 -c copy temp2 2> /dev/null & \
ffmpeg -i input3.wmv -i image.png -filter_complex "[0:v][1:v] \
overlay=25:25:enable='between(t,0,20)'" -pix_fmt yuv420p -c:a copy temp3 2> /dev/null & \
ffmpeg -f mpegts -i "concat:temp1|temp2|temp3" -c copy output.mp4
Run Code Online (Sandbox Code Playgroud)
它使用命名管道,因此无需在磁盘上创建临时文件,并允许您剪切视频剪辑块并添加图像。
本示例使用第一个输入的时间 30-60,然后添加第二个输入的第一分钟,然后插入一个图像文件,然后插入整个第三个视频。
代码取自:
ffmpeg 连接页面:https : //trac.ffmpeg.org/wiki/Concatenate
超级用户页面使用 ffmpeg 剪切视频
超级用户页面https://video.stackexchange.com/questions/12105/add-an-image-in-front-of-video-using-ffmpeg
小智 5
我也一直在寻找这样的工具,它似乎确实是该工作的工具,但是文档几乎不可能理解/丢失。您几乎可以进行任何编辑组合。我有一些“动作摄像机”镜头……但声音无法使用。我加入了 (h264) 视频,添加了 60 帧淡入淡出,并使用以下音轨替换了声音:
% melt -video-track vid1.avi vid2.avi -mix 60 -mixer luma vid3.avi \
-mix 60 -mixer luma -audio-track vorbis:track1.ogg vorbis:track2.ogg \
-consumer avformat:OUT.avi acodec=libmp3lame vcodec=libx264
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
38885 次 |
最近记录: |