如何解决Exoplayer-是否可以在加载URL之前检查URL是否为有效的mp4 / webm URL?
是否可以在尝试加载播放器之前检查它是否确实是可以随播放器加载的URL?
String mUrl = " --- ";
player = new SimpleExoPlayer.Builder(this).build();
playerView.setPlayer(player);
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this,Util.getUserAgent(this,"yourApplicationName"));
Uri uri = Uri.parse(mUrl);
MediaSource videoSource =
new ProgressiveMediaSource.Factory(dataSourceFactory)
.createMediaSource(uri);
player.prepare(videoSource);
或者如果有图书馆这样做?
解决方法
一种解决方法是检查您要加载的URL的扩展名。例如,URL:http://thisisavideo/randompath/random_id.mp4
最有可能指向mp4资源。但是,这种方法存在两个主要问题:
- 您真的不能依靠URL扩展名。
http://simpleurlhaha.com
也可能指向mp4资源。 - 这种方法不能保证URL有效。
保证有效的一种方法是对网址执行HTTP Head request并选中Content-Type
。您可以使用Retrofit或您使用的任何其他网络库来实现。如果该网址有效,您将收到类似以下的响应:
HTTP/1.1 200 OK
Keep-Alive: timeout=5,max=100
Connection: Keep-Alive
Accept-Ranges: bytes
Content-Length: 1034745
Content-Type: video/mp4
Date: Wed,17 Sat 2020 13:01:19 GMT
Last-Modified: Fri,8 Aug 2019 21:12:31 GMT
Server: Apache
如您所见,只需在Content-Type
字段中进行if-check,就可以检测出它是MP4还是WebM URL。
就我个人而言,我认为上述建议很昂贵,因为它涉及进行额外的网络呼叫,并增加了整体处理时间。如果这仍然适合您的用例。请继续。
,为什么不仅仅使用Exoplayer?
private void checkIfMediaValid(String url,MediaValidationCallback mediaValidationCallback){
SimpleExoPlayer player = new SimpleExoPlayer.Builder(this).build();
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this,Util.getUserAgent(this,"yourApplicationName"));
Uri uri = Uri.parse(url);
MediaSource videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory)
.createMediaSource(uri);
player.prepare(videoSource);
player.addListener(new Player.EventListener() {
boolean listen = true;
@Override
public void onPlayerStateChanged(boolean playWhenReady,int playbackState) {
if(!listen)
return;
if(playbackState== Player.STATE_IDLE){
ExoPlaybackException error = player.getPlaybackError();
if(error!=null){
if (error.type == ExoPlaybackException.TYPE_SOURCE) {
IOException cause = error.getSourceException();
if (cause instanceof HttpDataSource.HttpDataSourceException) {// An HTTP error occurred.
HttpDataSource.HttpDataSourceException httpError = (HttpDataSource.HttpDataSourceException) cause;
if (httpError instanceof HttpDataSource.InvalidResponseCodeException) {//RESPONSE CODE NOT 2XX
callback(false);
} else {
Throwable throwable = httpError.getCause();
if(throwable instanceof UnknownHostException){//NO NETWORK
//callback(false);
}
}
}else if(cause instanceof FileDataSource.FileDataSourceException){//NOT FOUND (PROBABLY INVALID URL)
callback(false);
}else if(cause instanceof UnrecognizedInputFormatException){//WRONG INPUT(CONTENT)
callback(false);
}else if(cause instanceof Loader.UnexpectedLoaderException){
Throwable throwable = cause.getCause();
if(throwable instanceof SecurityException){//PROBABLY PERMISSION DENIED (Internet or ...)
//callback(false);
}
}
}
}
if(listen){//NO CALLBACK
listen = false;
player.release();
}
}else if(playbackState == Player.STATE_READY){
callback(true);
}
}
private void callback(boolean result){
mediaValidationCallback.result(result);
listen = false;
player.release();
}
});
}
interface MediaValidationCallback{
void result(boolean isValid);
}
然后:
checkIfMediaValid(" --- ",isValid -> {
//isValid : false
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。