Pengeditan video baris perintah di Linux (potong, gabung, dan pratinjau)

32

Saya memiliki kebutuhan pengeditan yang agak sederhana - Saya perlu memotong beberapa video, mungkin menyisipkan beberapa PNG di antaranya, dan bergabung dengan video ini (tidak perlu transisi, efek, dll.). Pada dasarnya, pitiviakan melakukan apa yang saya inginkan - kecuali, saya menggunakan AVI 640x480 30 fps dari kamera, dan segera setelah saya memasukkan beberapa menit materi semacam itu, pitivimulai membeku saat pratinjau, dan dengan demikian menjadi tidak dapat digunakan.

Jadi, saya mulai mencari alat baris perintah untuk Linux; Saya kira hanya ffmpeg( baris perintah - Menggunakan ffmpeg untuk memotong video - Super User ) dan mplayer( Sam - Edit file video dengan mencoder di bawah linux ) adalah kandidat sejauh ini, tetapi saya tidak dapat menemukan contoh penggunaan yang ada dalam pikiran saya.

 

Pada dasarnya, saya membayangkan ada alat encoder dan pemain (seperti ffmpegvs ffplay; atau mencodervs mplayer) - sehingga, untuk memulai, urutan edit dapat ditentukan secara langsung pada baris perintah, lebih disukai dengan resolusi bingkai - pseudocode akan terlihat seperti:

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

... atau, itu dapat memiliki file teks "daftar putar", seperti:

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 

... jadi bisa dipanggil dengan

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

Idenya di sini akan bahwa semua video yang dalam format yang sama - yang memungkinkan alat untuk menghindari transcoding, dan hanya melakukan "copy mentah" bukan (seperti dalam mencoder's copy codec: " -oac copy -ovc copy") - atau kurangnya itu, audio / video yang tidak terkompresi akan baik-baik saja (meskipun akan memakan sedikit ruang). Dalam hal gambar diam, alat akan menggunakan pengodean yang ditetapkan oleh file video.

 

Masalahnya, sejauh ini saya bisa melihatnya mencoderdan ffmpegdapat beroperasi pada file individual; misalnya memotong satu bagian dari satu file, atau menggabungkan file ( mencoderjuga memiliki Edit Daftar Keputusan (EDL) , yang dapat digunakan untuk melakukan pemotongan frame-tepat - sehingga Anda dapat menentukan beberapa wilayah pemotongan, tetapi itu lagi dikaitkan dengan satu file ). Yang menyiratkan saya harus bekerja memotong potongan pertama dari file individual terlebih dahulu (masing-masing akan menuntut file sementara sendiri pada disk), dan kemudian bergabung dengan mereka dalam file video final.

Saya kemudian akan membayangkan, bahwa ada alat pemutar yang sesuai, yang dapat membaca format opsi baris perintah / file playlist yang sama dengan alat pengkodean - kecuali itu tidak akan menghasilkan file output, tetapi memutar video; misalnya dalam pseudocode:

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

... dan, mengingat ada cukup memori, itu akan menghasilkan preview rendah-res video dalam RAM, dan memainkannya kembali jendela, sementara menawarkan beberapa interaksi terbatas (seperti mplayer's cara pintas keyboard untuk play, pause, rewind, bingkai langkah ). Tentu saja, saya membayangkan waktu mulai dan berakhir untuk merujuk ke seluruh daftar putar, dan menyertakan file apa pun yang mungkin berakhir di wilayah itu dalam daftar putar.

Dengan demikian, hasil akhir dari semua ini adalah: operasi baris perintah; tidak ada file sementara saat melakukan pengeditan - dan juga tidak ada file sementara (atau transcoding) saat memberikan hasil akhir ... yang saya pikir akan menyenangkan.

Jadi, sementara saya berpikir bahwa semua hal di atas mungkin sedikit peregangan - apakah ada sesuatu yang akan mendekati alur kerja yang dijelaskan di atas?

sdaau
sumber
1
Saya juga sering menggunakan mkvmerge ketika saya perlu membagi / bergabung dengan video.
Vi.
Terima kasih untuk itu, @Vi. - belum pernah mendengar mkvmergesebelumnya, akan memastikan saya memeriksanya .. Cheers!
sdaau

Jawaban:

17

Ya ada. Coba gunakan aplikasi yang disebut "Melt". Lihat dokumentasi di sini:

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

Jika Anda menggunakan distro turunan Debian:

apt-get install melt
Ielton
sumber
pada mac:brew install mlt
kraftydevil
23

Oke, karena saya tidak dapat menemukan banyak tentang meltpenggunaan baris perintah, berikut adalah beberapa catatan .. (dan setelah ini, lihat jawaban ini Menggunakan subtitusi proses untuk mengelabui program yang mengharapkan file, dengan ekstensi spesifik sebagai argumen? - Unix & Linux Stack Exchange untuk skrip contoh via bash)

Untuk mulai dengan - ada paket Ubuntu / Debian untuk melt(Saya punya Ubuntu 11,04 dengan MLT meleleh 0.6.2); tautan yang diberikan oleh @Ielton adalah untuk "Media Lovin 'Toolkit" (MLT) Wiki, yang meltmerupakan bagian dari (tetapi juga openshotdan kdenlive). Berikut ini tautan ke file teks dokumentasi dari git mereka: mltframework.org/mlt.git/tree - docs / ; perhatikan wiki memiliki halaman tentang BuildScripts .

Untuk saat ini, masalah terbesar (satu-satunya) yang saya miliki adalah, saya tidak dapat menemukan cara untuk mengekspor komposisi video yang tidak terkompresi (baik sebagai pngbingkai, atau beberapa format video yang tidak terkompresi).

 

Pertama, di baris perintah meltAnda dapat mengontrol pemutaran melalui bingkai; misalnya, untuk "membuat" kosong putih 15 bingkai, dan melihatnya dengan meltpemutar bawaan, gunakan

melt -blank 15

Saat Anda melihatnya melt, Anda juga akan mendapatkan info baris perintah untuk stderruntuk pemutar bawaan:

$ 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

Setelah meltselesai diputar, itu tidak akan keluar - jadi Anda harus mengetik quntuk keluar.

Kami harus mencatat ada yang disebut "produsen" dan "konsumen" di melt. Jika tidak ada yang ditentukan, maka "konsumen" default adalah jendela SDL (Simple DirectMedia Layer) memutar video; jadi perintah di atas sama dengan:

melt -blank 15 -consumer sdl

Jadi, jika kita ingin menyimpan melttampilan apa , kita harus mengubah konsumen menjadi sesuatu yang akan mendukung format file. Untuk mendapatkan daftar konsumen:

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

The libdvOutput akan konsumen DV diformat data langsung ke stdout, sehingga untuk menyimpan video ke .dvfile yang akan melakukan:

melt -blank 15 -consumer libdv > test.dv

Perhatikan bahwa dari konsumen yang terdaftar, satu-satunya format yang saya coba, yang juga dapat dibuka di aplikasi lain adalah libdv(saya digunakan vlcsebagai aplikasi lain); Namun, ini mungkin gagal untuk jenis transcoding yang berbeda ( misalnya jika alih-alih sebuah kosong, saya mencoba untuk mengkonversi potongan dari .flvfile, file .dv yang dihasilkan terbuka dan diputar vlc, tetapi rusak ).

 

Sekarang untuk bagian pengeditan ; pada dasarnya, Anda dapat menentukan serangkaian stanzas nama-file / masuk / keluar langsung di baris perintah; mengatakan Anda memiliki file, video.avi- maka Anda dapat melakukannya:

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

atau sedikit lebih baik diformat:

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

Ini berarti video.avidari frame 30 hingga frame 79 akan dimainkan; kemudian kosong 15-frame; dan kemudian video.aviurutan dari frame 30 ke frame 79 lagi.

Untuk memanfaatkan gambar (misalnya, .png) dalam komposisi edit video:

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

Perhatikan bahwa untuk test.png, in=parameter tidak harus 0 - namun, gambar akan ditampilkan untuk out- inwaktu; dalam hal ini, akan lebih mudah untuk membiarkan in=0parameter keluar sama sekali.

 

Hal yang baik adalah bahwa urutan pengeditan ini dapat disimpan - atau seperti meltpanggilan itu, serial - ke file; perhatikan ada dua cara serialisasi tersebut: "sederhana" atau XML. Misalnya, untuk menyimpan perintah di atas sebagai file berserat "sederhana", kita cukup menambahkan -serialise [filename]peralihan ke perintah:

$ melt video.avi in=30 out=79 -blank 15 video.avi in=30 out=79 -serialise file.melt 
Project saved as file.melt.

Sekarang file.meltisinya:

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

Tampaknya, format file serial "sederhana" ini tidak mengandung karakter "berkomentar" - jika saya mencoba menambahkan # commentbaris " ", meltkomplain dengan: ' Gagal memuat "# komentar" ' (tetapi selain itu, tampaknya seperti itu sebuah garis diabaikan, dan pemutaran berlanjut lagi). " .melt" tampaknya merupakan ekstensi yang meltdikenali sebagai file serial sederhana.

Sekarang, untuk memutar ulang file serial ini, pada prinsipnya kita bisa memanggil melt file.melt- namun, baris perintah yang lebih lengkap adalah:

melt melt_file:file.melt -consumer sdl

... yang artinya: gunakan melt_file"produsen" untuk membuka file.melt, dan renderkan frame-nya pada "konsumen" sdl(jendela).

Perhatikan bahwa saya memiliki pengalaman, bahwa (katakanlah) .flvvideo diputar tanpa masalah pada baris perintah - namun, menyebabkan kesalahan segmentasi ketika mereka ditentukan dalam file.meltfile serial! .dvvideo yang dihasilkan dengan meltsendirinya, tampaknya berfungsi dengan baik di file.melt...

 

Jenis serialisasi XML dapat dicapai dengan menggunakan -consumer xml:saklar ( bukan-serialise ) - jadi contoh di atas sekarang akan menjadi:

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

Untuk "memutar" file.mltfile XML yang baru dibuat , seseorang sekarang dapat melakukannya secara langsung melt file.mlt- atau, baris perintah yang lebih lengkap adalah:

melt xml:file.mlt -consumer sdl

... yang artinya: gunakan xml"produsen" ( perhatikan, sebelumnya itu adalah konsumen ) untuk membuka file.mlt, dan renderkan frame-nya pada "konsumen" sdl(jendela).

Perhatikan bahwa dalam kasus ini, saya telah mengalami bahwa .flvvideo yang sama yang menyebabkan segfault dengan file serialisasi sederhana - berfungsi baik dengan file serialisasi XML!

Dalam hal ini, file.mltfile XML yang dihasilkan memiliki lebih banyak pengaturan, seperti resolusi, frame rate, informasi codec dll - tetapi juga lebih sulit untuk bekerja dengan editor teks secara langsung:

<?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
sumber
Juga, berikut adalah contoh untuk pemotongan frame-akurat: Secara akurat memotong file video dari baris perintah - Super User
sdaau
7

Solusi ffmpeg untuk masalah ini terlihat seperti ini:

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

Ini menggunakan pipa bernama, jadi tidak ada membuat file temp pada disk, dan memungkinkan Anda untuk memotong potongan klip video, dan menambahkan gambar.

Contoh ini menggunakan waktu 30-60 dari input pertama, dan kemudian menambahkan menit pertama dari input kedua, kemudian memasukkan file gambar, dan kemudian seluruh video ketiga.

Kode diangkat dari:

ffmpeg halaman gabungan: https://trac.ffmpeg.org/wiki/Concatenate

halaman superuser Menggunakan ffmpeg untuk memotong video

halaman superuser https://video.stackexchange.com/questions/12105/add-an-image-in-front-of-video-using-ffmpeg

codeMonkey
sumber
Terima kasih untuk itu, saya juga baru-baru ini belajar tentang ffmpeg-concat , yang ditulis dalam JavaScript (dan Anda harus npmmenginstalnya), jadi saya pikir saya akan menyebutkannya
sdaau
4

Saya juga telah mencari alat semacam itu dan tampaknya meleleh adalah alat untuk pekerjaan itu, namun dokumentasinya hampir mustahil untuk dipahami / hilang. Anda dapat melakukan hampir semua kombinasi pengeditan. Saya punya beberapa rekaman 'action cam' ... suaranya tidak bisa digunakan. Saya bergabung dengan video (h264) bersama-sama, menambahkan 60 frame fade dan mengganti suara dengan trek suara menggunakan:

% 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

Anda dapat membaca lebih lanjut di sini . Situs web utamanya ada di sini .

pengguna196805
sumber