2016-01-29 21 views
10

Tôi có video (gọi là video tổng hợp) được tạo bởi nhiều video khác được nối bằng một số mẫu. Ví dụ, xem ảnh chụp màn hình của các đoạn video dưới đây, sáng tác bởi hai đến bốn định dạng video khác, tương ứng:Hiển thị cùng một video trong nhiều thẻ <video>

2-videos example

4-videos example

Tuy nhiên, tôi cần phải hiển thị một cách khác: Một chính, lớn, video và N-1 hình thu nhỏ video, trong đó N là tổng số video. Dưới đây là màn hình này khác tương ứng với các đoạn video trên:

Main video + 1 thumbnail

Main video + 3 thumbnails

Để hiển thị chính Tôi đang sử dụng một sự kết hợp của HTML và CSS để xác định vị trí các đoạn video tôi muốn trong div lớn hơn. Nó chạy trơn tru, bất kể số lượng video trong video tổng hợp.

Để hiển thị hình thu nhỏ, tôi đang sử dụng <canvas> để vẽ những phần tôi muốn:

video.addEventListener('play', function() { 
    (function loop() { 
    drawThumbnails(); 
    setTimeout(loop, 1000/30); // drawing at 30fps 
    })(); 
}, false); 

function drawThumbnails() { 
    for (var i = thumbs.length - 1; i >= 0; i--) { 
    drawThumbnail(thumbs[i]); 
    }; 
} 

function drawThumbnail(thumb) { 
    var thumbNumber = Number(thumb.id.match(/\d+/g)); 
    var canvasContext = thumb.getContext('2d'); 
    var thumbCoordinates = getVideoCoordinates(thumbNumber); 
    var srcX = thumbCoordinates.column * videoWidth; 
    var srcY = thumbCoordinates.row * videoHeight; 

    canvasContext.drawImage(
     video, srcX, srcY, videoWidth, videoHeight, // Source 
     0, 0, thumb.width, thumb.height); // Destination 
} 

Nó được làm việc tốt cho 3 (đôi khi 4) video. Tuy nhiên, do số lượng video trong video tổng hợp tăng lên nên các video trong hình thu nhỏ bắt đầu đóng băng và không chạy một cách trơn tru. Điều này có thể xảy ra vì có quá nhiều xử lý hình ảnh đang được thực hiện cùng một lúc.

Tôi nghĩ rằng cách thích hợp để làm điều đó là, bằng cách nào đó, sử dụng <video> và các phương pháp cụ thể cho video chứ không phải cho hình ảnh. Tôi cũng đã cố gắng sử dụng cùng một src trong nhiều thẻ <video> (một cho mỗi hình thu nhỏ) và thêm eventListeners để phát/tạm dừng video trong hình thu nhỏ khi video chính được phát/tạm dừng. Điều đó không hiệu quả lắm, đặc biệt vì thỉnh thoảng các video có thể bị đồng bộ khi tìm kiếm/lưu vào bộ đệm.

Có cách nào chỉ sử dụng một video trong nhiều thẻ <video> và chỉ sử dụng một trong số chúng (trong trường hợp của tôi, video chứa video chính) để kiểm soát tất cả các video khác không? Trong trường hợp không có cách nào để làm điều đó, có cách tiếp cận thay thế nào cho vấn đề của tôi không?

Cảm ơn rất nhiều,

P.S. Có nhiều, tách biệt, video không phải là một tùy chọn trong tình huống của tôi. Sẽ mất rất nhiều thời gian để xử lý video đầu vào và chia nó thành nhiều video.

Trả lời

0

Bạn chắc chắn có thể tham chiếu cùng một video trên nhiều phần tử video. Nhân bản bản gốc và thêm chúng dưới dạng video thu nhỏ có thể làm giảm bớt một số tedium.

Lặp lại các hình thu nhỏ và .play() nhập chúng sẽ được sử dụng miễn là bạn đặt currentTime của video đó trước video chính trước khi phát, để giảm thiểu độ trôi. Có thể cần phải chờ đợi canplay để kích hoạt video chính và/hoặc hình thu nhỏ tùy thuộc vào trải nghiệm chính xác mà bạn muốn phân phối.

Nếu mỗi hình thu nhỏ được cung cấp một vùng chứa mẹ, bạn có thể định vị phần tử video phân phối dưới dạng hình thu nhỏ sao cho chỉ phần video bạn quan tâm thấy được hiển thị, cắt phần còn lại.

FWIW, CSS masking có thể được bạn quan tâm như một tối ưu hóa hiệu suất nếu nó giúp hiệu suất tổng hợp.

Bạn sẽ cần phải phối hợp thủ công phát/tạm dừng tất cả các phần tử video, nhưng điều đó phải dễ dàng thực hiện với đối tượng mặt tiền xử lý tạm dừng phát của tất cả các phần tử video "được liên kết".

0

Định dạng của video chính là gì? Đây có phải là tệp mp4/webm theo yêu cầu không?

Nếu bạn vẫn muốn đi với cách tiếp cận của bạn lấy khung và sơn chúng nhưng đang đối mặt với vấn đề hiệu suất, hãy xem xét sử dụng công nhân web cho công việc nặng nhọc. Here bạn có thể tìm thấy một số ví dụ về thao tác video/canvas với nhân viên web.

+0

Nhân viên web bị giới hạn bởi vì tôi không thể thao tác DOM trên nhiệm vụ của họ. Do đó, nút cổ chai vẫn còn trên sợi chính. Nhưng cảm ơn! –

1

Tôi biết tôi đăng bài muộn và bạn có thể đã tìm thấy câu trả lời. Tuy nhiên, nếu có ai khác gặp phải câu hỏi này, đây là câu trả lời của tôi:

Bạn có thể sử dụng nhiều phần tử video có cùng nguồn. Cách để làm điều đó là với css.

.wrapper { 
    height: /*height of one video*/; 
    width: /*width of one video*/; 
    overflow: hidden; 
} 
video { 
    position: relative; 
    top: /*height offset*/; 
    left: /*width offset*/; 
} 

Và HTML

<div class="wrapper"> 
    <video src="myvideo.mp4"></video> 
</div> 

Vì vậy, nếu tôi đang làm video trên bên phải, và mỗi người là 250px 250px, tôi sẽ đặt wrapper của tôi heightwidth-250px và video của tôi top để 0px và video của tôi left đến 250px

Các vấn đề liên quan