"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > मेरा GoLang वेबसर्वर बड़े MP4 वीडियो पेश करने में विफल क्यों है?

मेरा GoLang वेबसर्वर बड़े MP4 वीडियो पेश करने में विफल क्यों है?

2024-11-08 को प्रकाशित
ब्राउज़ करें:616

Why does my GoLang webserver fail to serve large MP4 videos?

GoLang HTTP वेबसर्वर MP4 वीडियो परोसता है

Challenge

GoLang का उपयोग करके एक वेबसर्वर बनाया गया था जो HTML/JS/CSS और छवियों को परोसता है। जब सर्वर ने MP4 वीडियो फ़ाइल प्रदान करने का प्रयास किया, तो वीडियो लोड होने में विफल रहा, केवल वीडियो नियंत्रण दिखा रहा था।

जांच

वीडियो फ़ाइलों की जांच करने पर, यह पता चला कि छोटा वीडियो काम करता था जबकि बड़ा वीडियो नहीं था. समस्या वीडियो के आकार और ब्राउज़र के डिफ़ॉल्ट बफ़रिंग व्यवहार से संबंधित थी।

रेंज अनुरोध समर्थन:

एक निश्चित आकार से बड़े वीडियो के लिए, ब्राउज़र को सर्वर की आवश्यकता होती है रेंज अनुरोधों (आंशिक सामग्री सेवा) का समर्थन करने के लिए। यह ब्राउज़र को प्लेबैक के लिए आवश्यक वीडियो के केवल हिस्से को लाने की अनुमति देता है, जिससे पूरी फ़ाइल को मेमोरी में लोड होने से रोका जा सकता है।

इस मामले में, GoLang कोड को रेंज अनुरोधों को संभालने के लिए कॉन्फ़िगर नहीं किया गया था। प्रदान किया गया कार्यान्वयन पूरी फ़ाइल को एक ही प्रतिक्रिया के रूप में प्रस्तुत करता है। परिणामस्वरूप, ब्राउज़र बड़ा वीडियो चलाने में सक्षम नहीं था।

समाधान

समस्या को हल करने के लिए, निम्नलिखित कदम उठाए गए:

  1. http.FileServe() का उपयोग करें: http.FileServe() विधि डिफ़ॉल्ट रूप से रेंज अनुरोधों को संभालती है। वीडियो फ़ाइल को प्रस्तुत करने के लिए इस पद्धति का उपयोग करके, सर्वर ब्राउज़र को आंशिक सामग्री प्रदान करने में सक्षम था।
  2. कस्टम रेंज अनुरोध हैंडलिंग कॉन्फ़िगर करें:

वैकल्पिक रूप से , यदि http.FileServe() को प्राथमिकता नहीं दी जाती है, तो कस्टम रेंज अनुरोध हैंडलिंग लागू की जा सकती है। इसमें प्रतिक्रिया में निम्नलिखित हेडर सेट करना शामिल है:

  • स्वीकार-श्रेणियाँ: बाइट्स
  • सामग्री-लंबाई (फ़ाइल का आकार)
  • सामग्री-श्रेणी (बाइट्स श्रेणी अनुरोधित)
  1. HTTP स्थिति कोड का उपयोग करें 206:

रेंज अनुरोधों के लिए, सर्वर को 200 ओके के बजाय 206 आंशिक सामग्री का HTTP स्टेटस कोड लौटाना चाहिए।

कार्यान्वयन

कस्टम रेंज अनुरोध प्रबंधन निम्नलिखित तरीके से कार्यान्वित किया गया था:

func (vh *viewHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    path := r.URL.Path[1:]
    data, err := ioutil.ReadFile(string(path))

    if err == nil {

        var contentType string

        if strings.HasSuffix(path, ".mp4") {
            contentType = "video/mp4"
            size := binary.Size(data)
            if size > 0 {
                requestedBytes := r.Header.Get("Range")
                w.Header().Add("Accept-Ranges", "bytes")
                w.Header().Add("Content-Length", strconv.Itoa(size))
                w.Header().Add("Content-Range", "bytes " requestedBytes[6:len(requestedBytes)] strconv.Itoa(size-1) "/" strconv.Itoa(size))
                w.WriteHeader(206)
            }
        } else {
            w.Header().Add("Content-Type", contentType)
            w.Write(data)
        }
    } else {
        log.Println("ERROR!")
        w.WriteHeader(404)
        w.Write([]byte("404 - "   http.StatusText(404)))
    }
}

लूपिंग वीडियो:

यह सुनिश्चित करने के लिए कि वीडियो लूप हो, निम्नलिखित तर्क जोड़ा गया था:

if contentType == "video/mp4" {
    http.ServeFile(w, r, path)
} else {
    w.Header().Add("Content-Type", contentType)
    w.Write(data)
}

यह MP4 वीडियो के लिए http.ServeFile() का उपयोग करता है, जो लूपिंग को सही ढंग से संभालता है।

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3