【问题标题】:"audio/mpeg" stream api fails for some files plays some files?某些文件的“音频/mpeg”流 api 无法播放某些文件?
【发布时间】:2018-10-12 10:44:53
【问题描述】:

我们正在Android手机上录制一些音频,根据vlc信息具有以下格式:

Codec: MPEG AAC Audio (mp4a)
Language: English
Type: Audio
Channels: Stereo
Sample rate: 32000 Hz
Bits per sample: 32

上述文件在 mime 类型为audio/mpeg 的 safari 浏览器上无法播放,但是一旦我们将 mime 更改为 audio/mp4,它就开始在 safari 浏览器上播放。 对于 Android,我们使用 API 使用 api 资源流式传输此文件,如下所示:

@GET
    @UnitOfWork
    @Produces("audio/mpeg")
    @Path("/getaudiofile/{fileId}")
    public Response getPart(@Auth AuthUser authUser, @PathParam("fileId") Long fileId) {

 File audioFile = new File(filesTableDAO.getFilePathById(fileId));

if(audioFile.exists()) {
return Response.ok().entity(audioFile).build();
} else {
// ... Return 404 here
}

}

但是使用上面的 API,有些文件可以播放而有些则不能播放,类似于之前的 Safari 案例。但是 safari 问题很快就消失了,我们将 mime 更改为 "audio/mp4""video/mp4" 两种 mime 类型都可以工作。

但对于 API /getaudiofile/{fileId},以下 MIME 类型均不适用于 javax.ws.rs @Produces 注释:

    audio/mp4
    video/mp4
    audio/mpeg
    audio/m4a
    audio/mpeg-4
audio/mp4a

但是使用audio/mpeg,有些文件可以播放,但有些则不能。

什么可能是正确的 mime 类型,或者在从 API 返回时可以文件设置编解码器或 mime 信息本身吗?

或者有什么方法可以让Android Media Player MIME 类型感知?喜欢 html tag

我们已经流式传输了 mime“音频/mpeg”的文件内容,媒体播放器可以轻松播放较小的文件。但是更大的流媒体内容无法播放,例如10 - 20 MB。

播放器的流 URL 问题没有得到任何 mime 扩展,例如mp3 或 mp4。因此,我们希望媒体播放器提前知道正在流式传输的内容类型。

MediaPlayer API 是否支持在播放前将 mime 类型设置为播放器实例?

更新

1] 大尺寸文件会出现这种情况,小文件播放效果很好,播放几秒钟(1-50 秒)的录音没有问题,播放长度超过一分钟的录音文件无法播放。

2] 从经过身份验证的 URL 播放时,如果同一文件在本地文件系统上播放失败。

【问题讨论】:

    标签: java android rest audio mpeg-4


    【解决方案1】:

    如果我正确理解你的问题,也许你可以试试

    openTypedAssetFile

    public AssetFileDescriptor openTypedAssetFile (Uri uri, 字符串 mimeTypeFilter, 捆绑选项)

    由客户端调用以打开包含特定 MIME 类型数据的只读流。这就像 openAssetFile(Uri, String),除了文件只能是只读的并且 内容提供者可以执行数据转换以生成 所需的类型。

    openTypedAssetFile 的文档是 here

    另请查看 openWTypedAssetFileDescriptor here 的 API。

    【讨论】:

    • 我无法在使用上述方法时添加身份验证标头
    【解决方案2】:

    https://github.com/aruld/jersey-streaming

    Arul Dhesiaseelan 的上述项目解决了我的问题,我编写获取文件资源的方式效率不高,在上述 GitHub 项目中查看MediaResource.java

    这是流媒体文件的正确方法,根据您的文件调整 mime-types。

    我将标题设置为媒体播放器,如下所示:

    Map<String, String> headers = new HashMap<>();
                headers.put("Authorization", "Basic <BASE64_ENCODED_AUTH_TOKEN>");
                headers.put("Accept-Ranges", "bytes");
                headers.put("Status", "206");
                headers.put("Cache-control", "no-cache");
    
                Uri uri = Uri.parse(url);
                mediaPlayer.setDataSource(getContext(), uri, headers);
    

    现在我可以通过身份验证流式传输媒体了。

    【讨论】:

      猜你喜欢
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      • 2012-04-01
      • 2015-11-30
      • 2016-09-03
      相关资源
      最近更新 更多