Thêm lớp phủ hình ảnh phía trước video bằng ffmpeg


31

Tôi có nhiều video và tôi cần đặt một hình ảnh trước mặt chúng trong khoảng 5 giây, nhưng việc thêm nó bằng tay và hiển thị nó mỗi lần sẽ rất lâu, vì vậy tôi hỏi liệu có thể làm như vậy qua ffmpeg và nếu bạn có thể, xin vui lòng, giúp tôi với nó vì tôi không có kinh nghiệm với ffmpeg. Tôi đã tìm thấy một số lệnh đã có nhưng không có lệnh nào hoạt động. Cái này chẳng hạn.

ffmpeg -itsoffset 5 -i in.mp4 -r 25 -loop 1 -i intro.png -filter_complex "[1:v] fade=out:125:25:alpha=1 [intro]; [0:v][intro] overlay [v]" -map "[v]" -map 0:a -acodec copy out.mp4

1
Có phải bạn chỉ sao chép lệnh đó hoặc viết nó theo nhu cầu của bạn? Tôi đang hỏi bởi vì lệnh này liên quan đến những thứ như mờ dần và tất cả các loại nội dung khác không có trong câu hỏi của bạn. Bạn chỉ cần phủ một hình ảnh hoặc bạn cần nhiều hơn thế?
PTS

Tôi đã sao chép nó từ một nơi nào đó, tất cả những gì tôi cần chỉ là đặt hình ảnh trước video.
Azthy

Câu trả lời:


44

Bạn có thể thực hiện lớp phủ hình ảnh đơn giản bằng cú pháp sau:

ffmpeg -i input.mp4 -i image.png \
-filter_complex "[0:v][1:v] overlay=25:25:enable='between(t,0,20)'" \
-pix_fmt yuv420p -c:a copy \
output.mp4

overlay=25:25 có nghĩa là chúng tôi muốn định vị hình ảnh 25px ở bên phải và xuống 25px, bắt nguồn từ góc trên cùng bên trái (0: 0).

enable='between(t,0,20)' có nghĩa là chúng tôi muốn hình ảnh hiển thị trong khoảng từ 0 đến 20.

[0:v][1:v]có nghĩa là chúng tôi muốn tệp video đầu tiên chúng tôi nhập -i, trong trường hợp input.mp4 hoặc cách ffmpeg thấy tệp đầu vào video số 0, nằm trong tệp đầu vào video 1, trong trường hợp của chúng tôi image.png. :vchỉ có nghĩa là chúng tôi muốn video 0 và video 1. [0:a]có nghĩa là chúng tôi muốn bản nhạc âm thanh được nhập đầu tiên. Điều này cũng sẽ đến từ input.mp4 nhưng sẽ trỏ đến đoạn âm thanh thay vì đoạn video trong tệp mp4.

Nếu bạn muốn có một chất lượng / cài đặt hình ảnh nhất định chứ không phải cài đặt mà ffmpeg chọn, hãy thêm các tùy chọn mã hóa hình ảnh và âm thanh bạn muốn sử dụng. Bộ mã hóa video mặc định sẽ là x264. Kiểm tra hướng dẫn mã hóa H.264 để biết các cài đặt có thể.

Các -acodec copy/ -c:a copymà bạn có trong lệnh của bạn fe sẽ chỉ đơn giản là tái sử dụng các âm thanh từ các tập tin nguồn. Mặc dù bạn không thể làm điều đó với video tất nhiên (trong trường hợp này), điều đó phải được chuyển mã vì chúng tôi đang tạo nguồn video mới.

Nếu bạn muốn chuyển mã âm thanh, hãy loại bỏ -c:a copyphần đó. Bạn có thể phải xác định rõ ràng một bộ mã hóa, ví dụ -c:a aac -strict experimental. Xem hướng dẫn mã hóa AAC để biết thêm.


Lặp lại sau đây của lệnh trên đã làm việc cho tôi trên Android vì lệnh ban đầu và lỗi như aac là một tính năng thử nghiệm: ffmpeg -i input.mp4rict -2 -i image.png -filter_complex [0: v] [1: v] lớp phủ = 25: 25: enable = 'giữa (t, 0,20)'
output.mp4

Có cách nào để định vị ở phía dưới mà không biết chiều cao? hoặc xa bên phải mà không biết chiều rộng?
chovy

chắc chắn, chỉ cần phân tích video với ffprobe và trích xuất kích thước của video từ đầu ra. Có thể đó cũng là một tùy chọn được tích hợp trong ffmpeg nhưng tôi không biết về nó.
PTS

3
Lệnh của bạn thay thế một đoạn của tệp video gốc, nhưng người dùng có thể muốn thêm (do đó tăng thời lượng video) một hình ảnh trước và / hoặc sau video. Xin hãy giúp đỡ với điều này
porton

1
@laurent phụ thuộc vào tệp nguồn và đầu ra của bạn. pix_fmt là viết tắt của định dạng pixel. Có rất nhiều định dạng pixel khác nhau có sẵn cho các codec khác nhau, chỉ định một định dạng đảm bảo bạn không kết thúc với một cái gì đó không phù hợp với bạn. yuv420p là định dạng pixel được hỗ trợ nhiều nhất khi nói đến h264 nhưng cũng có yuv422p và yuv444p chẳng hạn.
PTS
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.