2013-02-19 29 views
7

Đây là mã php của tôi để truyền tập tin mp3 qua phpTruyền tập tin mp3 qua php

set_time_limit(0); 
$dirPath = "path_of_the_directory"; 
$songCode = $_REQUEST['c']; 
$filePath = $dirPath . "/" . $songCode . ".mp3"; 
$strContext=stream_context_create(
    array(
     'http'=>array(
     'method'=>'GET', 
     'header'=>"Accept-language: en\r\n" 
     ) 
    ) 
); 
$fpOrigin=fopen($filePath, 'rb', false, $strContext); 
header('content-type: application/octet-stream'); 
while(!feof($fpOrigin)){ 
    $buffer=fread($fpOrigin, 4096); 
    echo $buffer; 
    flush(); 
} 
fclose($fpOrigin); 

Đó là làm việc trên Mac Mini và tất cả các máy tính khác nhưng không làm việc trên iPad và iPhone. Thậm chí phát trực tuyến cũng hoạt động trên tất cả các điện thoại thông minh khác. Sự giúp đỡ của bạn sẽ được trân trong.

Cảm ơn

Trả lời

3

Tại sao content-type: application/octet-stream nếu đó là một bài hát? Thay đổi tiêu đề:

set_time_limit(0); 
$dirPath = "path_of_the_directory"; 
$songCode = $_REQUEST['c']; 
$filePath = $dirPath . "/" . $songCode . ".mp3"; 
$strContext=stream_context_create(
    array(
     'http'=>array(
     'method'=>'GET', 
     'header'=>"Accept-language: en\r\n" 
     ) 
    ) 
); 
$fpOrigin=fopen($filePath, 'rb', false, $strContext); 
header('Content-Disposition: inline; filename="song.mp3"'); 
header('Pragma: no-cache'); 
header('Content-type: audio/mpeg'); 
header('Content-Length: '.filesize($filePath)); 
while(!feof($fpOrigin)){ 
    $buffer=fread($fpOrigin, 4096); 
    echo $buffer; 
    flush(); 
} 
fclose($fpOrigin); 

LE: loại bỏ Content-Transfer-Encoding và thay đổi Content-Disposition từ attachment để inline

+0

thay đổi cho phù hợp nhưng vẫn không làm việc trên iPhone và iPad. Mã đang hoạt động trên PC của tất cả các nền tảng và tất cả các điện thoại thông minh khác ngoại trừ iPhone và iPad. Có gì sai với mã? – Anindya

+0

Tôi đã thêm tên tệp, hãy thử thêm các tiêu đề đó. –

+0

Đã thử nghiệm trên iPhone và hoạt động. –

3
<?php 
set_time_limit(0); 
$dirPath = "path_of_the_directory"; 
$songCode = $_REQUEST['c']; 
$filePath = $dirPath . "/" . $songCode . ".mp3"; 
$bitrate = 128; 
$strContext=stream_context_create(
    array(
     'http'=>array(
     'method'=>'GET', 
     'header'=>"Accept-language: en\r\n" 
     ) 
    ) 
); 


header('Content-type: audio/mpeg'); 
header ("Content-Transfer-Encoding: binary"); 
header ("Pragma: no-cache"); 
header ("icy-br: " . $bitrate); 

$fpOrigin=fopen($filePath, 'rb', false, $strContext); 
while(!feof($fpOrigin)){ 
    $buffer=fread($fpOrigin, 4096); 
    echo $buffer; 
    flush(); 
} 
fclose($fpOrigin); 

Tôi biết bài này là từ năm ngoái nhưng ai đó có thể thấy hữu ích này. Điều này sẽ truyền nội dung.

1

Tôi biết điều này là cũ, nhưng chúng tôi vừa gặp phải vấn đề tương tự với iOS.

Về cơ bản, có vẻ như rằng nếu ứng dụng của bạn sử dụng các cầu thủ bản địa để đọc các tập tin, bạn cần phải thực hiện Accept-Dãy206 Nội dung Một phần cho tập tin của bạn được đọc.

Trong trường hợp của chúng tôi, điều xảy ra là tệp dài 4 phút. Ứng dụng sẽ phát trong khoảng 1 phút 50 giây và sau đó sẽ lặp lại bắt đầu. Nó sẽ không phát hiện tổng chiều dài của tập tin.
Mặc dù chúng tôi đã thiết lập Accept-Ranges thành none, iOS đã bỏ qua nó và vẫn yêu cầu các phần của tệp. Vì chúng tôi đã trả lại toàn bộ sự việc, nó đã "lặp" trở lại phần đầu trong "phạm vi" tiếp theo.

Đối với việc thực hiện các nội dung từng phần, chúng tôi sử dụng https://mobiforge.com/design-development/content-delivery-mobile-devices, Phụ lục A: streaming cho Apple iPhone bởi Thomas Thomassen

Tôi hy vọng điều này sẽ giúp người

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