2015-02-09 42 views
11

Có cách nào để xác định tốc độ khung hình dự kiến ​​của nội dung phát trong phần tử video html không?Cách xác định tỷ lệ khung hình mong muốn trên phần tử video html

Phần tử video thậm chí còn biết FPS hoặc khung hình dự định hay chỉ đơn giản là "đoán" (có thể là 24 khung hình/giây) và phát ở tốc độ đoán?

Dưới đây là những nỗ lực không thành công của tôi:

  • Hãy tìm một FPS hay tài sản FrameCount trên yếu tố video riêng của mình - Không!

  • Tìm thông tin tiêu đề định dạng video chéo về FPS hoặc FrameCount - Không có gì phù hợp!

  • Tìm kiếm sự kiện được kích hoạt khi thay đổi khung - Không!

Lần thử tiếp theo của tôi phức tạp hơn: Lấy mẫu video bằng cách chụp khung thành phần khung và đếm khung bằng cách xác định thời điểm các pixel thay đổi.

Có ai có câu trả lời đơn giản hơn trước khi tôi thực hiện nỗ lực phức tạp không?

+0

hộp chứa mp4 (nguyên tử MOOV) chứa tốc độ khung hình mục tiêu, vì vậy tôi giả sử useragent đọc và sử dụng nó để kiểm soát mục tiêu playb tỷ lệ ack – Offbeatmammal

+0

@Offbeatmammal, Cảm ơn, thuộc tính đó trên mp4 rất hữu ích ngay cả khi trình duyệt không sử dụng nó để kiểm soát tốc độ phát lại. Tuy nhiên, đó là một giải pháp từng phần vì tôi không thể tìm thấy các thuộc tính khung hình tương tự trên các mã hóa khác. : -/ – markE

Trả lời

10

Biết tốc độ khung hình của video sẽ không hữu ích như bạn nghĩ.
Trình duyệt sử dụng một số thủ thuật để tạo kết hợp giữa tốc độ khung hình của phim và tốc độ làm mới của màn hình, vì vậy nếu bạn nhìn vào thuộc tính currentTime, bạn sẽ thấy thời lượng khung hình thực tế (== currentTime - trước đây currentTime) không phải là hằng số, nó thay đổi từ khung thành khung.

On video mẫu này: http://jsfiddle.net/3qs46n4z/3/ mô hình là:
4-1-5-1:
4 khung hình ở 21,3 + 1 khung tại 32 + 5 khung hình ở 21,3 + 1 khung tại 32.

Vì vậy, nếu bạn muốn luôn hiển thị khung hình mới nhất trên canvas trong khi tránh quá tải, giải pháp có thể là:
- Trên mỗi rAF, hãy xem thời gian hiện tại của video:
• Tương tự? -> không làm gì cả.
• Đã thay đổi? -> cập nhật khung.

Và bất cứ điều gì bạn muốn làm, so sánh hai currentTime === hai con số có thể là nhanh hơn so với so sánh hai imageDatas ;-)

Edit: nhìn vào thông số kỹ thuật để tìm bằng chứng về câu nói của tôi, tôi tìm thấy một sắc thái với chú giải này:

Which frame in a video stream corresponds to a particular playback position is defined by the video stream's format. 

(Ghi chú của 4.8.6 tại http://www.w3.org/TR/2011/WD-html5-20110113/video.html)

Vì vậy, nghiêm nói rằng chúng tôi chỉ có thể nói đó (thời điểm hiện tại là như nhau) ngụ ý (các khung giống nhau).
Tôi chỉ có thể đặt cược rằng nghịch đảo là đúng => thời gian khác nhau có nghĩa là khung khác nhau.
Trong ví dụ trên, Chrome đang cố gắng khớp 24Hz của phim trên máy tính 60Hz của tôi bằng cách cố gắng nhận 45 Hz (= 60/2 + 60/4), gần nhất từ ​​48 = 2 * 24. Đối với 21 khung được tạo, tôi không biết liệu nó có nội suy hay chỉ sao chép các khung hình.Nó chắc chắn thay đổi tùy thuộc vào trình duyệt/thiết bị (đặc biệt là Gpu). Tôi đặt cược bất kỳ máy tính để bàn gần đây hoặc điện thoại thông minh mạnh mẽ nào nội suy.

Dù sao cho chi phí cao của việc kiểm tra bằng imageData, bạn sẽ vẽ tốt hơn hai lần so với kiểm tra.

Rq1: Tôi tự hỏi mức độ sử dụng chế độ Xor + thử nghiệm với 0 32 bit tại một thời điểm có thể tăng thời gian so sánh. (getImageData chậm.)

Rq2: Tôi chắc chắn có cách sử dụng tốc độ phát lại để 'đồng bộ hóa' video và hiển thị và biết khung nào là chính hãng (== không được nội suy)) khung. (Vì vậy, hai vượt qua ở đây 1) đồng bộ 2) tua lại và lấy khung).

Rq3: Nếu mục đích của bạn là thu hút mỗi khung hình video và chỉ khung hình của video, trình duyệt không phải là cách để thực hiện. Như đã giải thích ở trên, các trình duyệt (desktop) làm nội suy để phù hợp với tốc độ khung hình hiển thị càng gần càng tốt. Các khung đó là không phải là trong luồng gốc. Thậm chí còn có một số thiết bị nội suy '3D' (2D + thời gian) cao cấp mà các khung hình ban đầu thậm chí không có nghĩa là được hiển thị (!). Mặt khác, nếu bạn đồng ý với luồng đầu ra (nội suy), việc bỏ phiếu trên rAF sẽ cung cấp mỗi khung hình mà bạn nhìn thấy (bạn không thể bỏ lỡ khung hình (ngoại trừ ứng dụng của bạn đang bận làm việc khác).

Rq4: nội suy (== không có khung trùng lặp) là 99,99% khả năng trên gần đây/GPU phong nha cung desktop

Rq5:. Hãy chắc chắn để làm ấm các chức năng của mình (gọi họ là 100 lần trên đầu) và để tạo ra không Để tránh jit/gc tạm dừng

+0

Cảm ơn, tôi đánh giá cao câu trả lời! Vì vậy, bạn có nói rằng currentTime được thay đổi nếu & chỉ khi một khung mới được rút ra? Bạn có chắc không? Nếu có, thì currentTime sẽ rất, rất hữu ích đối với tôi vì nó tương đương với sự kiện onFrameChange "bị thiếu". – markE

+0

Một so sánh số đơn giản của currentTime là hấp dẫn để đi với. Kết quả của dự án sẽ bị lệch nếu tôi phân tích cùng một khung hình hai lần và có chi phí cao khi không nhận ra một mẫu "trùng lặp" giống nhau. Tương tự như vậy cũng có một chi phí cao bị thiếu một khung như là lý thuyết có thể khi chụp khung trong một chuỗi chạy bằng cách sử dụng rAF. Khá thẳng thắn, những khả năng này làm tôi lo lắng. Vì vậy, do thiếu một câu trả lời dứt khoát, tôi sẽ phải kéo mỗi video vào Premier vì vậy tôi chắc chắn về các khung hình. Tuy nhiên, cảm ơn - Tôi chấp nhận câu trả lời của bạn và upvoting. – markE

+1

Nếu tôi hiểu đúng yêu cầu của bạn, bạn nên sử dụng một phần mềm, trừ khi bạn thành công để sử dụng một thủ thuật. Xem bình luận của tôi ở trên ... Và bây giờ đi ngủ ... như một 10K! ;-) – GameAlchemist

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