"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);
现在我可以通过身份验证流式传输媒体了。
我们正在 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);
现在我可以通过身份验证流式传输媒体了。