"audio/mpeg" 流 api 某些文件无法播放某些文件?

"audio/mpeg" stream api fails for some files plays some files?

我们正在 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} none 以下 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 type aware? Like html tag.

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

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

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

更新

1]大文件小文件播放很好,几秒(1-50秒)的录音播放没有问题,播放长度超过一分钟的录音文件无法播放.

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

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

openTypedAssetFile

public AssetFileDescriptor openTypedAssetFile (Uri uri, String mimeTypeFilter, Bundle opts)

Called by a client to open a read-only stream containing data of a particular MIME type. This is like openAssetFile(Uri, String), except the file can only be read-only and the content provider may perform data conversions to generate data of the desired type.

openTypedAssetFile 的文档是 here

另请查看 API openWTypedAssetFileDescriptor here

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

以上项目来自 Arul Dhesiaseelan solved my issue, The way I wrote get file Resource was not efficient, In above GitHub project take look into MediaResource.java

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

我将 headers 设置为媒体播放器如下:

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);

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