android - 如何将视频从android发送到服务器,当转到分配给它的URL时能够在浏览器中播放?

标签 android retrofit2 mediarecorder android-mediarecorder video-recording

我使用 Retrofit 2 将视频文件(从相机捕获)发送到我的 PHP 服务器,视频已成功上传到服务器中的文件夹(我使用 FileZilla 检查过,该视频存在于文件夹中),我将视频分配给一个 URL,我转到相同的 Url(使用浏览器)它无法播放视频。

在Url中就是这样显示的(例如:mydomain.cc/video/VID_2014.mp4)

enter image description here

所以我测试了一个随机视频,通过 postman 发送,该视频的网址可以播放。

像这样:

enter image description here

我在捕获视频后在 onActivityResult 中获取的 Android 视频文件路径如下所示

/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 检查了编解码器,这是结果..

enter image description here enter image description here

最佳答案

视频使用的音频和视频编解码器很重要;并非所有播放器都支持所有编解码器。 Mozilla has a nice table of supported codecs by platform and player .根据这张表,我想你想要:

  1. WebM 中的 VP8 和 Vorbis(需要更改容器)
  2. MP4 中的 H.264 和 MP3
  3. MP4 中的 H.264 和 AAC

您可以使用流行的 vlc 检查编解码器媒体播放器,或 ffmpeg .

捕获视频后,您可能需要转换为合适的网络编解码器。 ffmpeg 是一个用于转换编解码器和容器的免费工具。

ffmpeg documentation example for converting to webm是:

ffmpeg -i input.mp4 -c:v libvpx -b:v 1M -c:a libvorbis output.webm

您可能需要根据您的质量/大小偏好调整比特率 1M。

关于android - 如何将视频从android发送到服务器,当转到分配给它的URL时能够在浏览器中播放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46630036/

相关文章:

android - 如何在 Fragment 中执行 AsyncTask

android - 在Android中选择同一布局中的EditText时如何关注Webview?

android - 为什么建议不要对 Android 房间使用 allowMainThreadQueries()?

javascript - MediaStream 同时捕获 Canvas 和音频

Android Intent 发布 URL?

Android pre-lollipop 设备给出错误 "SSL handshake aborted: ssl=0x618d9c18: I/O error during system call, Connection reset by peer"

java - 改造不适用于特定版本的 android

java - 如何使用延迟响应解决 JSON 改造错误

javascript - 如何在javascript中将两个音频文件合并为一个并使其合并后播放

javascript - 使用 Chrome 浏览器录制 Canvas 动画播放问题