Có thể sử dụng ffmpeg để cắt bớt X giây từ đầu video với độ dài không xác định?


20

Tôi cần cắt bớt chỉ 1 hoặc 2 giây đầu tiên của một loạt các bản ghi FLV có độ dài khác nhau, không xác định. Tôi đã tìm thấy nhiều tài nguyên để trích xuất thời lượng được chỉ định từ video (ví dụ: clip 30 giây), nhưng không có tài nguyên nào để tiếp tục đến cuối video.

Cả hai lần thử này đều mang lại một phiên bản sao chép của video, không muốn cắt xén:

ffmpeg -ss 2 -vcodec copy -acodec copy -i input.flv output.flv

ffmpeg -ss 2 -t 120 -vcodec copy -acodec copy -i input.flv output.flv

Ý nghĩ về cái thứ hai là: có lẽ nếu tôi chỉ định một độ dài vượt quá những gì có thể, thì nó sẽ đi đến cuối cùng. Không có con xúc xắc.

Tôi biết đó không phải là vấn đề với codec hoặc sử dụng giây thay vì mã thời gian vì những điều sau đây có tác dụng:

ffmpeg -ss 2 -t 5 -vcodec copy -acodec copy -i input.flv output.flv

Còn ý tưởng nào khác không? Tôi sẵn sàng sử dụng các công cụ dòng lệnh khác (dựa trên Windows), tuy nhiên tôi rất thích ffmpeg vì tôi đã sử dụng nó để tạo hình thu nhỏ và quen thuộc với nó.

Nếu nó giúp, tất cả các video của tôi sẽ dưới 2 phút.

CẬP NHẬT:

Tôi đã chuyển sang sử dụng Mencoder ( http://www.mplayerhq.hu/ ) vì có vẻ như ffmpeg sẽ không thực hiện được điều này nếu không có thêm một số tin tặc.

Cú pháp Mencoder để thực hiện những gì tôi đặt ra là:

mencoder.exe -ss 2 -oac copy -ovc copy input.flv -o output.flv

Vì vậy, bạn thích cái nào hơn; các mencoderví dụ, ở trên; hoặc ffmpegví dụ, dưới đây?
tiếng nói

Câu trả lời:


16

Thử:

ffmpeg -i input.flv -ss 2 -vcodec copy -acodec copy output.flv

Tôi nghĩ rằng tham số đầu vào được cho là đầu tiên.


Cảm ơn vì sự trả lời. Thứ tự tham số tôi đã sử dụng ở trên cung cấp kết quả tương tự, vì vậy tôi không nghĩ đó là thứ tự. Sau khi từ bỏ ffmpeg, khoảng thời gian keyframe của tôi đã gây ra sự cố với các công cụ khác. Sau khi xem lại điều này ngay bây giờ, đó là khoảng thời gian keyframe. Nó được đặt thành 5 giây trước đó và tôi đã đặt nó thành 1 giây. Sau 5 giây, cả lệnh của bạn và lệnh tôi đã thử ở trên đều mang lại khoảng trắng ở đầu (giá trị 3 giây, không có gì đáng ngạc nhiên). Trong 1 giây, nó hoạt động như mong đợi.
marcelebrate

Điều này cũng hiệu quả với mp3
geotheory 11/07/2015

4
Như đã giải thích trong FFmpeg Seeking , sử dụng -ss làm tham số đầu vào (trước -i) trong khi sao chép hoặc thậm chí chuyển mã với phiên bản cũ hơn của FFmpeg, sử dụng tìm kiếm khung hình chính. Điều này nhanh hơn nhiều, nhưng hy sinh độ chính xác. Nếu bạn sử dụng nó làm tham số đầu ra, quá trình có khả năng chậm hơn nhiều (đầu vào được giải mã từng khung theo từng khung ngay cả đối với các phần bị loại bỏ), nhưng chính xác. Mặc dù câu hỏi đã cũ, tôi nghĩ đây nên là câu trả lời được chấp nhận.
Jonathan Y.

23

Hóa ra lệnh này sẽ cắt video từ 2 giây trở đi, như mong đợi:

ffmpeg -i input.flv -ss 2 -vcodec copy -acodec copy output.flv

Vấn đề là với khoảng thời gian keyframe trong input.flv. Nó được đặt thành 5 giây, mang lại các khung màu đen có giá trị 3 giây ở đầu video (5 - 2 = 3). Tôi đã thay đổi khoảng thời gian keyframe của mình thành 1 giây, mặc dù 2 giây có thể cũng mang lại kết quả mong muốn trong trường hợp của tôi.

CẬP NHẬT: Cập nhật thứ tự -i-ssthông số theo câu trả lời của Dave, mà tôi đã chấp nhận tín dụng.


2
Tôi đã có vấn đề này là tốt. Bài đăng này đã làm điều đó cho tôi. Tôi cắn viên đạn và ngừng cố gắng sử dụng -vcodec copy -acodec copycho tất cả các lệnh chỉnh sửa của mình. Mã hóa lại đã ngăn các khung đen từ đầu video của tôi hoặc không cắt đúng điểm (sự khác biệt của một giây mà không mã hóa lại được chuyển thành sự khác biệt gần 5 giây trong video). Vì vậy, tôi đã kết thúc thay thế -vcodec copybằng -vcodec libx264 -crf 0.
Hendy

2
Tôi chỉ gặp phải điều tương tự. Tôi phát hiện ra rằng tôi không thể chỉ -vcodec copyvì lát cắt không bắt đầu trên khung hình chính. Tôi đã nhận được một hình ảnh tĩnh hoặc hình ảnh đen trong N giây cho đến khung hình chính tiếp theo. Nếu tôi thực sự mã hóa lại, thay vì sao chép, nó hoạt động như mong đợi. Vì vậy, mặc dù đầu vào và đầu ra của tôi đều là H264, tôi vẫn cần phải mã hóa lại (sử dụng -vcodec libx264thay vì -vcodec copy).
Karl Wilbur

Câu trả lời của Daves là câu trả lời đúng như phiên bản mới nhất của ffmpeg. Các -inên đến trước -ss.
Sắp xếp

0

Sử dụng -ss và -to trước -i như thế này:

ffmpeg -ss 00:01:10 -to 00:02:10 -i input -c copy output

0

Cập nhật câu trả lời này, kể từ năm 2019, lệnh bây giờ là:

ffmpeg -i input.flv -ss 2 -c copy output.flv
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.