Linux 中的命令行视频编辑(剪切、加入和预览)

sda*_*aau 38 linux command-line video-editing

我有相当简单的编辑需求 - 我需要剪切一些视频,也许在它们之间插入一些 PNG,然后加入这些视频(不需要过渡、效果等)。基本上,pitivi可以做我想做的事 - 除了,我使用来自相机的 640x480 30 fps AVI,一旦我放入这种材料超过几分钟,pitivi预览时就会开始冻结,因此变得无法使用。

所以,我开始寻找 Linux 的命令行工具;我想只有ffmpeg命令行 - 使用 ffmpeg 剪切视频 - 超级用户)和mplayerSam - 在 linux 下使用 mencoder 编辑视频文件)是目前的候选者,但我找不到我想到的使用示例。

 

基本上,我想有一个编码器和播放器工具(如ffmpegvs ffplay; 或mencodervs 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是(但也是openshotkdenlive)的一部分。这是来自他们的 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.mltXML 文件,现在可以直接执行melt file.mlt- 或者,更完整的命令行是:

melt xml:file.mlt -consumer sdl
Run Code Online (Sandbox Code Playgroud)

...这意味着:使用xml“生产者”(注意,以前它是消费者)打开file.mlt,并在“消费者” sdl(窗口)上呈现其框架。

请注意,在这种情况下,我遇到过.flv使用简单序列化文件导致段错误的相同视频 - 使用 XML 序列化文件可以正常工作!

在这种情况下,生成的file.mltXML 文件具有更多设置,例如分辨率、帧速率、编解码器信息等 - 但直接在文本编辑器中使用也更加困难:

<?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)

您可以在此处阅读更多相关信息。主要网站在这里