我正在创建一个执行以下操作的移动应用程序
该序列已在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更加严格,哪个视频将与其他媒体播放器对抗
答案 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编解码器的音频进行编码。