使用 Laravel 为 Android 提供 mp3 流

2024-01-21

这是我的问题:我正在编写一个 laravel 后端,它必须提供一个 mp3 文件,该文件必须使用 android 标准媒体播放器再现。

对于 laravel 后端,我需要使用 JWT 来处理身份验证,因此在每个请求标头中,我必须将“授权”字段设置为“持有者{令牌}" .
laravel 的路线是“/歌曲/{id}" 并以这种方式处理:

public function getSong(Song $song) {
    $file = new File(storage_path()."/songs/".$song->path.".mp3");

    $headers = array();
    $headers['Content-Type'] = 'audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3';
    $headers['Content-Length'] = $file->getSize();
    $headers['Content-Transfer-Encoding'] = 'binary';
    $headers['Accept-Range'] = 'bytes';
    $headers['Cache-Control'] = 'must-revalidate, post-check=0, pre-check=0';
    $headers['Connection'] = 'Keep-Alive';
    $headers['Content-Disposition'] = 'attachment; filename="'.$song->path.'.mp3"';

    $user = \Auth::user();
    if($user->activated_at) {
        return Response::download($file, $song->path, $headers);
    }
    \App::abort(400);
}

在 android 端,我使用 MediaPlayer 以这种方式流式传输 mp3 文件:

media_player = new MediaPlayer();
    try {
        media_player.setAudioStreamType(AudioManager.STREAM_MUSIC);

        String token = getSharedPreferences("p_shared", MODE_PRIVATE).getString("token", null);
        Map<String, String> headers = new HashMap<>();
        headers.put("Authorization", "Bearer " + token);

        media_player.setDataSource(
            getApplicationContext(),
            Uri.parse(ConnectionHelper.SERVER + "/songs/" + song.getId()),
            headers
        );
    } catch (IOException e) {
        finish();
        Toast.makeText(
                Round.this,
                "Some error occurred. Retry in some minutes.",
                Toast.LENGTH_SHORT
        ).show();
    }
    media_player.setOnCompletionListener(this);
    media_player.setOnErrorListener(this);
    media_player.setOnPreparedListener(this);

但每次我执行代码时都会得到额外的代码-1005在错误监听器上这意味着错误_连接_丢失.


问题: 响应::下载(...)不产生流,所以我无法提供我的 .mp3 文件。

解决方案: 作为 Symfony HttpFoundationdoc. http://symfony.com/doc/current/components/http_foundation/introduction.html#serving-files在服务文件段落中说:

"if you are serving a static file, you can use a BinaryFileResponse"

我需要提供的 .mp3 文件是服务器中的静态文件并存储在“/存储/歌曲/“所以我决定使用二进制文件响应,提供 .mp3 的方法变为:

use Symfony\Component\HttpFoundation\BinaryFileResponse;

[...]

public function getSong(Song $song) {
    $path = storage_path().DIRECTORY_SEPARATOR."songs".DIRECTORY_SEPARATOR.$song->path.".mp3");

    $user = \Auth::user();
    if($user->activated_at) {
        $response = new BinaryFileResponse($path);
        BinaryFileResponse::trustXSendfileTypeHeader();

        return $response;
    }
    \App::abort(400);
}

BinaryFileResponse 自动处理请求,并允许您完全提供文件(通过仅使用 Http 200 代码发出一个请求)或拆分以降低连接速度(使用 Http 206 代码发出更多请求,最后发出一个使用 200 代码的请求)。
如果您有mod_x发送文件您可以通过添加以下内容来使用(使流式传输速度更快):

BinaryFileResponse::trustXSendfileTypeHeader();

Android 代码不需要更改即可流式传输文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Laravel 为 Android 提供 mp3 流 的相关文章

随机推荐

  • 有角材料。鼠标悬停时突出显示表格行

    我们在我们的应用程序中使用 Angular Material 表 https material angular io components table overview https material angular io component
  • 导入 com.google.android.maps.geopoint 无法解析

    我有 Java GoogleMAP 项目 这不是 android 项目 我之前使用 KML 完成过这个项目 现在Google已经改用JSON XML了 我需要将坐标保存在数据库 postgresql 中的 2 个位置内 然后根据这个我将在M
  • 我有一个多模块 Maven 2 POM,它有两个 WAR,我如何配置它以在运行测试之前部署这两个 War?

    粗略地说 我有 比如说 项目 A pom 包装 它有两个模块 M1 和 M2 比如说 每个模块都有 war 包装 M2 有集成测试 但 M2 战争对 M1 战争进行了服务调用 这确实应该 将相同的数据加载到数据库中 部署 M1 的 WAR
  • 无法从类型 Two 对非静态方法 fxn(int) 进行静态引用 [重复]

    这个问题在这里已经有答案了 可能的重复 无法从静态上下文引用非静态方法 背后的原因是什么 https stackoverflow com questions 290884 what is the reason behind non stat
  • EF代码首先不创建数据库

    这是我的代码 public void ConfigureServices IServiceCollection services services AddDbContext
  • itunesconnect 处理失败

    I had archieved the xcode project and uploaded it into itunes connect This is 5 time uploading for internal testing It s
  • 为什么 window.addEventListener('scroll', this.someScrollHandler, false) 在 IE 10 上不起作用?

    我目前正在构建一个带有滚动处理程序的 React 应用程序 用于在无限滚动组件中加载更多数据 我在用着window addEventListener scroll this someScrollHandler false 带限制 适用于除
  • 如何在本地设置多个NPM用户?

    我使用两个 NPM 帐户 公共帐户和私人帐户 我该如何设置才能不需要npm login每次我在不同的帐户上发布模块时 UPD 寻找 NPM 内置解决方案 因此没有 shell 脚本等 这就是我使用 4 个不同的 NPM 登录解决该问题的方法
  • 工作簿已打开,但我仍然收到 VBA 下标超出范围错误

    我正在尝试通过我的宏脚本打开工作簿 每次尝试打开工作簿时都会重复出现此错误 我面临的问题是当我使用 Workbooks Open strFilePath where strFilePath genericfilepath FileDupli
  • 使用强分类器进行 boosting 的效果

    使用强 而不是弱 错误率接近随机 分类器进行 boosting 会产生什么效果 一个强分类器单独使用是否会比在 adaboost 中与一堆弱分类器一起使用时表现更好 对的 这是可能的 一切都取决于您的学习数据集 看看没有免费的午餐定理 总是
  • CSS溢出:隐藏剪切阴影

    现在是这样的 当我禁用时overflow hidden 阴影通常遍布四周 但当它打开时 它会在左侧和顶部被切割 我不知道为什么它只切割这两侧 但目前看起来仍然不太好 如何摆脱它 Code toolong width 80 overflow
  • django 错误 - ImportError:没有名为 apps 的模块

    我正在尝试创建第一个名为 mysite 的 django 项目 我的项目的结构是 mysite manage py mysite init py settings py urls py wsgi py polls init py admin
  • 应用程序关闭前的 Ionic 运行功能

    是否有某种我可以调用的函数来侦听应用程序是否即将退出 关闭或进入后台 基本上任何意味着 用户已停止使用该应用程序 的事件 我是我的应用程序 我建立了一个 用户日志 用于跟踪用户在应用程序中导航时的情况 我不想在这些事件发生时不断向服务器发送
  • Django 标签云插件 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • RavenDb - 递归查询/索引,用于分层文档

    我知道这可能是一个有点愚蠢的问题 可能会这样做 错了 但我会以任何方式询问 假设我有一组层次结构文档 它们包含的关于其在层次结构中的位置的唯一信息 是他们的家长 ID 如果它为空 我们就到达了顶部 吸引父母和孩子是最容易的部分 我想做的是查
  • Jenkins + Github Pull 请求构建器显示名称

    对于我们的项目 我们使用 GitHub 我们启用了 TravicCI 因为这是我们项目使用所必需的 除此之外 我们还有一个与拉取请求构建器一起运行的 Jenkins 完整实例 Now this all works fine and in t
  • 如何在 swift 中使用泛型类型处理不同类型?

    我正在尝试编写一个类 它允许我轻松地在两个值之间进行插值 class Interpolation class func interpolate
  • “/”应用程序中的服务器错误。系统.Web.Http.WebHost

    我正在尝试发布 ASP NET MVC 4 Internet 应用程序 发布后 我继续单击我的网站链接并找到 应用程序中的服务器错误 无法加载文件或程序集 System Web Http Version 4 0 0 0 Culture ne
  • PHP 中“include”的性能成本是多少?

    只是想知道是否有人知道与包含 100 个类文件的大型 600K 或更多 php 文件相关的 成本 信息 与自动加载单个文件 例如在找到匹配项之前搜索多个目录 相比 它真的有很大区别吗 如果启用 APC 缓存 此成本可以忽略不计吗 基本上 包
  • 使用 Laravel 为 Android 提供 mp3 流

    这是我的问题 我正在编写一个 laravel 后端 它必须提供一个 mp3 文件 该文件必须使用 android 标准媒体播放器再现 对于 laravel 后端 我需要使用 JWT 来处理身份验证 因此在每个请求标头中 我必须将 授权 字段