Chỉnh sửa video dòng lệnh trong Linux (cắt, tham gia và xem trước)


31

Tôi có nhu cầu chỉnh sửa khá đơn giản - Tôi cần cắt bớt một số video, có thể chèn một số PNG vào giữa chúng và tham gia các video này (không cần chuyển tiếp, hiệu ứng, v.v.). Về cơ bản, pitivi sẽ làm những gì tôi muốn - ngoại trừ, tôi sử dụng AVI 640x480 30 khung hình / giây từ máy ảnh, và ngay sau khi tôi đặt trong vài phút với loại vật liệu đó, pitivi bắt đầu đóng băng khi xem trước, và do đó trở nên không sử dụng được.

Vì vậy, tôi bắt đầu tìm kiếm một công cụ dòng lệnh cho Linux; Tôi đoán chỉ ffmpeg ( dòng lệnh - Sử dụng ffmpeg để cắt video - Siêu người dùng ) và mplayer ( Sam - Chỉnh sửa tệp video với mencoder trong linux ) cho đến nay là các ứng cử viên, nhưng tôi không thể tìm thấy các ví dụ về việc sử dụng tôi có trong tâm trí.

Về cơ bản, tôi tưởng tượng có một công cụ mã hóa và trình phát (như ffmpeg đấu với ffplay; hoặc là mencoder đấu với 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

... hoặc, nó có thể có tệp văn bản "danh sách phát", như:

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 

... vì vậy nó có thể được gọi với

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

Ý tưởng ở đây sẽ là tất cả các video có cùng định dạng - cho phép công cụ tránh chuyển mã và chỉ thực hiện một "bản sao thô" mencoder 'S bản sao tiền mã hóa: " -oac copy -ovc copy ") - hoặc thiếu điều đó, âm thanh / video không nén sẽ ổn (mặc dù nó sẽ tốn một chút dung lượng). Trong trường hợp hình ảnh tĩnh, công cụ sẽ sử dụng mã hóa được đặt bởi các tệp video.

Vấn đề là, cho đến nay tôi có thể thấy rằng mencoderffmpeg có thể hoạt động trên các tập tin cá nhân; ví dụ. cắt một phần từ một tệp duy nhất hoặc nối các tệp ( mencoder cũng có Chỉnh sửa danh sách quyết định (EDL) , có thể được sử dụng để làm cắt khung chính xác - vì vậy bạn có thể xác định nhiều vùng cắt, nhưng nó lại được quy cho một tệp duy nhất). Điều đó ngụ ý rằng tôi phải làm việc trước tiên để cắt các mảnh từ các tệp riêng lẻ (mỗi tệp sẽ yêu cầu tệp tạm thời trên đĩa), sau đó nối chúng vào tệp video cuối cùng.

Sau đó tôi sẽ tưởng tượng rằng có một công cụ trình phát tương ứng, có thể đọc cùng một tệp định dạng / danh sách phát tùy chọn dòng lệnh như công cụ mã hóa - ngoại trừ nó sẽ không tạo tệp đầu ra mà thay vào đó là phát video; ví dụ. trong mã giả:

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

... và, nếu có đủ bộ nhớ, nó sẽ tạo ra bản xem trước video độ phân giải thấp trong RAM và phát lại trong cửa sổ, đồng thời cung cấp một số tương tác hạn chế (như mplayer 'S các phím tắt bàn phím để chơi, tạm dừng, tua lại, khung bước). Tất nhiên, tôi tưởng tượng thời gian bắt đầu và kết thúc để tham khảo toàn bộ danh sách phát và bao gồm bất kỳ tệp nào có thể kết thúc ở khu vực đó trong danh sách phát.

Do đó, kết quả cuối cùng của tất cả điều này sẽ là: hoạt động dòng lệnh; không có tệp tạm thời trong khi thực hiện chỉnh sửa - và cũng không có tệp tạm thời (cũng không chuyển mã) khi hiển thị đầu ra cuối cùng ... mà bản thân tôi nghĩ sẽ tốt

Vì vậy, trong khi tôi nghĩ rằng tất cả những điều trên có thể là một chút kéo dài - liệu có tồn tại bất cứ điều gì gần đúng với quy trình công việc được mô tả ở trên không?


1
Tôi cũng thường sử dụng mkvmerge khi tôi cần chia / tham gia video.
Vi.

Cảm ơn vì điều đó, @Vi. - chưa bao giờ nghe nói về mkvmerge trước đây, sẽ đảm bảo tôi kiểm tra xem .. Chúc mừng!
sdaau

Câu trả lời:



22

Ok, vì tôi không thể tìm thấy nhiều về melt sử dụng dòng lệnh, đây là một số lưu ý .. (và sau này, hãy xem câu trả lời này Sử dụng thay thế quy trình để lừa các chương trình mong đợi các tệp, với các phần mở rộng cụ thể làm đối số? - Unix & amp; Trao đổi ngăn xếp Linux cho một ví dụ về kịch bản thông qua bash )

Để bắt đầu - có gói Ubuntu / Debian cho melt (Tôi có Ubuntu 11.04 với MLT tan chảy 0.6.2); liên kết được đưa ra bởi @Ielton dành cho Wiki "Media Lovin 'Toolkit" (MLT), trong đó melt là một phần của (nhưng cũng openshotkdenlive ). Đây là liên kết đến các tệp văn bản tài liệu từ git của họ: mltframework.org/mlt.git/tree - docs / ; lưu ý wiki có một trang về BuildScripts .

Hiện tại, vấn đề lớn nhất (duy nhất) mà tôi gặp phải với nó là tôi không thể tìm ra cách xuất một bố cục video không nén (như là png khung hoặc một số định dạng video không nén).

Đầu tiên, trong dòng lệnh melt bạn có thể điều khiển phát lại thông qua các khung; chẳng hạn, để "tạo" một khoảng trắng dài 15 khung và xem nó với tích hợp melt người chơi, sử dụng

melt -blank 15

Khi bạn xem với melt, bạn cũng sẽ nhận được thông tin dòng lệnh để stderr cho người chơi tích hợp:

$ 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

Một lần melt đã phát xong, nó sẽ không thoát - vì vậy bạn nên gõ q để thoát khỏi nó

Chúng ta nên lưu ý có cái gọi là "nhà sản xuất" và "người tiêu dùng" trong melt. Nếu không có gì được chỉ định, thì "người tiêu dùng" mặc định là một SDL (Lớp DirectMedia đơn giản) cửa sổ phát lại video; vì vậy lệnh trên giống như:

melt -blank 15 -consumer sdl

Vì vậy, nếu chúng ta muốn tiết kiệm những gì melt hiển thị, chúng ta nên thay đổi người tiêu dùng thành một cái gì đó sẽ hỗ trợ định dạng tệp. Để có được danh sách người tiêu dùng:

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

Các libdv người tiêu dùng sẽ xuất dữ liệu định dạng DV trực tiếp sang stdout, để lưu video vào .dv tập tin bạn làm:

melt -blank 15 -consumer libdv > test.dv

Lưu ý rằng từ những người tiêu dùng được liệt kê, định dạng duy nhất tôi đã thử, cũng có thể được mở trong một ứng dụng khác là libdv (Tôi đã sử dụng vlc như một ứng dụng khác); tuy nhiên, điều này có thể thất bại đối với một loại chuyển mã khác ( ví dụ. nếu thay vì để trống, tôi cố gắng chuyển đổi một đoạn từ một .flv tệp, tệp .dv kết quả sẽ mở và phát trong vlc, nhưng bị hỏng ).

Bây giờ cho chỉnh sửa phần; về cơ bản, bạn có thể chỉ định một loạt tên tập tin / in / out stanzas trực tiếp trên dòng lệnh; nói rằng bạn có một tập tin, video.avi - sau đó bạn có thể làm:

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

hoặc định dạng tốt hơn một chút:

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

Điều này có nghĩa là video.avi từ khung 30 đến khung 79 sẽ được phát; sau đó trống 15 khung; và sau đó video.avi trình tự từ khung 30 đến khung 79 một lần nữa.

Để sử dụng hình ảnh (giả sử, .png ) trong một thành phần chỉnh sửa video:

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

Lưu ý rằng cho test.png, in= tham số không cần bằng 0 - tuy nhiên, hình ảnh sẽ được hiển thị cho out - in thời gian; trong trường hợp này, đơn giản là để lại in=0 tham số ra hoàn toàn.

Điều tốt là trình tự chỉnh sửa này có thể được lưu - hoặc như melt gọi nó là nối tiếp - vào một tập tin; lưu ý có hai các cách tuần tự hóa như vậy: "đơn giản" hoặc XML. Ví dụ, để lưu lệnh trên dưới dạng tệp tuần tự "đơn giản", chúng ta chỉ cần thêm -serialise [filename] chuyển sang lệnh:

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

Bây giờ file.melt chứa đựng:

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

Dường như, định dạng tệp tuần tự "đơn giản" này không chứa ký tự "nhận xét" - nếu tôi cố thêm # comment " hàng, melt phàn nàn với: ' Không thể tải "# bình luận" '(nhưng ngoài ra, dường như một dòng như vậy bị bỏ qua và phát lại vẫn tiếp tục). " .melt "dường như là một phần mở rộng melt công nhận là tập tin tuần tự đơn giản.

Bây giờ, để phát lại tập tin tuần tự này, về nguyên tắc chúng ta có thể gọi melt file.melt - tuy nhiên, một dòng lệnh đầy đủ hơn sẽ là:

melt melt_file:file.melt -consumer sdl

... có nghĩa là: sử dụng melt_file "nhà sản xuất" để mở file.meltvà hiển thị các khung của nó trên "người tiêu dùng" sdl (cửa sổ).

Lưu ý rằng tôi có kinh nghiệm, rằng (nói) .flv video phát không có vấn đề trên dòng lệnh - tuy nhiên, gây ra lỗi phân đoạn khi chúng được chỉ định trong file.melt tập tin nối tiếp! .dv video được sản xuất bởi melt chính nó, dường như làm việc tốt trong file.melt...

Kiểu tuần tự hóa XML có thể đạt được bằng cách sử dụng -consumer xml: công tắc điện ( thay vì -serialise ) - vì vậy ví dụ trên bây giờ sẽ là:

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

Để "phát lại" cái mới được tạo file.mlt Tệp XML, bây giờ có thể làm trực tiếp melt file.mlt - hoặc, một dòng lệnh đầy đủ hơn sẽ là:

melt xml:file.mlt -consumer sdl

... có nghĩa là: sử dụng xml "nhà sản xuất" ( lưu ý, trước đây nó là một người tiêu dùng ) mở file.mltvà hiển thị các khung của nó trên "người tiêu dùng" sdl (cửa sổ).

Lưu ý rằng trong trường hợp này, tôi đã trải nghiệm điều đó rất giống nhau .flv các video gây ra segfault với một tệp tuần tự hóa đơn giản - chỉ hoạt động tốt với tệp tuần tự hóa XML!

Trong trường hợp này, kết quả file.mlt Tệp XML có nhiều cài đặt hơn, chẳng hạn như độ phân giải, tốc độ khung hình, thông tin codec, v.v. - nhưng cũng khó thực hiện hơn trong trình soạn thảo văn bản:

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

Ngoài ra, đây là một ví dụ cho việc cắt khung chính xác: Cắt chính xác các tệp video từ dòng lệnh - Siêu người dùng
sdaau

6

Giải pháp ffmpeg cho vấn đề này trông giống như thế này:

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

Nó sử dụng các đường dẫn được đặt tên, do đó không tạo tệp tạm thời trên đĩa và cho phép bạn cắt các đoạn video clip và thêm hình ảnh.

Ví dụ này sử dụng thời gian 30-60 của đầu vào đầu tiên, sau đó thêm phút đầu tiên của đầu vào thứ hai, sau đó chèn một tệp hình ảnh, sau đó toàn bộ video thứ ba.

Mã được nâng từ:

trang ffmpeg concatenate: https://trac.ffmpeg.org/wiki/Concatenate

trang siêu người dùng Sử dụng ffmpeg để cắt video

trang siêu người dùng https://video.stackexchange.com/questions/12105/add-an-image-in-front-of-video-USE-ffmpeg


Cảm ơn vì điều đó, gần đây tôi cũng đã biết về ffmpeg-concat , được viết bằng JavaScript (và bạn cần npm để cài đặt nó), vì vậy tôi nghĩ rằng tôi đã đề cập đến nó
sdaau

4

Tôi cũng đã tìm kiếm một công cụ như vậy và có vẻ như tan chảy là công cụ cho công việc, tuy nhiên tài liệu gần như không thể hiểu / thiếu. Bạn có thể làm hầu hết mọi sự kết hợp chỉnh sửa. Tôi đã có một số cảnh quay 'hành động' ... âm thanh không thể sử dụng được. Tôi đã tham gia video (h264) cùng nhau, thêm âm thanh mờ 60 khung hình và thay thế âm thanh bằng âm thanh sử dụng:

% 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

Bạn có thể đọc thêm về nó đây . Trang web chính là đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.