Linux에서 명령 줄 비디오 편집 (잘라 내기, 결합 및 미리보기)


32

편집 작업이 간단합니다. 일부 비디오를 잘라 내고, PNG 사이에 일부 PNG를 삽입하고, 비디오에 참여해야합니다 (전환, 효과 등은 필요하지 않음). 기본적으로, pitivi내가 원하는 것을 할 것입니다-카메라에서 640x480 30 fps AVI를 사용하고, 그런 종류의 자료를 몇 분 이상 넣 자마자 pitivi미리보기에서 정지하기 때문에 사용할 수 없게됩니다.

그래서 저는 Linux 용 명령 줄 도구를 찾기 시작했습니다. 나는 ffmpeg( 명령 줄-ffmpeg를 사용하여 비디오를 자르기-슈퍼 사용자 )와 mplayer( Sam-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)를 수행하는 것입니다. 압축되지 않은 오디오 / 비디오는 약간의 공간이 필요하지만 괜찮을 것입니다. 스틸 이미지의 경우 도구는 비디오 파일에서 설정 한 인코딩을 사용합니다.

 

문제는 내가 지금까지 그렇게 볼 수 있습니다 mencoderffmpeg개별 파일에서 작동 할 수 있습니다; 예를 들어, 하나의 파일에서 하나의 섹션을 절단, 또는 파일 (참여 mencoder도가 (EDL 편집 결정 목록)을 수행하는 데 사용할 수 있습니다, 프레임 정확한 절단 - 여러 컷 영역을 정의 할 수 있습니다,하지만 그것은 다시 하나의 파일에 의한 것 ). 즉, 개별 파일에서 먼저 조각을 자르고 (각각 디스크에 자체 임시 파일이 필요함) 최종 비디오 파일에 결합해야합니다.

그런 다음 인코딩 도구와 동일한 명령 줄 옵션 형식 / 재생 목록 파일을 읽을 수있는 해당 플레이어 도구가 있다고 생각합니다. 단, 출력 파일을 생성하지 않고 대신 비디오를 재생합니다. 예 : 의사 코드에서 :

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

... 메모리가 충분하면 RAM에서 저해상도 비디오 미리보기를 생성하고 창에서 재생하면서 제한된 상호 작용을 제공하면서 ( 재생, 일시 중지, 되감기, 단계 프레임 mplayer키보드 단축키 와 같은) ). 물론 시작과 종료 시간이 전체 재생 목록을 참조하고 해당 영역에있을 수있는 파일을 재생 목록에 포함시키는 것으로 생각합니다.

따라서이 모든 것의 최종 결과는 다음과 같습니다. 명령 행 작업; 편집을하는 동안 임시 파일이 없으며 최종 출력을 렌더링 할 때 임시 파일 (코드 변환)도 없습니다.

따라서 위의 모든 내용이 약간 확장 될 수 있다고 생각하지만 위에서 설명한 워크 플로와 비슷한 내용이 있습니까?


1
비디오를 분할 / 가입해야 할 때 종종 mkvmerge를 사용합니다.
Vi.

감사합니다, @Vi. - mkvmerge전에 들어 본 적이 없는지 확인해야합니다. 건배!
sdaau

답변:



23

좋아, melt명령 줄 사용법 에 대해 많이 찾을 수 없기 때문에 여기에 몇 가지 참고 사항이 있습니다. (그리고이 대답은 프로세스 대체를 사용하여 파일을 기대하는 프로그램을 특정 확장자로 인수로 속이는 프로그램을 트릭합니까?-Unix & Linux Stack Exchange for a script 을 통한 예 bash)

우선 우분투 / 데비안 패키지가 있습니다 melt(MLT 용융 0.6.2의 우분투 11.04가 있습니다). @Ielton 이 제공하는 링크 는 "Media Lovin 'Toolkit"(MLT) Wiki에 대한 링크 melt이며 ( openshotkdenlive) 의 일부입니다 . 다음은 git의 문서 텍스트 파일에 대한 링크입니다. mltframework.org/mlt.git/tree-docs / ; 위키에는 BuildScripts 에 관한 페이지가 있습니다 .

현재로서는 가장 큰 문제는 압축되지 않은 비디오 컴포지션 ( png프레임 또는 압축되지 않은 비디오 형식) 을 내보내는 방법을 찾을 수 없다는 것 입니다.

 

먼저, 명령 행 melt에서 프레임을 통한 재생을 제어 할 수 있습니다. 예를 들어, 15 프레임 길이의 흰색 공백을 "만들고"내장 melt플레이어로 보려면

melt -blank 15

로 볼 때 내장 플레이어 meltstderr대한 명령 줄 정보도 얻을 수 있습니다 .

$ 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되지만 손상됩니다 ).

 

이제 편집 부분; 기본적으로 명령 행에서 일련의 파일 이름 / 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.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

이 "단순한"직렬화 된 파일 형식에는 "commenting"문자가 포함되어 있지 않습니다. " # comment"행 을 추가하려고하면 melt' "# comment" '( 을)를로드하지 못했습니다 ( '와 별개로) 라인은 무시되고 재생은 계속됩니다). " .melt"은 ( melt는) 단순한 직렬화 된 파일로 인식 되는 확장명 인 것 같습니다 .

이제이 직렬화 된 파일을 재생하려면 원칙적으로 호출하면됩니다 melt file.melt. 그러나보다 완전한 명령 행은 다음과 같습니다.

melt melt_file:file.melt -consumer sdl

... melt_file"producer"를 사용하여 열고 file.melt"consumer" 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>


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 자바 스크립트로 작성, (당신은 필요 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

자세한 내용은 여기를 참조 하십시오 . 주요 웹 사이트는 여기에 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.