2010-12-09 11 views
12

से .flv फ़ाइलों को स्ट्रीम कैसे करूं मैं डेटाबेस में .flv फ़ाइलों को संग्रहीत करना चाहता हूं और फ़ाइल सिस्टम में नहीं।
सफलतापूर्वक परिवर्तित .wmv और .mpeg ffmpeg के साथ .flv करने के लिए:मैं SQL डेटाबेस

यह वही है मैं अभी कर सकते हैं।
एसक्यूएल सर्वर में छवियों को स्टोर करें और उन्हें अपने पेज पर एक प्रेजेंटफैंडर के साथ दिखाएं।
.avi और .mpeg वीडियो के साथ ही। (यदि वह इसे देख सकता है तो यह उपयोगकर्ता के सॉफ़्टवेयर पर निर्भर करता है)
फ़ाइल में फ़ाइल .fv फ़ाइलों को चलाएं यदि फ़ाइल फ़ाइल सिस्टम में स्थित है और डेटाबेस में नहीं है।

क्या मैं नहीं कर सकता है:
स्ट्रीम .flv डेटाबेस से सीधे जेडब्ल्यू प्लेयर के लिए वीडियो। (बाइनरी डेटा के रूप में संग्रहित)

मैं दो दिनों के लिए इंटरनेट अब खोज की है, लेकिन मैं यह काम करने के लिए नहीं मिल सकता है। ऐसा लगता है जैसे मैं लगभग वहां हूं। जेडब्ल्यू प्लेयर खुलता है और "बफर" शुरू होता है, लेकिन कुछ भी नहीं होता है।

मैं वहाँ कोई आसान जवाब है, लेकिन अगर किसी को भी इस से पहले किया है, या कुछ इसी तरह, मैं तुम्हें कैसे किया जानना चाहते हैं। मुझे लगता है कि मुझे इसे सब पोस्ट करने के लिए बहुत अधिक कोड मिला है।

अग्रिम धन्यवाद!

+4

+1 दुष्ट दिलचस्प सवाल – jcolebrand

+0

आप एक स्निप पोस्ट या आप कैसे .flv स्ट्रीमिंग रहे हैं जब यह फाइल सिस्टम पर है के बारे में बात करेंगे? –

+0

बस मेरे उत्तर में कोड का उपयोग करें, लेकिन SqlDataReader() – Niklas

उत्तर

4

मैं काम करने के लिए मिल गया है, लेकिन मैं कैसे कुशल यह है के रूप में पता नहीं है। कनेक्शन, प्रभावशीलता, लोड इत्यादि के मामले में डेटाबेस से फ़ाइल सिस्टम से स्ट्रीम करना बेहतर है मैं इस पर कुछ पॉइंटर्स का उपयोग कर सकता हूं!

मैं जेडब्ल्यू प्लेयर का उपयोग कर रहा यहाँ, इसलिए "swfobject.js" और "player.swf"

HttpHandler:

public class ViewFilm : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     try 
     { 
      // Check if id was given 
      if (context.Request.QueryString["id"] != null) 
      { 
       string movId = context.Request.QueryString["id"]; 

       // Connect to DB and get the item id 
       using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString)) 
       using (SqlCommand cmd = new SqlCommand("GetItem", con)) 
       { 
        cmd.CommandType = CommandType.StoredProcedure; 
        SqlParameter sqlParam = cmd.Parameters.Add("@itemId", SqlDbType.Int); 
        sqlParam.Value = movId; 

        con.Open(); 
        using (SqlDataReader dr = cmd.ExecuteReader()) 
        { 
         if (dr.HasRows) 
         { 
          dr.Read(); 
          // Add HTTP header stuff: cache, content type and length 
          context.Response.Cache.SetCacheability(HttpCacheability.Public); 
          context.Response.Cache.SetLastModified(DateTime.Now); 
          context.Response.AppendHeader("Content-Type", "video/x-flv"); 
          context.Response.AppendHeader("Content-Length", ((byte[])dr["data"]).Length.ToString()); 
          context.Response.BinaryWrite((byte[])dr["data"]); 
         } 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(ex.ToString()); 
     } 
    } 

    public bool IsReusable 
    { 
     get { return false; } 
    } 
} 

जावास्क्रिप्ट
कार्य करने के लिए एक खिलाड़ी कहते हैं <div id="video1"> और कहा जा सकता है जैसे कि कोई उपयोगकर्ता बटन पर क्लिक करता है।

<script type='text/javascript' src='swfobject.js'></script> 
<script type="text/javascript" language="javascript"> 
function vid() { 
    var s1 = new SWFObject('player.swf', 'player1', '480', '270', '9'); 
    s1.addParam('allowfullscreen', 'true'); 
    s1.addParam('allowscriptaccess', 'always'); 
    s1.addVariable('file', encodeURIComponent('ViewFilm.ashx?id=10')); 
    s1.addVariable('type', 'video'); 
    s1.write(document.getElementById("video1")); 
} 
</script> 
+0

आपके हैंडलर पर कुछ युक्तियां: 1. 'कोशिश करें ... पकड़ें' वर्तमान में केवल जानकारी को फेंक रही है और त्रुटि को प्रसारित करने की अनुमति देने के बाद हटा दी जानी चाहिए क्योंकि अधिक जानकारी प्रदान की जाएगी। 2।'उपयोग' कथन का उपयोग आपके एसक्यूएलकनेक्शन, एसक्लोकॉमैंड, एसक्लडाटा रीडर इंस्टेंस के लिए किया जाना चाहिए जो सुनिश्चित करता है कि अपवादों को फेंकने के बावजूद सबकुछ हमेशा निपटाया जाता है (बंद)। 3. आप वर्तमान में पूरी फाइल को स्मृति में पढ़ रहे हैं, यह स्केल नहीं करेगा; स्केल करने के लिए आप कमांड पर 'अनुक्रमिक पहुंच' का उपयोग कर सकते हैं फिर पाठक से 'गेटबाइट्स' को बफर में और प्रतिक्रिया के लिए 'बाइनरीवाइट' पर उपयोग कर सकते हैं। –

+0

मैं इसे काम करने के लिए नहीं मिला, इसलिए मैंने इसे एक और प्रश्न के रूप में पोस्ट किया: http://stackoverflow.com/questions/4468944/how-to-add-sequential-access-in-httphandler-for-video-stream – Niklas

+0

अपडेट किया गया एक और दो बिंदु पर। अनुक्रमिक पहुंच अभी भी एक रहस्य है हालांकि। – Niklas

1

यदि आप SQL Server 2008 का उपयोग कर रहे हैं तो आप varbinary(MAX) FILESTREAM का उपयोग कर सकते हैं जो फ़ाइलों को डेटाबेस द्वारा प्रबंधित करने की अनुमति देगा लेकिन फिर भी आपको FileStream from .NET तक पहुंच प्रदान करेगा।

+0

आह के बजाय FileStream() के साथ, जानना बहुत अच्छा है! – Niklas

2

यह सुनिश्चित नहीं है कि वास्तव में "डेटाबेस से सीधे स्ट्रीम" कैसे करें, लेकिन क्या यह जेडब्ल्यू प्लेयर के लिए स्रोत "फ़ाइल" को "ServeFLV.aspx? Id = 123" पर सेट करने के लिए काम करेगा, और ServeFLV.aspx है डेटाबेस से बाइट पुनर्प्राप्त करें, और बिना मार्कअप के प्रतिक्रिया के लिए उन्हें लिखें?

+2

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

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