2011-09-06 12 views
30

मुझे आश्चर्य है कि इस प्रभाव को प्राप्त करने के लिए कोई सीधा तरीका है, बिना फ्रेम निकालने के बैकएंड कोड की आवश्यकता के बिना, इसे किसी jpg और डेटाबेस के रूप में सहेजें।एचटीएमएल 5 वीडियो में पोस्टर के रूप में गतिशील रूप से पहले फ्रेम का उपयोग कर?

एक प्रभाव जिसके द्वारा वीडियो का पहला फ्रेम केवल पोस्टर के रूप में दिखाई देता है जब वीडियो लोड इतना उपयोगी होगा (यह केवल तभी काम करेगा जब ब्राउज़र स्पष्ट रूप से वीडियो को वापस चला सके, जो कि थोड़ा अलग हो सकता है poster पारंपरिक रूप से काम करता है, लेकिन यह एक चिंता का विषय नहीं है।

उत्तर

19

एक Popcorn.js प्लगइन Popcorn.capture कहा जाता है जो आप अपने एचटीएमएल 5 वीडियो के किसी भी फ्रेम से पोस्टर बनाने के लिए अनुमति देगा है।

एक सीमा यह है कि द्वारा लगाया गया है नहीं है ब्राउज़र जो डोमेन पर अनुरोधित संसाधनों के पिक्सेल डेटा को पढ़ने पर रोक लगाता है (कैनवास एपीआई का उपयोग करके वर्तमान मूल्य को रिकॉर्ड करने के लिए फ्रेम)। स्रोत वीडियो को उसी डोमेन पर होस्ट किया जाना चाहिए जैसे स्क्रिप्ट और एचटीएमएल पेज जो काम करने के लिए इस दृष्टिकोण के लिए अनुरोध कर रहा है।

इस प्लगइन का उपयोग कर पोस्टर बनाने के लिए कोड काफी सरल है:

// This block of code must be run _after_ the DOM is ready 
// This will capture the frame at the 10th second and create a poster 
var video = Popcorn("#video-id"); 

// Once the video has loaded into memory, we can capture the poster 
video.listen("canplayall", function() { 

    this.currentTime(10).capture(); 

}); 
+0

मुझे जो चाहिए वह दिखता है। दुर्भाग्यवश दुर्भाग्य से काम करने के लिए पॉपकॉर्न नहीं मिल सकता .. 'असहज त्रुटि: INVALID_STATE_ERR: DOM अपवाद 11 popcorn.js: 389 पॉपकॉर्न.extend.Popcorn.forEach.ret popcorn.js: 389' जब भी मैं इसे कॉल करता हूं। – Damon

+0

ऐसा लगता है कि आप वीडियो लोड होने की प्रतीक्षा नहीं कर रहे हैं। मैंने उपरोक्त कोड उदाहरण को अपडेट करने के लिए अपडेट किया है, फिर पोस्टर सेट करें। – Rick

+1

धन्यवाद .. यह काम कर रहा है। वैसे भी अधिकांश भाग के लिए .. मैं दस्तावेज़ों से छाप में था कि 'this.capture ({at: 1})। वर्तमान समय (0);' एक पोस्टर को 1 सेकंड से पकड़ लेगा और फिर वीडियो को शुरुआत में रखेगा , लेकिन यह इसे 1 सेकंड में छोड़ देता है। क्या आपके पास इसका कोई अनुभव है? – Damon

6

आप स्वचालित रूप से वीडियो के पहले फ्रेम लोड करने के लिए वीडियो तत्व पर preload='auto' सेट कर सकते हैं।

+0

बस सलाह का एक शब्द: प्रीलोड का मतलब है कि वीडियो उपयोगकर्ता कार्रवाई के बिना स्वचालित रूप से डाउनलोड हो सकता है। डेस्कटॉप पर क्रोम, फ़ायरफ़ॉक्स और आईई पर डिफ़ॉल्ट रूप से ऐसा होता है। तो कृपया सुनिश्चित करें कि यह आपके पृष्ठ पर उपयोगकर्ता अनुभव खराब नहीं करेगा। – Louhike

+1

अच्छा बिंदु हालांकि यह केवल डेस्कटॉप पर ही मामला है क्योंकि यह एक संकेत है, निर्देश नहीं। कुछ हद तक पुराना है लेकिन https://www.stevesouders.com/blog/2013/04/12/html5-video-preload/ –

8

मैंने हाल ही में हाल ही में एक परियोजना के लिए ऐसा किया जो डेस्कटॉप और मोबाइल पर काम करता है। यह चाल आईफोन पर काम करने के लिए मिल रही थी।

preload=metadata डेस्कटॉप और एंड्रॉइड डिवाइस पर काम करता है लेकिन आईफोन नहीं।

iPhones के लिए मुझे इसे autoplay पर सेट करना पड़ा ताकि पोस्टर छवि स्वचालित रूप से प्रारंभिक लोड पर दिखाई दे। iPhones वीडियो को ऑटो बजाने से रोक देगा, लेकिन पोस्टर छवि परिणाम के रूप में दिखाई देती है।

मुझे यहां पावन के उत्तर का उपयोग करके आईफोन के लिए एक चेक करना पड़ा। Detect iPhone Browser। फिर डिवाइस के आधार पर autoplay के साथ या उसके बिना उचित वीडियो टैग का उपयोग करें।

var agent = navigator.userAgent; 
var isIphone = ((agent.indexOf('iPhone') != -1) || (agent.indexOf('iPod') != -1)) ; 

$videoTag = ""; 
if(isIphone()) { 
    $videoTag = '<video controls autoplay preload="metadata">'; 
} else { 
    $videoTag = '<video controls preload="metadata">'; 
} 
+1

देखें यह उत्तर बताता है कि समस्या क्यों होती है और आसपास एक कार्य प्रदान करती है।ध्यान रखें कि आईओएस 10 में कुछ शर्तों को पूरा होने पर ऑटोप्ले विशेषता को सम्मानित किया जा सकता है। तो मैं वास्तविक ऑटोप्ले को रोकने के लिए वीडियो को तुरंत रोकने के लिए सभी को सुझाव दूंगा। –

+0

@Alessandro क्या आप कुछ कोड दिखा सकते हैं कि हम इसे आईओएस 10 में कैसे संभाल सकते हैं यह बहुत अच्छा होगा – Mourice

+1

'var video = document.createElement (' video ') जैसे कुछ; video.controls = सत्य; video.preload = 'मेटाडेटा'; अगर (आईफोन) {video.autoplay = true; video.pause(); } ' –

संबंधित मुद्दे