如何将视频从android发送到服务器,当分配到URL时可以在浏览器中播放?
How to send video to server from android,which able to play back in browser when go to the URL assign to it?
我使用 Retrofit 2 将视频文件(从相机捕获)发送到我的 PHP 服务器,视频已成功上传到服务器中的文件夹(我用 FileZilla 检查过,该视频存在于文件夹中) ,我将视频分配给 URL,我转到相同的 Url(使用浏览器)它无法播放视频。
它在Url中就是这样出现的(例如:mydomain.cc/video/VID_2014.mp4)
所以我测试了一个随机视频,通过邮递员发送,该视频的 URL 可以播放。
像这样:
我在 Android 中捕获视频后进入 onActivityResult
的视频文件路径如下所示
/storage/emulated/0/DCIM/ABC/VID_20171008_183129.mp4
这是我发送视频文件的代码
private void uploadVideoToServer(String pathToVideoFile){
File videoFile = new File(pathToVideoFile);
RequestBody videoBody = RequestBody.create(MediaType.parse("video/*"), videoFile);
MultipartBody.Part vFile = MultipartBody.Part.createFormData("video", videoFile.getName(), videoBody);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(SERVER_PATH)
.addConverterFactory(GsonConverterFactory.create())
.build();
VideoInterface vInterface = retrofit.create(VideoInterface.class);
Call<ResultObject> serverCom = vInterface.uploadVideoToServer(vFile);
serverCom.enqueue(new Callback<ResultObject>() {
@Override
public void onResponse(Call<ResultObject> call, Response<ResultObject> response) {
ResultObject result = response.body();
if(!TextUtils.isEmpty(result.getSuccess())){
Toast.makeText(MainActivity.this, "Result " + result.getSuccess(), Toast.LENGTH_LONG).show();
Log.d(TAG, "Result " + result.getSuccess());
}
}
@Override
public void onFailure(Call<ResultObject> call, Throwable t) {
Log.d(TAG, "Error message " + t.getMessage());
}
});
}
VideoInterface.java
public interface VideoInterface {
@Multipart
@POST("video.php")
Call<ResultObject> uploadVideoToServer(@Part MultipartBody.Part video);
}
所以我的问题是,为什么 Android 摄像头拍摄的视频无法在 Url 中播放?这重要吗?
因为我后来担心我需要使用 Url 显示回我的应用程序,请问如何解决这个问题?
所以有人请给我一个完整的解决方案..
编辑:
我使用 ffmpeg 检查了编解码器,这是结果..
视频 MP4 存储播放它所需的元数据。是不是等视频下载完了才放弃?
您的视频使用的音频和视频编解码器很重要;并非所有播放器都支持所有编解码器。 Mozilla has a nice table of supported codecs by platform and player。基于这个table,我想你想要:
- WebM 中的 VP8 和 Vorbis(需要更改容器)
- MP4 中的 H.264 和 MP3
- MP4 中的 H.264 和 AAC
您可以使用流行的 vlc media player, or ffmpeg 检查编解码器。
捕获视频后,您可能需要转换为 suitable 网络编解码器。 ffmpeg 是一个用于转换编解码器和容器的免费工具。
ffmpeg documentation example for converting to webm是:
ffmpeg -i input.mp4 -c:v libvpx -b:v 1M -c:a libvorbis output.webm
您可能需要根据自己的 quality/size 偏好将比特率调整为 1M。
我使用 Retrofit 2 将视频文件(从相机捕获)发送到我的 PHP 服务器,视频已成功上传到服务器中的文件夹(我用 FileZilla 检查过,该视频存在于文件夹中) ,我将视频分配给 URL,我转到相同的 Url(使用浏览器)它无法播放视频。
它在Url中就是这样出现的(例如:mydomain.cc/video/VID_2014.mp4)
所以我测试了一个随机视频,通过邮递员发送,该视频的 URL 可以播放。
像这样:
我在 Android 中捕获视频后进入 onActivityResult
的视频文件路径如下所示
/storage/emulated/0/DCIM/ABC/VID_20171008_183129.mp4
这是我发送视频文件的代码
private void uploadVideoToServer(String pathToVideoFile){
File videoFile = new File(pathToVideoFile);
RequestBody videoBody = RequestBody.create(MediaType.parse("video/*"), videoFile);
MultipartBody.Part vFile = MultipartBody.Part.createFormData("video", videoFile.getName(), videoBody);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(SERVER_PATH)
.addConverterFactory(GsonConverterFactory.create())
.build();
VideoInterface vInterface = retrofit.create(VideoInterface.class);
Call<ResultObject> serverCom = vInterface.uploadVideoToServer(vFile);
serverCom.enqueue(new Callback<ResultObject>() {
@Override
public void onResponse(Call<ResultObject> call, Response<ResultObject> response) {
ResultObject result = response.body();
if(!TextUtils.isEmpty(result.getSuccess())){
Toast.makeText(MainActivity.this, "Result " + result.getSuccess(), Toast.LENGTH_LONG).show();
Log.d(TAG, "Result " + result.getSuccess());
}
}
@Override
public void onFailure(Call<ResultObject> call, Throwable t) {
Log.d(TAG, "Error message " + t.getMessage());
}
});
}
VideoInterface.java
public interface VideoInterface {
@Multipart
@POST("video.php")
Call<ResultObject> uploadVideoToServer(@Part MultipartBody.Part video);
}
所以我的问题是,为什么 Android 摄像头拍摄的视频无法在 Url 中播放?这重要吗?
因为我后来担心我需要使用 Url 显示回我的应用程序,请问如何解决这个问题?
所以有人请给我一个完整的解决方案..
编辑: 我使用 ffmpeg 检查了编解码器,这是结果..
视频 MP4 存储播放它所需的元数据。是不是等视频下载完了才放弃?
您的视频使用的音频和视频编解码器很重要;并非所有播放器都支持所有编解码器。 Mozilla has a nice table of supported codecs by platform and player。基于这个table,我想你想要:
- WebM 中的 VP8 和 Vorbis(需要更改容器)
- MP4 中的 H.264 和 MP3
- MP4 中的 H.264 和 AAC
您可以使用流行的 vlc media player, or ffmpeg 检查编解码器。
捕获视频后,您可能需要转换为 suitable 网络编解码器。 ffmpeg 是一个用于转换编解码器和容器的免费工具。
ffmpeg documentation example for converting to webm是:
ffmpeg -i input.mp4 -c:v libvpx -b:v 1M -c:a libvorbis output.webm
您可能需要根据自己的 quality/size 偏好将比特率调整为 1M。