2015-05-01 8 views
5

मेरे पास एक ऐसी स्थिति है जिसने मुझे स्टंप किया है इसलिए मुझे कोई मदद मिल रही है।लैरवेल 5 HTTP प्रतिक्रिया, एम 4 वी फ़ाइलें, और आईओएस MPMoviePlayerViewController

मेरे पास एक आईओएस ऐप है जो MPLoviePlayerViewController का उपयोग लार्वेल 5 साइट द्वारा प्रबंधित एम 4 वी वीडियो फ़ाइलों को चलाने के लिए करता है।

यदि वीडियो सीधे लार्वेल 5/सार्वजनिक फ़ोल्डर से डाउनलोड की जाती हैं तो वीडियो फ़ाइलें पूरी तरह से ठीक होती हैं (आईओएस में)। हालांकि, मैं सामान्य रूप से लैरवेल 5 के स्टोरेज फेकाडे से वीडियो फ़ाइलों को संग्रहीत और सेवा कर रहा हूं क्योंकि मैं अंततः एस 3 और लोचदार ट्रांसकोडर का उपयोग करने जा रहा हूं।

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

जहां तक ​​मैं MPMoviePlayerViewController को बता सकता हूं कि HTTP प्रतिक्रिया को स्वरूपित किया जा रहा है, इस बारे में चुनौतीपूर्ण है। मैंने StreamedResponse की कोशिश की है, लेकिन यह मदद नहीं प्रतीत होता है।

इसलिए उदाहरण के लिए निम्न URL कि/सार्वजनिक फ़ोल्डर से सीधे फ़ाइल खींचती आईओएस से ठीक काम करता है:

http://172.16.160.1/video_ae9a7da0efa211e4b115f73708c37d67.m4v 

लेकिन अगर मैं Laravel 5 का उपयोग इस URL के साथ भंडारण से फ़ाइल को खींचने के लिए आईओएस नहीं होगा इसे बजाओ।

:

http://172.16.160.1/api/getfile/f444b190ef5411e4b7068d1890d109e8/video_ae9a7da0efa211e4b115f73708c37d67.m4v 

नोट आईओएस, किसी भी सार्थक त्रुटियों प्रदान नहीं करता है इस डिबग मदद करने के लिए है, लेकिन मैं सकारात्मक हूँ इसके कि मेरे HTTP प्रतिक्रिया Laravel द्वारा किया जा रहा है 5.

यहाँ मेरी मार्ग है

Route::get('myapi/getfile/{filename?}', '[email protected]')->where('filename', '(.*)'); 

यहाँ मेरी नियंत्रक है:

public function getfile($filename) 
{ 
    return $api = API::getfile($filename); 
} 

यहाँ मेरी मॉडल है:

public static function getfile($filename) { 
$file = Storage::disk('local')->get('Files/'.$filename); 
return (new Response($file, 200))->header('Content-Type', 'video/mp4'); 
} 

अगर मैंने कोई सहायक जानकारी छोड़ी तो कृपया मुझे बताएं और मैं इसे पोस्ट करूंगा। मेरा अगला कदम Wireshark टेस्टबेड सेट अप करना और देखें कि हैंडशेक कैसा दिखता है।

सहायता के लिए अग्रिम धन्यवाद। :-)

उत्तर

4

ऐसा लगता है कि मेरे पास अपने प्रश्न का उत्तर है। अंतर्निहित कारण यह था कि फाइलों की सेवा करते समय लैरावेल 5 HTTP बाइट-रेंज अनुरोधों का मूल रूप से समर्थन नहीं करता है।

http://laravel.io/forum/09-23-2014-how-to-support-http-byte-serving-in-file-streams

https://gist.github.com/m4tthumphrey/b0369c7bd5e2c795f6d5

:

MPMoviePlayerPlaybackDidFinishNotification is called immediately

मैं तो इस Laravel 5 कर रही पर दो पोस्ट नहीं मिले:

यहाँ स्थित इस पोस्ट में मुझे सही रास्ते पर मिला केवल वापस खींचना है कि मैं सीधे एफ तक पहुंचने के लिए स्टोरेज फेकाडे का उपयोग नहीं कर सकता धाराओं के रूप में iles। तो इस समाधान का उपयोग केवल स्थानीय फाइल सिस्टम पर स्थित फ़ाइलों के लिए किया जा सकता है।

public static function getfile($filename) { 

$size = Storage::disk('local')->size('files/'.$filename); 
$file = Storage::disk('local')->get('files/'.$filename); 
$stream = fopen($storage_home_dir.'files/'.$filename, "r"); 

$type = 'video/mp4'; 
$start = 0; 
$length = $size; 
$status = 200; 

$headers = ['Content-Type' => $type, 'Content-Length' => $size, 'Accept-Ranges' => 'bytes']; 

if (false !== $range = Request::server('HTTP_RANGE', false)) { 
    list($param, $range) = explode('=', $range); 
    if (strtolower(trim($param)) !== 'bytes') { 
    header('HTTP/1.1 400 Invalid Request'); 
    exit; 
    } 
    list($from, $to) = explode('-', $range); 
    if ($from === '') { 
    $end = $size - 1; 
    $start = $end - intval($from); 
    } elseif ($to === '') { 
    $start = intval($from); 
    $end = $size - 1; 
    } else { 
    $start = intval($from); 
    $end = intval($to); 
    } 
    $length = $end - $start + 1; 
    $status = 206; 
    $headers['Content-Range'] = sprintf('bytes %d-%d/%d', $start, $end, $size); 
} 

return Response::stream(function() use ($stream, $start, $length) { 
    fseek($stream, $start, SEEK_SET); 
    echo fread($stream, $length); 
    fclose($stream); 
    }, $status, $headers); 
} 
+0

धन्यवाद इस शेयर के लिए, हो सकता है हेडर के साथ 'सामग्री-स्थानांतरण-एन्कोडिंग' => 'द्विआधारी', 'सामग्री-विन्यास' => 'लगाव विस्तार किया जाना चाहिए; फ़ाइल नाम = "'$ फ़ाइल नाम।' '' – simon

+0

इसके लिए बहुत बहुत धन्यवाद। लारवेल से सफारी (डेस्कटॉप) में प्रदर्शित एक आईफोन वीडियो प्राप्त करने की कोशिश कर रहे 2+ घंटे पहले ही खर्च करने के बाद मुझे समय का एक गुच्छा बचाया। – AndyDunn

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