无法播放视频流

14

这是我的视频播放代码:

    Uri uri = Uri.parse(vidurl);
    MediaController mediaController = new MediaController(this);
    videoView.setMediaController(mediaController);
    videoView.requestFocus();
    videoView.setVideoURI(uri);

    videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            videoView.start();
        }
    });

我尝试播放的视频存储在我的服务器上。它们是使用自定义相机从同一应用程序发送到那里的。以下是视频捕获参数:(以防出现问题,我尝试了每种组合,VP8格式可以流式传输,但输出没有音频并且侧向旋转)

    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

    if (currentCameraId == Camera.CameraInfo.CAMERA_FACING_BACK) {
        mMediaRecorder.setOrientationHint(90);
    } else {
        mMediaRecorder.setOrientationHint(270);
    }

    mMediaRecorder.setVideoSize(list.get(sizex).width, list.get(sizex).height);
    mMediaRecorder.setVideoEncodingBitRate(1500000);
    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    mMediaRecorder.setVideoFrameRate(30);
    mMediaRecorder.setMaxDuration(15000);
    mMediaRecorder.setOutputFile(getVidFile().getAbsolutePath());

我已经尝试了很久但现在没有任何想法。我想在videoview中流式传输这些视频。但是相反,我必须等待10-20秒钟。之后,要么视频开始播放,要么会出现无法播放视频的错误。

附加信息:

项目最低sdk为18,但如果那有帮助,我可以更改它。

我的测试设备是Asus Zenfone 2(5.0)

我没有使用其他设备进行测试

视频存储在godaddy linux主机上。 www.mydomain.com/videos/

视频编码为h264基线配置文件

Moov原子位于顶部(在fytp(或类似内容)之后),正如推荐的那样

我尝试过使用第三方视频播放库,例如exomedia

某些视频确实有效,例如:

http://www.html5videoplayer.net/videos/toystory.mp4

我检查了该视频的编码。它使用h264 MAIN PROFILE进行编码(从我的研究中得知,大多数Android设备不支持主配置文件,建议使用基线配置文件),而MOOV原子位于最后位置。但是这个视频播放正常...怎么回事?

编辑:那个可用的toystory视频的属性:

1

2

这是使用上述参数从我的应用程序捕获的视频(请注意,moov原子在正确位置,但仍然无法播放)

3

4


你发现了任何错误吗?使用mp.start()代替videoview.start()。 - Yogesh Rathi
1
现在我尝试使用SurfaceView来使用MediaPlayer,并记得调用prepareAsync而不是prepare(),但仍然无法正常工作。E/MediaPlayer: 错误(1,-2147483648) - user6650650
1个回答

1
当您的视频从服务器传输到应用程序时,使用哪种网络协议?也许您正在使用的网络协议不受VideoView支持。VideoView仅支持有限的协议。根据Android文档中的“支持的媒体格式”:以下网络协议支持音频和视频播放:--RTSP(RTP,SDP)--HTTP / HTTPS渐进式流--HTTP / HTTPS实时流草案协议:
MPEG-2 TS media files only

Protocol version 3 (Android 4.0 and above)

Protocol version 2 (Android 3.x)

Not supported before Android 3.0

--注意:Android 3.1之前不支持HTTPS。


我不知道什么是网络协议。我该如何检查我正在使用哪个? - user6650650
经再次检查您的问题,我认为使用的网络协议是渐进式http。那不应该是个问题。有一些类似于你的问题:https://dev59.com/oOo6XIcBkEYKwwoYPSH7和https://dev59.com/R1PTa4cB1Zd3GeqPj4EU。他们的答案提到:“对于3GPP和MPEG-4容器,moov原子必须在任何mdat原子之前,但必须在ftyp原子之后。”在您的问题中,您提到您的配置是“Moov原子置于顶部(在fytp(或类似)之后)”。也许那就是问题所在。 - Fenny Sunshine
根据此链接:http://www.adobe.com/devnet/video/articles/mp4_movie_atom.html我的moov原子位于正确的位置。 - user6650650

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接