Câu hỏi Sử dụng ffmpeg để cắt video


Tôi đang sử dụng ffmpeg để cắt ra một phần của một tập tin lớn như thế này:

ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv

Các -ss một phần hoạt động tốt nhưng -t bị bỏ qua. Nó chính xác loại bỏ các giây được chỉ định ban đầu được chỉ định bằng -ss nhưng sau đó tiếp tục đi đến cuối đầu vào với bản sao.

Có cách nào để sử dụng ffmpeg để cắt đứt phần cuối của video mà không cần mã hóa lại không?


251
2018-05-06 14:12


gốc


cú pháp này là chính xác. - jiggunjer
stackoverflow.com/questions/18444194/… - Ciro Santilli 新疆改造中心 六四事件 法轮功


Các câu trả lời:


Bạn có thể dùng -ss tùy chọn để chỉ định dấu thời gian bắt đầu và -t tùy chọn để xác định thời lượng mã hóa. Dấu thời gian cần phải ở HH:MM:SS.xxx định dạng hoặc tính bằng giây (s.msec).

Đoạn sau sẽ clip 30 giây đầu tiên, sau đó cắt mọi thứ sau 10 giây sau đó:

ffmpeg -ss 00:00:30.0 -i input.wmv -c copy -t 00:00:10.0 output.wmv
ffmpeg -ss 30 -i input.wmv -c copy -t 10 output.wmv

Lưu ý rằng -t là một tùy chọn đầu ra và luôn luôn cần phải được chỉ định sau  -i.

Một số lời khuyên:

  • Đối với các phiên bản ffmpeg cũ hơn, nếu bạn sử dụng -ss sau -i, bạn sẽ tìm kiếm chính xác hơn với chi phí thực hiện chậm hơn. Xem thêm: Tìm kiếm với FFmpeg
  • Bạn có thể dùng -to thay vì -t để chỉ định dấu thời gian mà bạn muốn cắt. Vì vậy, thay vì -i <input> -ss 30 -t 10 bạn cũng có thể làm -i <input> -ss 30 -to 40 để đạt được điều tương tự.

  • Nếu ffmpeg của bạn không hỗ trợ -c, hoặc là -to, rất có thể là lỗi thời. Biên dịch phiên bản mới bản thân bạn hoặc tải xuống một bản dựng tĩnh từ trang chủ của họ. Nó thực sự không phức tạp.


302
2018-05-15 00:03



@ Thực sự, bạn sẽ có được độ chính xác hơn khi đặt -ss sau. Và slhck đề cập đến điều này ở đây blog.superuser.com/2012/02/24/…  cũng trong tài liệu ffmpeg cho -ss nó đề cập đến một sự khác biệt giữa đặt nó trước hoặc sau. - barlop
+1 Tôi đến đây để tìm ra cách bỏ qua mọi thứ sau 35 giây đầu tiên, cảm ơn: ffmpeg -i input.wmv -c copy -t 35 output.wmv - karlphillip
Điều này không làm việc cho tôi (mp4). Nó chỉ tạo ra màn hình đen 5 giây: frame= 150 fps=0.0 q=-1.0 Lsize= 264kB time=00:00:09.97 bitrate= 216.6kbits/s - clocksmith
Điều này tạo ra màn hình đen 3-4 s ở đầu video clip của tôi. Sửa đổi của Chris với việc bỏ qua -c copy đã xóa màn hình đen ban đầu, xem câu trả lời của anh ấy để biết chi tiết. - Joel Ostblom
Bạn viết "Đoạn sau sẽ cắt 30 giây đầu tiên, và sau đó cắt mọi thứ sau 10 giây sau đó:" <- Điều đó có nghĩa là gì? Theo clip bạn có nghĩa là bao gồm? 'cos clip có thể có nghĩa là clip ra. Giả sử bạn có nghĩa là bao gồm. Bạn có nghĩa là Bắt đầu từ 30 giây trong và chỉ bao gồm 10 giây từ đó? Nếu vậy thì tôi đề nghị bạn viết rằng nó sẽ rõ ràng hơn nhiều. - barlop


Như những người khác đã đề cập, đưa -ss trước (nhanh hơn nhiều) hoặc sau (chính xác hơn) -i tạo nên sự khác biệt lớn. Phần "Tìm kiếm nhanh và chính xác" trên trang tìm kiếm ffmpeg cho bạn biết cách để có được cả hai, và tôi đã sử dụng nó, và nó tạo ra sự khác biệt lớn. Về cơ bản bạn đặt -ss trước VÀ sau -i, hãy chắc chắn để lại đủ thời gian trước khi bạn muốn bắt đầu cắt để có một khung chính khác. Thí dụ: Nếu bạn muốn tạo một clip dài 1 phút, từ 9min0sec đến 10min 0 giây trong Video.mp4, bạn có thể thực hiện cả một cách nhanh chóng và chính xác bằng cách sử dụng:

ffmpeg -ss 00:08:00 -i Video.mp4 -ss 00:01:00 -t 00:01:00 -c copy VideoClip.mp4

Đầu tiên -ss tìm kiếm nhanh tới (khoảng) 8min0 giây, và sau đó là giây -ss tìm kiếm chính xác đến 9min0sec và -t 00:01:00 lấy ra một clip 1min0sec.

Cũng lưu ý điểm quan trọng này từ trang đó: "Nếu bạn sử dụng -ss với -c:v copy, bitstream kết quả có thể kết thúc là bị thay đổi, không thể phát hoặc không đồng bộ với luồng âm thanh, vì ffmpeg buộc phải chỉ sử dụng / chia nhỏ trên i-frames. "

Điều này có nghĩa là bạn cần phải mã hóa lại video, ngay cả khi bạn chỉ muốn sao chép video hoặc có nguy cơ bị giật và không đồng bộ. Bạn có thể thử -c copy đầu tiên, nhưng nếu video đó bạn sẽ cần phải làm lại.


71
2018-01-20 04:07



cùng một cảnh báo áp dụng cho -c:a copy cho cách tìm kiếm này. - jiggunjer
Câu trả lời hay nhất, cách này làm việc tốt nhất cho tôi. - Ondra Žižka


Tôi thấy rằng -ss kết hợp với -c copy kết quả là một nửa giây ở đầu.

Để tránh điều đó, bạn phải xóa -c copy (mà phải thừa nhận sẽ thực hiện chuyển mã).


17
2018-05-09 02:24



Có một câu trả lời khác đề cập đến độ chính xác. Mã hóa lại với tùy chọn mặc định thường KHÔNG phải những gì bạn muốn làm! - Tomasz Gandor
Điểm tốt @TomaszGandor - Chris
Tôi không hiểu câu trả lời của @ TomaszGandor chút nào, nhưng việc xóa -c copy sửa nó. - Iulian Onofrei


HƯỚNG DẪN

Mở tệp trong trình phát đa phương tiện sẽ hiển thị trước khung hình và phát Tệp AVISynth với dữ liệu như:

DirectShowSource(("C:\Downloads\Video\Do you want him.flv"), Pixel_Type="yuy2").Crop(0,0,-0,-0)
Subtitle("C:\Downloads\Video\Do you want him.flv", font="Arial", size=24, text_color=$ff0000, align=3)
ShowFrameNumber(scroll=true, x=336, y=27, font="Arial", size=24, text_color=$ff0000)
ShowTime(x=398, y=44, font="Arial", size=24, text_color=$ff0000)

Sau đó cắt theo định dạng thời gian EXACT:

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:05.240 -to 00:00:08.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him1.flv"

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:10.240 -to 00:00:14.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him2.flv"

Bây giờ tạo một tệp txt với các tệp video có nội dung như:

file 'C:\Downloads\Video\Do you want him1.flv'
file 'C:\Downloads\Video\Do you want him2.flv'

Chạy ffmpeg:

ffmpeg -f concat -i FileList.txt -c copy "Path\NewName_joined.flv"

13
2017-09-04 05:48





Cho tôi -t tùy chọn không hoạt động, nhưng -vframes đã làm việc. Tôi thích sử dụng #frames, vì tôi thà cắt tại I-Frames và tôi đã tìm ra GOP cho video bằng cách sử dụng ffprobe.

Dòng lệnh làm việc cho tôi là:

ffmpeg -ss 60s -i input.wmv -vframes 1800 -acodec copy -vcodec copy output.wmv

Nhân tiện, đặt -ss phía trước của -i tạo sự khác biệt lớn trong thời gian thực hiện.


7
2018-05-19 03:14



Thực ra -vframes (hoặc là -frames:v) nên đến sau -i bởi vì nó là một lựa chọn đầu ra. - slhck


Như với user225366, tùy chọn -t không hoạt động đối với các video ngắn, nhưng nó cho video dài hơn. Đối với các video ngắn, có vẻ như các khung hình: v là tốt hơn. Đây là những gì làm việc cho tôi.

ffmpeg -ss 4 -i input.mp4 -frames:v 200 -vcodec copy output.mp4

Bản sao -acodec cần phải thêm nếu video có âm thanh, như các câu trả lời khác hiển thị.


1
2017-12-08 11:24