“音频/ mpeg”流api对于某些文件播放某些文件失败?

时间:2018-10-12 10:44:53

标签: java android rest audio mpeg-4

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

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

以上文件未在具有哑剧类型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之前的案例。但是野生动物园问题很快就消失了,我们将两种哑剧类型都改为"audio/mp4""video/mp4"

但是对于API /getaudiofile/{fileId},以下任何一种mime类型都无法与javax.ws.rs @Produces注释一起使用:

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

但是使用audio/mpeg时,有些文件会播放,而有些则不会。

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

或者是否有任何方法可以使Android Media Player MIME类型知道?像 html tag

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

播放器流URL出现问题,播放器未获得任何哑剧扩展名,例如mp3或mp4。因此,我们希望媒体播放器预先知道要流播哪种类型的内容。

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

更新

1]对于大尺寸的文件,这会发生小文件播放得很好,播放几秒钟(1-50秒)的记录而没有问题,播放长度超过一分钟的记录文件无法播放。 / p>

2]从本地URL播放时,如果本地文件系统上的同一文件完美播放,则播放失败。

2 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,也许您可​​以尝试

  

openTypedAssetFile

     

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

     

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

openTypedAssetFile的文档为here

还要查看openWTypedAssetFileDescriptor here的API。

答案 1 :(得分:0)

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

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

这是流媒体文件的正确方法,根据文件调整MIME类型。

我将媒体播放器的标头设置如下:

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

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