Проблема с потоковым или буферизацией в mp3 - PullRequest
1 голос
/ 21 октября 2010

Я создал сайт для воспроизведения mp3.

Я использую флэш-mp3-плеер для воспроизведения mp3-файла. Он может воспроизводиться, но не может загружать правильное время и не передавать и буферизовать mp3-файл, расположенный намой сервер.

Он может правильно воспроизводить mp3-файл, если URL-адрес другого сайта, например Google music.

Я думаю, что важной проблемой является вывод заголовка mp3-файла.

это код моего php-файла для вывода mp3-файла.

<?php
 $filename='music/'.$_GET['id'].'.mp3';
 $fileSize=filesize($filename);
 header('Accept-Ranges: bytes');
 header('Cache-Control: max-age=604800');
 header('Content-Length: ' . $fileSize);
 header('Content-type: audio/mpeg');
 readfile($filename);
?>

Может кто-нибудь сказать мне, в чем проблема?

PS: Вы можете проверить наХром.Просто используйте Chrome, чтобы открыть файл или страницу, на нем отобразится проигрыватель для воспроизведения mp3-файла.

Ответы [ 4 ]

3 голосов
/ 21 октября 2010

Я тоже столкнулся с этой проблемой. Я решил это, используя PHP readfile () - функцию . Я не знаю, почему это сработало, но это сработало. Кроме того, он сокращает ваш код и использует меньше памяти:

$filename = 'music/'.$_GET['id'].'.mp3';
header('Cache-Control: max-age=604800');
header('Content-type: audio/mpeg');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.filesize($filename));
readfile($filename);
2 голосов
/ 22 октября 2010

ОК, проблема решена.На самом деле проблема в том, что система Liunx (например, CentOS и Ubuntu) не поддерживает потоковую передачу mp3.

Чтобы решить эту проблему, необходимо установить gnump3d, чтобы включить потоковый сервер.

мой сайт mu6.me может воспроизводить музыку, как и другие музыкальные сайты.

1 голос
/ 21 октября 2010

вы пытались добавить имя файла?

header('Content-Disposition: attachment; filename="media.mp3"');
header('Pragma: no-cache');

Надеюсь, это поможет

1 голос
/ 21 октября 2010

Например, использование заголовка «Accept-range» означает, что ваш скрипт сообщает браузеру, что он может запросить определенные части файла, но вы безоговорочно отправляете все это. По крайней мере, переключитесь на использование none вместо bytes, чтобы указать, что вы не разрешаете запросы диапазона, или полностью удалите заголовок.

Во-вторых, делая:

print(fread($mp3, $fileSize - 10000 )); 

странно. Независимо от того, насколько велик или мал размер mp3 на самом деле, вы отправите его максимум двумя частями. Первый блок будет весь файл минус последние 10 000 байт, а второй блок (если длина файла> 10 000 байт) будет последним размером до 10 000 байт. Если у вас mp3 большого размера, отправка его таким образом может превысить memory_limit php и убить скрипт. MP3-плеер может этого не заметить, так как он будет счастливо воспроизводить ту часть мелодии, которая уже отправлена. Вместо всего бизнеса fopen / while / fclose просто используйте readfile(), который будет правильно отправлять файл достаточно маленькими порциями, чтобы не превышать пределы памяти.

...