我们正在根据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播放时,如果本地文件系统上的同一文件完美播放,则播放失败。
答案 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);
现在,我可以通过身份验证流媒体了。