2010-05-31 6 views
7

아이팟에서 HTML 오디오 코드를 재생하려하지만 작동하지 않습니다. http://www.avault.com/news/podcast-news/john-romero-podcast-episode-80/iPad/iPhone에서 PHP 스크립트 HTML5 오디오가 작동하지 않습니다.

:

나는 N = mp3file.mp3

이 플레이어는 여기에있는 HTML5 오디오 코드

mp3_file_player.php에 MP3 요청에 보낼 하나의 PHP 스크립트를 생성

내 iPod Touch에서도 모든 HTML5 지원 브라우저에서 작동하는 것을 확인할 수 있습니다. 의 MP3가있다

header("X-Powered-By: "); 
header("Accept-Ranges: bytes"); 
header("Content-Length: ". (string)(filesize($episode_filename)) .""); 
header("Content-type: audio/mpeg"); 
readfile($episode_filename); 
exit(); 

모든 것이 잘 작동 : 그러나

이 내 PHP 코드 (나는, 사파리/Windows에서 시도 괜찮 았는데)도 맥 OSX의 사파리, 아이 패드/아이폰에서 작동하지 않습니다 동일한 머리말은 mp3를 직접 읽는 것을 좋아합니다.

HTTP 헤더 직접 파일 액세스에서 :

(Status-Line) HTTP/1.1 200 OK 
Date Mon, 31 May 2010 20:27:08 GMT 
Server Apache/2.2.9 
Accept-Ranges bytes 
Content-Length 69046776 
Keep-Alive timeout=15, max=100 
Connection Keep-Alive 
Content-Type audio/mpeg 

콘텐츠 범위의 다른, 나는 시도조차 유일한 것은 추가하기 : 내 PHP 스크립트에서

(Status-Line) HTTP/1.1 200 OK 
Date Mon, 31 May 2010 20:27:31 GMT 
Server Apache/2.2.9 
Last-Modified Wed, 26 May 2010 13:39:19 GMT 
Etag "dac0039-41d91f8-4877f669cefc0" 
Accept-Ranges bytes 
Content-Length 50656162 
Content-Range bytes 18390614-69046775/69046776 
Keep-Alive timeout=15, max=100 
Connection Keep-Alive 
Content-Type audio/mpeg 

HTTP 헤더 ,하지만 그것을 사용하면 플레이어가 내 iPod Touch에서 작동하지 않습니다. 그래서 나는 제거했다.

대단히 감사합니다.

+0

작품. – zneak

+0

라이브 방송은 나를 위해 사파리에서 정말 엉망이되었습니다. – thouliha

답변

2

파일의 일부를 보내지 않으려면 header("Accept-Ranges: bytes");을 삭제 해보세요. 아파치 어쨌든

$etag = md5(serialize(fstat($fp))); 
fclose($fp); 
header('Etag: '.$etag); 

는 전자 태그를

를 추가하고이 갈 줄 ^^ 것을 역할로 는 header("X-Powered-By: ");를 제거!

+0

고마워, 나는 그것을 모두 바꿔서 시도해보고 그 결과를 볼 것이다. 하지만 $ etag에 $ fp가 없습니다. 온라인으로 찾았습니다. $ fp = fopen ($ _ SERVER [ "SCRIPT_FILENAME"], "r"); 맞습니까? 감사합니다. 방금 구현했습니다. iPad로 친구에게 테스트 해달라고 요청했습니다. – saulob

+0

RobertPitt, 그게 전부 였어. Accept-Range를 제거하고 Etag를 추가하면 X-Powered가 제거되지 않았습니다. 그러나 효과가있었습니다. 이제 모든 것이 부드럽습니다. 감사. – saulob

+2

캐시 유효성 검사를 구현하지 않는 경우 특히 ETag가 필요하지 않습니다. – Kornel

3

Content-Range 상태에서만 유효 206 귀하의 코드는 (당신이 Range 헤더를 구문 분석이 함께 스티치 따라 몸을 응답 및 Content-Length = filesize($episode_filename)하는 것 것 모두에서 부분적인 요청을 지원하지 않는 것

거의 모든 경우에 유효하지 않음).

HTTP 서버 내에 HTTP 서버를 구현하지 않을 경우 Apache에서 MP3를 제공하도록하십시오.

PHP로 구현 된 액세스 제어가 필요한 경우 확장을 확인하거나 틀린 이름의 파일로 심볼릭 링크를 만들어 클라이언트를 리디렉션하십시오.

정말로 HTTP 부분 다운로드를 어렵게하려면 RFC 2616을 읽어 보거나 모든 것을 할 수있는 라이브러리를 찾으십시오. 찾은 모든 HTTP 헤더를 맹목적으로 보내지 마십시오.

+0

나는 아파치에 대한 액세스 권한이 없다. 덕분에 ... – saulob

3

나는 뮤직 플레이어에게 mp3를 제공하고 있었다. 나는 비슷한 헤더를 가지고 있었다. 일부 MP3는 ipad에서 재생됩니다. 다른 사람들은 그렇지 않았다.

이 기사가 내 문제를 해결했습니다. http://mobiforge.com/developing/story/content-delivery-mobile-devices 기본적으로 Apple iPhone은 오디오 및 비디오 파일 요청에 HTTP 바이트 범위를 사용합니다.

내 헤더는 다음과 같습니다 (대신 "라이브 브로드 캐스트"라고하지만) 맥 OS X에 대한 최신 웹킷 빌드에서 잘

header("X-Powered-By: "); 
header('Content-Length: '. (string)filesize($path)); // provide file size 
header('Content-type: audio/mpeg'); 

if(isset($_SERVER['HTTP_RANGE'])) { // any device that supports byte-ranges 
rangeDownload($path); // function from article mentioned above 
} 

$fp = fopen($_SERVER["SCRIPT_FILENAME"], "r"); 
$etag = md5(serialize(fstat($fp))); 
fclose($fp); 
header('Etag: '.$etag); 
readfile($path); 
+0

니스! 이것은 나를 위해 일했습니다, 대단히 감사합니다! – timing

관련 문제