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


32

我的编辑需求非常简单-我需要剪切一些视频,或者在它们之间插入一些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

...,也可能有一个“播放列表”文本文件,例如:

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 

...所以可以用

videnctool -compose --playlist=playlist.txt --output=editedvid.avi

这里的想法是,所有视频都采用相同的格式-允许该工具避免转码,而只是进行“原始复制”(如mencoder复制编解码器:“ -oac copy -ovc copy”)-或缺少这种格式,未压缩的音频/视频就可以了(尽管会占用一些空间)。对于静止图像,该工具将使用视频文件设置的编码。

 

事实是,到目前为止,我可以看到它mencoder并且ffmpeg可以对单个文件进行操作;例如,从单个文件中剪切单个部分,或联接文件(mencoder也具有“ 编辑决策列表”(EDL),可用于进行精确的切割),因此您可以定义多个剪切区域,但它又归因于单个文件)。这意味着我必须首先从单个文件中切割片段(每个片段都需要在磁盘上拥有自己的临时文件),然后将它们加入最终的视频文件中。

然后,我想像一下,有一个相应的播放器工具,它可以读取与编码工具相同的命令行选项格式/播放列表文件-只是它不会生成输出文件,而是播放视频;例如在伪代码中:

vidplaytool --playlist=playlist.txt --start=00:01:14 --end=00:03:13

...,并且如果有足够的内存,它将在RAM中生成低分辨率的视频预览,并在窗口中播放,同时提供一些有限的交互(例如,用于播放,暂停,快退,步进帧mplayer键盘快捷键)。当然,我会想象开始时间和结束时间是指整个播放列表,并包括可能会在播放列表中该区域结束的任何文件。

因此,所有这些的最终结果将是:命令行操作;在进行编辑时没有临时文件-在渲染最终输出时也没有临时文件(也没有转码)...我个人认为这很好。

因此,尽管我认为上述所有内容可能都有些牵强-是否存在可以近似上述工作流程的内容?


1
当我需要分割/加入视频时,我也经常使用mkvmerge。
六。

谢谢@Vi。-以前从未听说mkvmerge过,请确保我检查一下。
sdaau 2011年

Answers:



23

好的,因为我找不到太多关于melt命令行用法的信息,所以这里有一些注意事项。(之后,请参阅此答案使用进程替换来欺骗期望文件的程序,并使用特定的扩展名作为参数?-Unix&Linux Stack Exchange for a script的示例bash

首先-有一个Ubuntu / Debian软件包melt(我有Ubuntu 11.04,带有MLTmelt 0.6.2);@Ielton给出的链接用于“ Media Lovin'Toolkit ”(MLT)Wiki,它melt是(但也是openshotkdenlive)的一部分。这是从git到文档文本文件的链接:mltframework.org/mlt.git/tree-docs / ; 请注意,Wiki上有一个关于BuildScripts的页面。

目前,我遇到的最大(唯一)问题是,我找不到导出未压缩视频合成(作为png帧或某些未压缩视频格式)的方法。

 

首先,melt您可以在命令行中通过帧控制播放;例如,要“创建”一个15帧长的白色空白,并使用内置melt播放器进行查看,请使用

melt -blank 15

当您使用观看时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

一旦melt完成打回来,它不会退出-所以你应该键入q退出它。

我们应该注意,中有所谓的“生产者”和“消费者” melt。如果未指定任何内容,则默认的“消费者”是播放视频的SDL(简单DirectMedia层)窗口。所以上面的命令与:

melt -blank 15 -consumer sdl

因此,如果我们要保存melt显示内容,则应将使用者更改为支持文件格式的内容。获取消费者列表:

$ melt -query "consumers"
---
consumers:
  - sdl
  - sdl_audio
  - sdl_preview
  - sdl_still
  - gtk2_preview
  - avformat
  - libdv
  - xml
  - decklink
  - null
...

libdv消费者将输出DV格式的数据直接stdout,所以保存视频到.dv你做的文件:

melt -blank 15 -consumer libdv > test.dv

请注意,在列出的使用者中,我尝试过的唯一可以在另一个应用程序中打开的格式是libdv(我用作vlc另一个应用程序)。但是,这可能会因不同类型的转码而失败(例如,如果我尝试从.flv文件转换代码段而不是空白,则生成的.dv文件打开并在其中播放vlc,但已损坏)。

 

现在是编辑部分;本质上,您可以直接在命令行上指定一系列文件名 / in / out节;说您有一个文件,video.avi那么您可以:

melt video.avi in=30 out=79 -blank 15 video.avi in=30 out=79

或格式稍好一些:

melt \ 
video.avi in=30 out=79 \ 
-blank 15 \
video.avi in=30 out=79

这意味着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

请注意,对于test.pngin=参数不必为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.

现在file.melt包含:

video.avi
in=30
out=79
-blank
15
video.avi
in=30
out=79

看来,这种“简单”的序列化文件格式不包含“注释”字符-如果我尝试添加“ # comment”行,则melt抱怨:“ 无法加载“#comment” ”(但除此之外,一行会被忽略,并且无论如何都会继续播放)。“ .melt”似乎是可以melt识别为简单序列化文件的扩展名。

现在,要重放此序列化文件,原则上我们可以只调用melt file.melt-但是,更完整的命令行将是:

melt melt_file:file.melt -consumer sdl

...这意味着:使用melt_file“生产者”打开file.melt,并将其框架渲染到“消费者” sdl(窗口)上。

请注意,我的经验是,(说).flv视频在命令行上播放时没有问题-但是,在file.melt序列化文件中指定视频时,会导致分段错误!自行.dv制作的视频melt似乎可以在file.melt...

 

可以通过使用-consumer xml:switch(而不是-serialise)来实现XML类型的序列化-因此,上面的示例现在是:

melt video.avi in=30 out=79 -blank 15 video.avi in=30 out=79 -consumer xml:file.mlt

要“播放”新生成的file.mltXML文件,现在可以直接执行melt file.mlt-或更完整的命令行是:

melt xml:file.mlt -consumer sdl

...这意味着:使用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>

另外,这是一个精确剪切帧的示例:从命令行准确剪切视频文件-超级用户
sdaau,

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

它使用命名管道,因此在磁盘上没有创建临时文件,并允许您剪切视频片段的大块并添加图像。

本示例使用第一个输入的时间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


谢谢,我最近也了解了ffmpeg-concat,它是用JavaScript编写的(您需要npm安装它),所以我想我要提到它
sdaau

4

我也一直在寻找这样的工具,而且似乎融化是完成这项工作的工具,但是文档几乎是不可能理解/缺失的。您几乎可以进行任何编辑组合。我有一些“动作凸轮”镜头...虽然声音无法使用。我将(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

您可以在此处了解更多信息。主要的网站在这里

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.