Linux'ta komut satırı video düzenleme (kes, birleştir ve önizleme)


32

Oldukça basit düzenleme ihtiyaçlarım var - bazı videoları kesmem, aralarında bazı PNG'ler yerleştirmem ve bu videolara katılmam gerekiyor (geçişlere, efektlere vb. Gerek yok). Temelde pitiviistediğim şeyi yapar - bir kameradaki 640x480 30 fps AVI'leri kullanırım ve bu türden birkaç dakikadan fazla bir süre içinde kullandığımda pitiviönizlemede donmaya başlar ve bu nedenle kullanılamaz hale gelir.

Böylece, Linux için bir komut satırı aracı aramaya başladım; Sanırım sadece ffmpeg( komut satırı - ffmpeg'i videoyu kesmek için - Süper Kullanıcı ) ve mplayer( Sam - Linux altında mencoder ile video dosyasını düzenle ) şimdiye kadar adaylar, ancak aklımda olan kullanım örnekleri bulamıyorum.

 

Temel olarak, kodlayıcı ve oynatıcı araçlarının ( ffmpegvs ffplay; veya mencodervs mplayergibi) olduğunu hayal ediyorum - başlangıçta, düzenleme sırası doğrudan komut satırında, tercihen kare çözünürlüğü ile belirtilebiliyordu - bir sahte kod şöyle görünür:

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

... veya, şöyle bir "çalma listesi" metin dosyasına sahip olabilir:

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 

... böylece aranabilirdi

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

Buradaki fikir videoları hepsi aynı formatta olduğunu olurdu - kaçının kodlama aracı sağlayan ve sadece "ham kopya" yerine ne (gibi mencoder'ler kopya codec'i: " -oac copy -ovc copy") - ya da eksikliği içinde, Sıkıştırılmamış ses / video Tamam olurdu (biraz yer yer olsa da). Hareketsiz görüntü durumunda, araç video dosyaları tarafından ayarlanan kodlamayı kullanır.

 

Mesele şu ki, şimdiye kadar görebiliyorum mencoderve ffmpegbireysel dosyalar üzerinde çalışabiliyorum; mesela tek dosyadan tek kısmının kesilmesi veya dosyaları (katılmak mencoderda vardır (EDL Düzenleme Karar Listeleri) yapmak için kullanılabilir, çerçeve tam kesim - Birden kesim bölgelerini tanımlayabilirsiniz böylece, ancak yine tek bir dosya atfedilen ). Bu, ilk önce her biri ilk önce tek tek dosyalardan (her biri diskte kendi geçici dosyasını talep edecek olan) parça kesmek ve daha sonra da son bir video dosyasına katılmak için çalışmam gerektiği anlamına geliyor.

Daha sonra, bir çıktı dosyası oluşturmayacak şekilde videoyu oynatması dışında kodlama aracıyla aynı komut satırı seçenek biçimini / oynatma listesini okuyabilen ilgili bir oynatıcı aracının olduğunu hayal ediyorum; örneğin sahte kodda:

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

Gibi (bazı sınırlı etkileşim sunarken ... ve, yeterli bellek var önüne alındığında, bu, RAM düşük çözünürlüklü video önizleme oluşturmak ve bir pencerede geri oynardım mplayer'ın klavye kısayolları oynatma, duraklatma, geri sarma, adım kare için ). Tabii ki, tüm çalma listesine atıfta bulunmak için başlangıç ​​ve bitiş zamanlarını hayal ediyorum ve çalma listesine o bölgede son bulabilecek herhangi bir dosyayı dahil ediyorum.

Böylece, tüm bunların sonucu olacaktır: komut satırı işlemi; düzenleme yaparken geçici dosyalar yok - ve ayrıca son çıktıyı verirken de geçici dosyalar (ya da kod çözme) yok ... ki bu da kendimin hoş olacağını düşünüyorum.

Öyleyse, yukarıdakilerin hepsinin bir parça gergin olabileceğini düşünüyorum - yukarıda açıklanan iş akışına yaklaşacak herhangi bir şey var mı?


1
Ayrıca, videoları bölmem / birleştirmem gerektiğinde sık sık mkvmerge kullanıyorum.
Vi.

Bunun için teşekkür ederim, @Vi. - daha mkvmergeönce hiç duymamıştım , kontrol edeceğimden emin olacağım .. Şerefe!
sdaau

Yanıtlar:



23

Tamam, meltkomut satırı kullanımı hakkında fazla bir şey bulamadığım için , burada bazı notlar var .. (ve bundan sonra, bu cevaba bakın . Argüman olarak belirli uzantıları olan, dosyaları bekleyen programları kandırmak için işlem değişikliğinin kullanılması? - Bir komut dosyası için Unix ve Linux Stack Exchange örnek yoluyla bash)

Başlamak için - melt(UbT erime 0.6.2 ile Ubuntu 11.04'üm var) için bir Ubuntu / Debian paketi var; @Ielton tarafından verilen bağlantı melt, bir parçası olan (ayrıca openshotve aynı zamanda kdenlive) "Media Lovin 'Araç Takımı " (MLT) Wiki içindir . İşte onların dokümantasyon metin dosyalarına gitmeden gelen link: mltframework.org/mlt.git/tree - docs / ; wiki'nin BuildScripts hakkında bir sayfası olduğunu unutmayın .

Şimdilik, onunla yaşadığım en büyük (sadece) sorun, sıkıştırılmamış bir video kompozisyonunu dışa aktarmanın bir yolunu bulamamamdır ( pngçerçeveler veya sıkıştırılmamış bir video formatı).

 

Öncelikle, komut satırında meltoynatmayı karelerle kontrol edebilirsiniz; örneğin, 15 kare uzunluğunda beyaz bir boş "oluşturmak" ve yerleşik meltoynatıcı ile görüntülemek için

melt -blank 15

İle görüntülediğinizde , yerleşik oynatıcı için meltbir komut satırı bilgisi de alırsınız 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

Bir kez meltyazdığınız bu yüzden - bu çıkmayacaktır, yapmaktan oynama geri döndü qonu çıkmak için.

İçinde "üreticiler" ve "tüketiciler" olduğunu unutmayın melt. Hiçbir şey belirtilmezse, varsayılan "tüketici", videoyu oynattan bir SDL (Simple DirectMedia Layer) penceresidir; bu yüzden yukarıdaki komut aynıdır:

melt -blank 15 -consumer sdl

Bu nedenle, meltgörüntülenenleri kaydetmek istiyorsak , tüketiciyi bir dosya formatını destekleyecek bir şeye değiştirmeliyiz. Tüketici listesi almak için:

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

libdvTüketici irade çıktı DV doğrudan biçimindeki verileri stdoutböylece video kaydetmek için, .dvyapacağın dosyası:

melt -blank 15 -consumer libdv > test.dv

Listelenen tüketicilerden denediğim, başka bir uygulamada da açılabilen tek formatın libdv( vlcbaşka bir uygulama olarak kullandım ); bununla birlikte, bu farklı bir kodlama türü için başarısız olabilir ( örneğin, boşluk yerine, bir snippet'i .flvdosyadan dönüştürmeye çalışırsam , sonuçta .dv dosyası açılır ve oynatılır vlc, ancak bozulur ).

 

Şimdi düzenleme bölümü için; temelde, doğrudan komut satırından bir dizi dosya adı / giriş / çıkış stanzı belirleyebilirsiniz; bir dosyanız olduğunu söyleyin, video.avisonra şunları yapabilirsiniz:

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

veya biraz daha iyi biçimlendirilmiş:

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

Bu video.avi, çerçevesinden 30, çerçevesine 79 kadar oynanacağı anlamına gelir ; sonra 15 karelik bir boşluk; ve daha sonra, video.aviçerçeve 30'dan çerçeve 79'a yeniden dizilim.

.pngBir video düzenleme kompozisyonundaki görüntüleri (örneğin ) kullanmak için :

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

İçin Not olduğunu test.png, in=parametre 0 olması gerekmez - Ancak görüntü için görüntülenecek out- inzaman; Bu durumda, in=0parametreyi tamamen dışarıda bırakmak en kolayı olacaktır .

 

İşin iyi yanı, bu düzenleme sırasının bir dosyaya seri hale getirilerek ( ya da meltçağrıştırıldığı gibi) kaydedilebilmesidir ; bu tür serileştirmenin iki yolu olduğuna dikkat edin : "basit" veya XML. Mesela, yukarıdaki komutu "basit" bir seri hale getirilmiş dosya olarak kaydetmek için, anahtarı komuta ekleyebiliriz :-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.

Şimdi file.meltiçerir:

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

Görünüşe göre, bu "basit" serileştirilmiş dosya biçimi "yorum yapma" karakteri içermiyor - bir " # comment" satır eklemeye çalışırsam , şu şekilde meltşikayet ediyor: ' "# comment" yüklenemedi (ancak bunun dışında, bir çizgi yoksayılır ve oynatma yine de devam eder). " .melt" melt, basit seri hale getirilmiş dosya olarak bilinen bir uzantı gibi görünüyor .

Şimdi, bu serileştirilmiş dosyayı tekrar oynatmak için, prensip olarak sadece çağrı yapabiliriz melt file.melt- ancak daha eksiksiz bir komut satırı şöyle olacaktır:

melt melt_file:file.melt -consumer sdl

... ki bu şu anlama gelir: melt_file"yapımcı" yı açmak file.meltve çerçevelerini "tüketici" sdl(pencere) üzerinde göstermek.

Tecrübe edindiğimi, .flvvideoların komut satırında sorunsuzca oynadığını - ancak file.meltserileştirilmiş dosyada belirtildiğinde segmentasyon hatasına neden olduğunu unutmayın ! kendisi .dvtarafından üretilen videolar meltiyi çalışıyor gibi görünüyor file.melt...

 

XML (seri yerine ) seri hale getirme -consumer xml:( yerine-serialise ) kullanılarak elde edilebilir - böylece yukarıdaki örnek şu şekilde olur:

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

Yeni oluşturulan file.mltXML dosyasını "yeniden oynatmak" için , doğrudan doğrudan yapılabilen melt file.mlt- veya daha eksiksiz bir komut satırı şöyle olacaktır:

melt xml:file.mlt -consumer sdl

... bunun anlamı şudur: xml“üreticiyi” ( daha önce tüketici olduğunu unutmayın ) file.mlt, çerçevelerini açmak için “tüketiciyi” sdl(pencere) açın.

Bu durumda, .flvbasit bir seri hale getirme dosyasıyla segfault'a neden olan videoların bir XML seri hale getirme dosyasıyla gayet iyi çalıştığını gördüm !

Bu durumda, ortaya çıkan file.mltXML dosyası çözünürlük, kare hızı, kodek bilgisi vb. Gibi çok daha fazla ayara sahiptir - ancak doğrudan bir metin düzenleyicide çalışmak daha zordur:

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

Ayrıca, kare-doğru kesim için bir örnek: Video dosyalarını komut satırından
sdaau

7

Bu sorunun ffmpeg çözümü şuna benziyor:

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

Adlandırılmış yöneltmeler kullanır, böylece diskte geçici dosyalar oluşturmaz ve video kliplerin parçalarını kesmenize ve görüntüler eklemenize izin verir.

Bu örnek, ilk girişin 30-60 zamanını kullanır ve ardından ikinci girişin ilk dakikasını ekler, ardından bir görüntü dosyası ve ardından üçüncü videonun tamamını ekler.

Kod kaldırıldı:

ffmpeg bitiştirme sayfası: https://trac.ffmpeg.org/wiki/Concatenate

superuser page Videoyu kesmek için ffmpeg kullanma

süper kullanıcı sayfası https://video.stackexchange.com/questions/12105/add-an-image-in-front-of-video-using-ffmpeg


Bunun için teşekkürler, son zamanlarda JavaScript'te yazılan ffmpeg-concat'ı da öğrendim (ve npmyüklemeniz gerekir), bu yüzden bahsetmeyi düşündüm
sdaau

4

Ben de böyle bir araç arıyordum ve görünen o ki eriyik işin aracıydı, ancak belgelerin anlaşılması / eksik olması neredeyse imkansız. Neredeyse herhangi bir düzenleme kombinasyonunu yapabilirsiniz. Bazı 'eylem kamerası' çekimlerim vardı ... ses yine de kullanılamazdı. Birlikte (h264) videoya katıldım, 60 kare solukluk ekledim ve sesi kullanarak ses parçalarıyla değiştirdim:

% 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

Burada daha fazla okuyabilirsiniz . Ana web sitesi burada .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.