web-dev-qa-db-ja.com

Linuxでのコマンドラインビデオ編集(カット、参加、プレビュー)

私はかなり単純な編集のニーズがあります-いくつかのビデオを切り取り、それらの間にPNGを挿入し、これらのビデオに参加する必要があります(トランジション、エフェクトなどは必要ありません)。基本的に、pitiviは私がやりたいことを行います-例外として、私はカメラから640x480 30 fpsのAVIを使用し、その種類の素材を数分以上入力するとすぐにpitiviプレビュー時にフリーズし始めるため、使用できなくなります。

そこで、Linux用のコマンドラインツールを探し始めました。 ffmpegコマンドライン-ffmpegを使用してビデオを切り取る-スーパーユーザー )とmplayerSam-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

...または、次のような「プレイリスト」テキストファイルを含めることができます。

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 's のように) copy コーデック: "-oac copy -ovc copy ")-または、それがない場合は、非圧縮のオーディオ/ビデオで問題ありません(ただし、少しスペースが消費されます)。静止画の場合、ツールはビデオファイルで設定されたエンコーディングを使用します。

問題は、これまでのところmencoderffmpegが個々のファイルを操作できることです。例えば単一のファイルから単一のセクションを切り取るか、ファイルを結合します(mencoderにも Edit Decision Lists(EDL) があり、使用できます)実行する frame-exact cut -複数のカット領域を定義できますが、これも1つのファイルに起因します)。これは、まず最初に個々のファイル(それぞれがディスク上の独自の一時ファイルを要求する)から断片を切り取り、次にそれらを最終的なビデオファイルに結合する必要があることを意味します。

次に、対応するプレーヤーツールがあり、エンコードツールと同じコマンドラインオプション形式/再生リストファイルを読み取ることができると想像します。ただし、出力ファイルを生成せず、代わりにビデオを再生します。例えば擬似コードで:

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

...そして、十分なメモリがある場合、RAMに低解像度のビデオプレビューが生成され、ウィンドウで再生されますが、一部の限られた操作(mplayer 's キーボードショートカット 再生、一時停止、巻き戻し、ステップフレーム)。もちろん、開始時間と終了時間はプレイリスト全体を参照し、その領域に到達する可能性のあるすべてのファイルをプレイリストに含めることを想定しています。

したがって、これらすべての最終結果は次のようになります。コマンドライン操作。編集中に一時ファイルはありません-そして、最終出力をレンダリングするときに一時ファイル(またはトランスコーディング)もありません...

だから、私は上記のすべてが少しストレッチかもしれないと思いますが-上記のワークフローに近いものはありますか?

33
sdaau

はいあります。 「メルト」というアプリを使ってみてください。こちらのドキュメントをご覧ください。

https://www.mltframework.org/docs/melt/

Debian派生のディストリビューションを使用する場合:

apt-get install melt
17
Ielton

わかりました、meltコマンドラインの使用法についてはあまり見つけられないので、ここにいくつかの注意事項を示します。(そしてこの後、この回答を参照してください プロセス置換を使用して、特定の拡張子を引数としてファイルを予期するプログラムをだましますか?-UnixおよびLinuxスタック交換bashによるスクリプト例

まず、meltのUbuntu/Debianパッケージがあります(MLTが0.6.2のUbuntu 11.04があります); @ Ielton によって提供されるリンクは、 "Media Lovin 'Toolkit"(MLT)Wikiのリンクであり、meltは(ただし、openshotおよびkdenliveの一部です)。 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(Simple DirectMedia Layer) ビデオを再生するウィンドウです。したがって、上記のコマンドは次と同じです。

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で開いて再生されますが、破損しています)。

editing部分について説明します。基本的に、一連のfile-name/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

つまり、フレーム30からフレーム79までのvideo.aviが再生されます。次に15フレームのブランク。そして、再びフレーム30からフレーム79までのvideo.aviシーケンス。

ビデオ編集構成で画像(たとえば、.png)を利用するには:

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

test.pngの場合、in=パラメータは0である必要はありません。ただし、画像はout-in時間表示されます。この場合は、in=0パラメータを完全に省略するのが最も簡単です。

良いことは、この編集シーケンスを保存できること、またはmeltがそれを呼び出すときにserialized-ファイルに保存できることです。そのようなシリアル化にはtwo方法があることに注意してください:「単純」または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は次のメッセージを表示します: 'Failed to load "#comment" '(ただし、それとは別に、そのような行は無視され、再生が続行されます)。 「.melt」は、meltが単純なシリアル化ファイルとして認識する拡張機能のようです。

このシリアル化されたファイルを再生するには、原則としてmelt file.meltを呼び出すだけですが、より完全なコマンドラインは次のようになります。

melt melt_file:file.melt -consumer sdl

...つまり、melt_file "プロデューサー"を使用してfile.meltを開き、そのフレームを "コンシューマー" sdl(ウィンドウ)にレンダリングします。

(たとえば).flvビデオはコマンドラインで問題なく再生されるという経験があることに注意してください。ただし、file.meltシリアル化されたファイルで指定すると、セグメンテーション違反が発生します。 melt自体が作成した.dv動画は、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

新しく生成されたfile.mlt XMLファイルを「再生」するには、直接melt file.mltを実行できます。または、より完全なコマンドラインは次のようになります。

melt xml:file.mlt -consumer sdl

...つまり、xml "プロデューサー"(注、以前はコンシューマーでした)を使用してfile.mltを開き、そのフレームを "コンシューマー" sdl(ウィンドウ)にレンダリングします。 。

このケースでは、単純なシリアル化ファイルでsegfaultを引き起こしたまったく同じ.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>
23
sdaau

この問題の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を使用し、2番目の入力の最初の1分を追加し、次に画像ファイルを挿入し、次に3番目のビデオ全体を挿入します。

次のコードを解除:

ffmpeg連結ページ: https://trac.ffmpeg.org/wiki/Concatenate

スーパーユーザーページ ffmpegを使用してビデオを切り取る

スーパーユーザーページ https://video.stackexchange.com/questions/12105/add-an-image-in-front-of-video-using-ffmpeg

7
codeMonkey

私もそのようなツールを探していましたが、メルトが仕事のツールであるように見えますが、ドキュメントを理解したり見落としたりすることはほとんど不可能です。編集のほとんどすべての組み合わせを行うことができます。 「アクションカム」の映像をいくつか持っていましたが、音は使用できませんでした。私は(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

あなたはそれについてもっと読むことができます ここ 。メインWebサイトは ここ です。

4
user196805