Cắt một phần từ tệp video từ vị trí bắt đầu đến vị trí kết thúc bằng FFmpeg [trùng lặp]


144

Câu hỏi này đã có câu trả lời ở đây:

Tôi có một tệp video dài 30 phút, nhưng tôi muốn trích xuất một video từ 00:09:23 đến 00:25:33.

Tôi có thể xác định vị trí bắt đầu với -ss, nhưng tôi không thể tìm thấy vị trí cho vị trí kết thúc. Có ai giúp đỡ không?

Câu trả lời:


244

Cài đặt ffmpeg

Đảm bảo bạn tải xuống phiên bản gần đâyffmpeg và không sử dụng phiên bản đi kèm với bản phân phối của bạn (ví dụ: Ubuntu). Các phiên bản đóng gói từ các bản phân phối khác nhau thường lỗi thời và không hoạt động như mong đợi.

Hoặc tự biên dịch nó .

Cách cắt video mà không cần mã hóa lại

Sử dụng điều này để cắt video từ [start]cho [duration]:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c copy out.mp4

Ở đây, các tùy chọn có nghĩa như sau:

  • -sschỉ định thời gian bắt đầu, ví dụ 00:01:23.000hoặc 83(tính bằng giây)
  • -t chỉ định thời lượng của clip (cùng định dạng).
  • Gần đây ffmpegcũng có một lá cờ để cung cấp thời gian kết thúc với -to.
  • -c copysao chép dòng bit video, âm thanh và phụ đề đầu tiên từ đầu vào sang tệp đầu ra mà không mã hóa lại chúng. Điều này sẽ không gây hại cho chất lượng và khiến lệnh chạy trong vài giây.

Cách cắt video, với mã hóa lại

Nếu bạn bỏ -c copytùy chọn, ffmpegsẽ tự động mã hóa lại video và âm thanh đầu ra theo định dạng bạn đã chọn. Để có video và âm thanh chất lượng cao, hãy đọc Hướng dẫn mã hóa x264Hướng dẫn mã hóa AAC tương ứng.

Ví dụ:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c:v libx264 -c:a aac -strict experimental -b:a 128k out.mp4

1
Trên Ubuntu 12:10, -c: v và -c: không hoạt động. Tôi đã phải sử dụng "-acodec copy và -vcodec copy" để thay thế.
Samuel Lampa

1
@Samuel Sau đó, bạn đang sử dụng một phiên bản lỗi thời, thậm chí không phải là FFmpeg thực, mà là ngã ba Libav. Xem: stackoverflow.com/a/9477756/1109017
slhck

Cảm ơn vì điều đó! nếu bạn không chỉ định thời lượng, nó sẽ kết thúc chứ?
Jeff

@Jeff Vâng! (tối thiểu ký tự)
slhck

3
@Prateek Khi sao chép dòng bit video (thay vì mã hóa lại), bạn chỉ có thể cắt tại các khung hình chính . Nếu có các khung hình chính ở giây 1, 2 và 3, nhưng bạn muốn cắt ở giây thứ 1,5, thì ffmpeg sẽ đợi đến giây thứ 2 trước khi có thể bắt đầu cắt. Điều đó làm cho nó không chính xác.
slhck

26

Tôi nghĩ rằng bạn có thể sử dụng lệnh sau bây giờ.

ffmpeg -i inputFile -vcodec copy -acodec copy -ss 00:09:23 -to 00:25:33 outputFile

Có một cái nhìn cũng ffmpeg Doc , hoặc trang wiki này .


6
ffmpeg -i inputFile -c copy -ss 00:09:23 -to 00:25:33 outputFilephiên bản đơn giản hơn
nwgat

3
Tôi đã phải sử dụng ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy -copyts cut.mp4phiên bản (với -copyts), nếu không nó đã cắt không chính xác (với màn hình đen lúc đầu). Cảm ơn cho liên kết thứ 2 mặc dù.
Necronomicron

Điều này thật tuyệt, điều cuối cùng tôi muốn là tính toán thời lượng từ các điểm cuối.
Tomasz Gandor

Tùy chọn -to trả lời câu hỏi đã được hỏi. Phần còn lại của câu trả lời là không hoàn hảo hoặc lỗi thời.
James Bowery

12

Đây là số lẻ mà không ai đề xuất trim bộ lọc .

Bỏ mọi thứ trừ phút thứ hai của đầu vào:

ffmpeg -i INPUT -vf trim=60:120

Chỉ giữ lại giây đầu tiên:

ffmpeg -i INPUT -vf trim=duration=1

Bỏ tất cả mọi thứ trừ từ thứ hai 13 xuống thứ hai 58:

ffmpeg -i INPUT -vf trim=13:58 OUTPUT

8
Vâng, tốt để đề cập đến trimatrim. Tôi thường sử dụng những thứ này khi lọc, nhưng người dùng nên lưu ý rằng việc lọc đòi hỏi phải mã hóa lại .
llogan

Bạn là người hùng của tôi. Tôi rất cần một bộ lọc đã làm điều này.
fahadash

5

Bạn có thể sử dụng hai phương thức này hoạt động cho Windows và Linux.

Có hai cách để phân chia tệp video bằng ffmpeg. Cái đầu tiên là tốt, hơn thế nữa - nó nhanh hơn, nhưng đôi khi tạo ra các tệp đầu ra với một số sai sót nhất định. Vì vậy, đối với những trường hợp đó, có cách phân chia tệp video thứ hai: chậm hơn đáng kể, các tệp đầu ra lớn hơn, nhưng dường như chúng luôn có cùng mức chất lượng như các tệp đầu vào được sử dụng.

Cách 1:

ffmpeg -ss <start> -i in1.avi -t <duration> -c copy out1.avi

Cách 2:

ffmpeg -ss <start> -i in1.avi -t <duration> out1.avi
  • <start>- sự khởi đầu của một phần của video ffmpeg là cắt bỏ. Định dạng : 00:00:00.0000, nghĩa là giờ: phút: giây: mili giây.

  • <duration>- thời lượng của một phần của video ffmpeg sẽ bị cắt. Định dạng giống như trên.

Ví dụ:

ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 -c copy out1.avi
ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 out1.avi

ffmpeg cắt bỏ một phần của tệp video bắt đầu từ 1 giờ 19 phút 0 giây. Thời lượng của chuỗi video bị cắt là 5 phút 0 giây.


Ok, thnx. Sẽ kiểm tra các tài liệu và thử nó vào ngày mai.
juGGaKNot

3
-sameqkhông có nghĩa là "cùng chất lượng" và đã bị xóa khỏi ffmpeg. Sử dụng -codec copythay thế. Ngoài ra, đừng quên -totùy chọn.
llogan

Tôi đã sửa các lệnh trong trích dẫn của bạn, vì chúng đã khá lỗi thời. Vui lòng không sao chép-dán thông tin mà không trích dẫn chính xác.
slhck

-1

Bạn có thể sử dụng cái này

ffmpeg -sameq -ss clip_start -t duration  -i  original.ogg  clip.ogg

Ở đây bạn phải đưa ra thời lượng của video. I E. 00: 25: 33-00: 09: 23


1
Như tôi đã đề cập ở câu trả lời khác: Với lệnh của bạn, bạn đang mã hóa lại tệp, điều này hoàn toàn không cần thiết và dẫn đến giảm chất lượng và tăng thời gian xử lý.
slhck

-2

Tôi sử dụng cú pháp sau để cắt video với ffmpef:

ffmpeg -sameq -ss [start_seconds] -t [duration_seconds] -i [input_file] [outputfile]

-t được sử dụng để đặt thời lượng tính bằng giây - bạn không thể chỉ định thời gian kết thúc nhưng điều này sẽ phù hợp với bạn.


1
Tại sao bạn đặt FFmpeg để mã hóa lại tệp? Lưu ý rằng điều -sameqđó không có nghĩa là "cùng một chất lượng".
slhck
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.