Потоковая передача MP3 на стандартный вывод в Jplayer с использованием PHP - PullRequest
1 голос
/ 06 января 2012

Я инициализирую jplayer со следующими параметрами:

$jplayer.jPlayer('setMedia',{
  mp3: data.audioMP3,
  oga: data.audioOGA
});

Предположим, что data.autdioMP3 (и его аналог OGA) являются путями к сценарию php, например: 'http://myserver.local/playaudio.php?songID=99&format=mp3'

Где я борюсь, это с playaudio.php.Я хотел бы прочитать файл MP3 и транслировать его в jplayer, не раскрывая путь к аудио (поэтому я не инициализирую jplayer путем к аудио файлу).

Что-то вроде (взято частично из примера для readfile в php docs):

<?php

$if ($validUser && file_exists($file){
     header('Content-Transfer-Encoding: binary');
     header('Content-Type: audio/mpeg');
     header('Expires: 0');
     header('Cache-Control: must-revalidate');
     header('Content-Length: ' . filesize($file));
     ob_clean();
     flush();
     readfile($file);
     exit;
}
?>

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

Спасибо!

Ответы [ 3 ]

2 голосов
/ 06 января 2012

я думаю, что вам будет трудно предотвратить обнаружение URL вашего медиа-контента пользователями, я бы сказал, что это было практически невозможно (быстрый просмотр вкладки «Сеть» в Chrome покажет ваш загруженный трек, независимо от того, как вы кодировали *). 1001 *).

Я бы сказал, что вам лучше придерживаться публикации средств массовой информации, которыми вы не против поделиться с миром .. Или просто опубликовать

  • A n Второй просмотр
  • Версия меньшего качества, например 90 бит / с / моно

Если вы действительно хотите защитить свои ресурсы, вы можете использовать oAuth или Access Control на стороне сервера.

2 голосов
/ 06 января 2012

Поскольку вы используете javascript для получения файла, другие могут сделать то же самое, читая заголовки / запросы файлов из браузера (firebug, инструменты Chrome по умолчанию и т. Д.).

Лучший способ защитить ваши файлы от загрузки - провести серию проверок, чтобы получить данные. Это не идеально, но это будет сдерживать все, кроме самых решительных. Для некоторых идей, посетите эту страницу на API Grooveshark (Это немного устарело, а некоторая информация отсутствует, так что это идеальный справочник), или просто посетите Grooveshark / Youtube и посмотрите, как они защищают свой контент.

Можно воссоздать этот тип безопасности с умным использованием сессий и хорошей базой данных.

1 голос
/ 09 января 2012

Спасибо за ответы каждого.

На самом деле я решил проблему, не раскрывая путь к аудиофайлу для пользователя.

Поскольку это приложение для голосовых сообщений в Интернете, важно защитить путь к сообщениям, чтобы защитить конфиденциальность пользователя.

Ситуация в конечном итоге осложняется тем фактом, что сообщения хранятся на удаленном сервере ... выяснил это сразу после того, как я опубликовал этот вопрос.

Итак, в целом процесс был:

1) Свернуть MP3-файл с удаленного сервера

2) Установите некоторые заголовки для принудительной загрузки данных, которые затем выведите на стандартный вывод

Поскольку данные выводятся стандартным образом и заголовки настроены для принудительной загрузки, эффект для jPlayer такой же, как если бы он запросил файл в /some/dir/message.mp3, за исключением того, что запрос идет в /some/dir/playmessage.php - таким образом, путь никогда не раскрывается пользователю.

РЕДАКТИРОВАТЬ ** - Предположим, что у меня есть контроль доступа, проверка выполняется до фрагмента ниже, в противном случае раскрытие пути к приведенному ниже сценарию ничем не отличается от простого указания пути к mp3. (см. комментарии между мной и Ллойдом)

Вот код, который закончил работу:

$ch = curl_init($remoteFile);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
$data = curl_exec($ch);
curl_close($ch);
if ($data === false) {
  echo 'CURL Failed';
  exit;
}

//Get file size
if (preg_match('/Content-Length: (\d+)/', $data, $matches)) {
  $contentLength = (int)$matches[1];
}

//force user to download file contents
header('Content-Transfer-Encoding: binary');
header('Content-Type: audio/mpeg');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Content-Length: ' . $contentLength);
ob_clean();
flush();
echo $data;
exit;
?>

Предположим, что $remoteFile - это путь к mp3-файлу, который я хочу воспроизвести на сервере, где мы храним сообщения.

Я нашел этот ресурс для чтения удаленного файла с использованием PHP особенно полезным. Вот еще немного информации о изменении заголовков http .

ПРИМЕЧАНИЕ Я загружаю файл дважды, что замедляет процесс для пользователя. Вероятно, есть лучший способ сделать это. :) Если вы сохранили файл локально, то, что у меня изначально было в моем вопросе, на самом деле работает (используя readfile () для вывода необработанных данных mp3).

...