我想为使用React和Symfony4制作的app缓冲音频(mp3)。我的问题是,当我在音频标签HTML5中插入src时,必须等待下载完成才能播放音频。
我想,我必须发送StreamedResponse而不是Response。我想要类似http://opensource.box.com/spout/guides/symfony-stream-content-large-spreadsheet/的内容,但就我而言,请始终下载完整的文件,而不对其进行缓冲。
我做了这段代码https://gitlab.com/nitsuga1986/media-buffer。您可以在这里检查: https://www.opoque.com/prueba/sample.html
它运行良好,但是,如果您检查代码,则该标记在src中具有index.php,但是由于我正在使用Symfony 4,因此我无法做到这一点,我只能在src中添加如下内容:
<audio src="www.example.com/api/id_file=2" />
我创建了一条新路径来获取文件ID,在其中,我创建了StreamedResponse,但是正如我之前所说的,文件已完全下载。
这是我的控制器方法:
/**
* @Rest\Get("/v1/audio/{id}.{_format}", name="audio_download",
*
* @SWG\Tag(name="Files")
*/
public function downloadAudioAction(Request $request, $id) {
$serializer = $this->get('jms_serializer');
$em = $this->getDoctrine()->getManager();
$theme = [];
$message = "";
$response = new StreamedResponse();
$response->setCallback(function () {
$handle = fopen($id, 'r');
while (!feof($handle)) {
$buffer = fread($handle, 1024);
echo $buffer;ob_flush();
flush();
}
fclose($handle);
});
$response->send();
}
如何添加此功能来缓冲音频?
预先感谢
答案 0 :(得分:1)
我终于找到了解决方法:
$response = new BinaryFileResponse($fullName);
$response->headers->set('Content-Type', 'audio/mpeg');
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_INLINE,
$filename
);
return $response;