Редагування відео в командному рядку в Linux (вирізання, приєднання та попередній перегляд)


32

У мене досить прості потреби в редагуванні - мені потрібно вирізати кілька відео, можливо вставити між ними PNG і приєднатись до цих відео (не потрібні переходи, ефекти тощо). В основному, я pitiviб робив те, що я хочу, - окрім випадків, коли я використовую AVI з 640x480 кадрів в секунду з камери, і як тільки я вклав за пару хвилин такого матеріалу, він pitiviпочинає замерзати при попередньому перегляді і, таким чином, стає непридатним.

Отже, я почав шукати інструмент командного рядка для Linux; Я здогадуюсь лише ffmpeg( командний рядок - Використання ffmpeg для вирізання відео - Супер Користувач ) та mplayer( Sam - Редагувати відеофайл з mencoder під Linux ) поки що є кандидатами, але я не можу знайти приклади використання, які я маю на увазі.

 

В основному, я думаю, що є інструменти кодера та програвача (як-от 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's code codec: " -oac copy -ovc copy") - або у відсутності цього, нестиснене аудіо / відео буде нормально (хоча це з'їсть трохи місця). У випадку нерухомого зображення інструмент використовує кодування, встановлене відеофайлами.

 

Справа в тому, що я поки що бачу це mencoderі ffmpegможу працювати з окремими файлами; наприклад, вирізати окремий розділ з одного файлу або об'єднати файли ( mencoderтакож є редагування списків рішень (EDL)) , які можна використовувати для точного кадрування різання - так ви можете визначити кілька областей вирізання, але це знову приписано одному файлу ). Що означає, що я повинен працювати над вирізанням фрагментів спочатку з окремих файлів (кожен з яких вимагатиме власного тимчасового файлу на диску), а потім з'єднання їх у кінцевому відеофайлі.

Тоді я б уявив, що існує відповідний інструмент програвача, який може прочитати той самий формат опції командного рядка / файл списку відтворення, що і інструмент кодування - за винятком того, що він не генерує вихідний файл, а натомість відтворює відео; наприклад, у псевдокоді:

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

... і, враховуючи, що достатньо пам'яті, це дозволить створити попередній перегляд відео з низькою роздільною здатністю в оперативній пам'яті і відтворити його у вікні, пропонуючи при цьому обмежену взаємодію (наприклад mplayer, комбінації клавіш для відтворення, паузи, перемотування назад, крок кадру ). Звичайно, я б уявив час початку та кінця, щоб віднести весь список відтворення, і включити будь-який файл, який може потрапити в цей регіон у список відтворення.

Таким чином, кінцевим результатом усього цього став би: операція командного рядка; немає тимчасових файлів під час редагування - а також немає тимчасових файлів (ні перекодування) під час надання кінцевого виводу ... що, я сам думаю, було б добре.

Отже, хоча я думаю, що все вищесказане може бути трохи розтягнутим - чи існує щось, що б наближало описаний вище робочий процес?


1
Я також часто використовую mkvmerge, коли мені потрібно розділити / приєднати відео.
Ві.

Дякую за це, @Vi. - ніколи раніше не чув про це mkvmerge, переконайтесь, що я це перевіряю .. Ура!
sdaau

Відповіді:



23

Гаразд, оскільки я не можу знайти багато про meltвикористання командного рядка, ось кілька приміток .. (і після цього дивіться цю відповідь. Використання підстановки процесу для обману програм, які очікують файли, з конкретними розширеннями як аргумент? - Unix & Linux Stack Exchange для скрипту приклад через bash)

Для початку - є пакет Ubuntu / Debian для melt(у мене є Ubuntu 11.04 з розплавом MLT 0.6.2); Посилання, яке надає @Ielton , стосується Вікі "Інструментарій для засобів масової інформації" (MLT), який meltє частиною (але також openshotі kdenlive). Ось посилання на текстові файли документації з їх git: mltframework.org/mlt.git/tree - docs / ; зауважте, що у вікі є сторінка про 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, але пошкоджується ).

 

Тепер для редагуючої частини; по суті, ви можете вказати ряд строф імені / вводу / виводу безпосередньо в командному рядку; скажіть, у вас є файл, 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.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.

Тепер file.meltмістить:

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

Здається, цей "простий" серіалізований формат файлу не містить символу "коментує" - якщо я спробую додати # commentрядок " ", meltскаржиться на: " Не вдалося завантажити" # коментар " '(але крім цього, здається, що такий рядок ігнорується, і відтворення продовжується в будь-якому випадку). « .melt» , Як представляється , розширення , яке meltвизнає в якості простого серіалізовані файлу.

Тепер, щоб відтворити цей серіалізований файл, ми могли в принципі просто зателефонувати melt file.melt- однак, більш повним командним рядком було б:

melt melt_file:file.melt -consumer sdl

... що означало б: використовувати 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

Щоб "відтворити" щойно створений file.mltXML-файл, тепер це можна зробити безпосередньо melt file.mlt- або, більш повним командним рядком буде:

melt xml:file.mlt -consumer sdl

... що означало б: використовувати xml"виробника" ( зауважте, раніше він був споживачем ), щоб відкрити file.mltта вивести його рамки на "споживача" sdl(вікно).

Зауважте, що в цьому випадку я переконався, що ті самі .flvвідео, які спричинили segfault за допомогою простого файлу серіалізації, працюють добре з файлом серіалізації 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>

Крім того, ось приклад чіткості кадрів: точно вирізати відеофайли з командного рядка - Super User
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 concatenate: 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

Більше про це можна прочитати тут . Основний веб-сайт тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.