Tôi đang làm việc trên một dự án phía máy khách cho phép người dùng cung cấp tệp video và áp dụng các thao tác cơ bản cho nó. Tôi đang cố gắng trích xuất khung hình từ video một cách đáng tin cậy. Hiện nay tôi có một <video>
mà tôi tải video được chọn vào, và sau đó kéo ra mỗi frame như sau:JavaScript: Trích xuất khung hình video đáng tin cậy
- Tìm kiếm tới đầu
- Tạm dừng video
- Vẽ
<video>
đến một<canvas>
- Chụp khung hình từ canvas với
.toDataUrl()
- Tìm kiếm trước 1/30 giây (1 khung).
- Rửa và lặp lại
Đây là một quá trình chứ không phải kém hiệu quả, và đặc biệt hơn, được chứng minh không đáng tin cậy như tôi thường bị mắc kẹt khung. Điều này có vẻ là từ nó không cập nhật phần tử thực tế <video>
trước khi nó vẽ lên canvas.
Tôi không muốn tải video gốc lên máy chủ chỉ để chia khung hình và sau đó tải chúng về máy khách.
Bất kỳ đề xuất nào cho cách tốt hơn để thực hiện việc này đều được đánh giá cao. Các chỉ báo trước là tôi cần nó để làm việc với bất kỳ định dạng hỗ trợ trình duyệt (giải mã trong JS không phải là một lựa chọn tuyệt vời).
thay vì tìm kiếm 1/30 về phía trước, bạn nên đính kèm một hàm mục 'timeupdate' sự kiện của video. Nhưng rõ ràng, nếu bạn không cần phải làm điều đó trên phía khách hàng, không sử dụng một trình duyệt cho rằng, ffmpeg hoặc bất kỳ công cụ video sẽ mạnh mẽ hơn cho việc này. – Kaiido
@Kalido Tôi sẽ xử lý nhiều hơn phía máy chủ, nhưng video đến từ máy khách và tôi cần các khung trên máy khách, vì vậy nếu tôi có thể tránh chu kỳ tải lên/tải xuống, tôi sẽ giảm giá nhiều hơn. Ngoài ra, theo như tìm kiếm, tôi đã gặp vấn đề với các thiết bị chậm hơn vì chúng không thể xử lý việc lấy dữ liệu khung đủ nhanh, tuy nhiên, tôi không quen với sự kiện 'timeupdate', vì vậy tôi sẽ xem xét nó . Ngoài ra, bằng cách xác định thời gian tìm kiếm cho mỗi khung hình, tôi có thể kiểm soát tốc độ khung hình nếu cần. –
Ok, vì vậy, bạn có thể làm rõ điểm này (rằng nó dành cho trang web, phía máy khách) trong bản chỉnh sửa cho câu hỏi của bạn, điều đó không rõ ràng chút nào. Ngoài ra, tốc độ khung hình trong trình duyệt hoàn toàn không đổi, vì vậy bạn không nên dựa vào nó. Nhưng tại mỗi khung mới được vẽ, sự kiện thời gian sẽ kích hoạt, vì vậy tôi tin rằng nó sẽ đáng tin cậy hơn. – Kaiido