无法在Azure Blob存储上在Android上播放mp4

时间:2016-02-17 10:59:54

标签: android azure video azure-storage-blobs video-encoding

我正在创建一个执行以下操作的移动应用程序

  • 录制* .mp4视频
  • 在本地保存* .mp4
  • 将* .mp4上传到Azure Blob存储
  • 从Azure存储位置播放(渐进式下载)* .mp4

该序列已在iOS上完美实现。

在Android上,我可以录制视频,保存视频,上传视频,但无法使用VideoView和MediaController从Azure流式传输(渐进式下载)文件。

我收到“无法播放此视频”

我从Android应用上传的视频适用于iOS和HTML5,几乎适用于任何其他媒体播放器。

如果我选择播放我在本地保存的* .mp4(在上传* .mp4之前)通过VideoView,它可以正常工作。因此,在此阶段,在上传到Azure之前,视频似乎处于工作状态。

我做的另一项测试是通过Azure存储资源管理器上传Big Buck Bunny,这似乎完美无缺。

所以我怀疑当我将文件上传到Azure或者流式传输的编码不正确时,我可能会丢失标题。

这是我的代码,没什么特别的:

MediaRecorder用于显示和录制视频的设置:

mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setOutputFile(getVideoFile(activity).getAbsolutePath());
mediaRecorder.setVideoEncodingBitRate(1000000);
mediaRecorder.setVideoFrameRate(5);
mediaRecorder.setVideoSize(videoSize.getWidth(), videoSize.getHeight());
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);

使用CloudBlockBlob上传文件:

StorageCredentials credentials = new StorageCredentialsSharedAccessSignature(sasQueryString);
URI containerUri = new URI(blobUri);
CloudBlockBlob blob = new CloudBlockBlob(URI.create(blobUri), credentials);
blob.getProperties().setContentType("video/mp4");
blob.uploadFromFile(imageUri);

尝试播放上传的文件:

videoView = (VideoView) findViewById(R.id.videoView);
MediaController mediaController = new MediaController(this);
videoView.setVideoURI(Uri.parse("http://xox.blob.core.windows.net/container/movie.mp4"));
videoView.setMediaController(mediaController);
videoView.start();

此时我收到“无法播放此视频”!

正如我所说,这个上传的文件似乎在其他所有媒体播放器上运行,包括iOS和HTML5。 如果我在Android上播放本地保存的文件版本,它可以正常工作。

但上传后我无法在Azure上播放Android文件。我也无法播放在Android上创建的iOS创建和上传的文件。

是否编码问题?我上传的blob不正确吗?是什么让Android的ViewVideo更加严格,哪个视频将与其他媒体播放器对抗

3 个答案:

答案 0 :(得分:1)

您可能提前调用start(),在媒体播放器准备开始播放时启动视频:Reference MediaPlayer

UPDATE <table_name>
SET <column_name> = CONCAT(LEFT(<column_name>, CHAR_LENGTH(<column_name>) -1), '')
WHERE <condition>;

答案 1 :(得分:1)

尝试使用此库:https://github.com/brianwernick/ExoMedia

它封装了ExoPlayer api,类似于VideoView的API。

此外,在尝试播放录制器时遇到问题,并使用Azure Blob存储中的FFMPEG视频进行转换。

答案 2 :(得分:0)

@彼得的答案应该有效。在设置Prepared监听器之后,而不是MediaPlayer.prepare()调用MediaPlayer.prepareAsync()。

如果您只是将视频的扩展名从.mov更改为.mp4,那么在ios中进行录制时,大多数Android设备都无法播放。还要验证在MP4容器中,视频流应使用H264编解码器和带AAC编解码器的音频进行编码。