【问题标题】:streaming and playing mp4 video流式传输和播放 mp4 视频
【发布时间】:2012-08-02 04:31:53
【问题描述】:

我想播放 mp4 视频。所以我尝试了以下方法

 private void playVideo() {
        try {

            final String path = s;
            Log.v(TAG, "path: " + path);
            if (path == null || path.length() == 0) {
            Toast.makeText(VideoPlay1.this, "File URL/path is empty",
                        Toast.LENGTH_LONG).show();

            } else {
                // If the path has not changed, just start the media player
                if (path.equals(current) && mVideoView != null) {
                    MediaController mediaController = new MediaController(this);
                    mediaController.setAnchorView(mVideoView);  
                  Uri video = Uri.parse(getDataSource(path));
                    Log.e("Uri video",video.toString());
                    mVideoView.setMediaController(mediaController);
                    mVideoView.setVideoURI(video);    
                     mVideoView.setVideoPath(getDataSource(path));
                    mVideoView.setOnPreparedListener(new OnPreparedListener() {

                        public void onPrepared(MediaPlayer arg0) {
                            dialog.dismiss();
                            mVideoView.start();
                        }
                    });
                    mVideoView.requestFocus();
                return;
            }
            current = path;

            MediaController mediaController = new MediaController(this);
            Uri video = Uri.parse(getDataSource(path));

            Log.e("Uri video",video.toString());
            mVideoView.setMediaController(mediaController);
            mVideoView.setVideoURI(video);    
             mVideoView.setVideoPath(getDataSource(path));
                mVideoView.setOnPreparedListener(new OnPreparedListener() {

                    public void onPrepared(MediaPlayer arg0) {
                        dialog.dismiss();
                        mVideoView.start();
                    }
                });
            mVideoView.requestFocus();
   }
        } catch (Exception e) {
            Log.e(TAG, "error123: " + e.getMessage(), e);
            if (mVideoView != null) {
                mVideoView.stopPlayback();
            }
        }
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {
        if (Integer.parseInt(android.os.Build.VERSION.SDK) < 5
                && keyCode == KeyEvent.KEYCODE_BACK
                && event.getRepeatCount() == 0) {
            Log.d("CDA", "onKeyDown Called");
            onBackPressed();
        }
        return super.onKeyDown(keyCode, event);
    }

    public void onBackPressed() {

        Log.d("CDA", "onBackPressed Called");
        mVideoView.stopPlayback();
        Intent setIntent = new Intent(VideoPlay1.this,VideoPage.class);
        startActivity(setIntent); 
        finish();
        return;
    }
    private String getDataSource(String path) throws IOException {
        if (!URLUtil.isNetworkUrl(path)) {
            return path;
        } else {
            URL url = new URL(path);
            URLConnection cn = url.openConnection();
            cn.connect();
            InputStream stream = cn.getInputStream();
            if (stream == null)
                throw new RuntimeException("stream is null");
            File temp = File.createTempFile("mediaplayertmp", "dat");
            temp.deleteOnExit();
            String tempPath = temp.getAbsolutePath();
            FileOutputStream out = new FileOutputStream(temp);
        byte buf[] = new byte[128];
            do {
            int numread = stream.read(buf);
                if (numread <= 0)
                    break;
                out.write(buf, 0, numread);


            } while (true);

            try {
                stream.close();

            } catch (IOException ex) {
                Log.e(TAG, "error: " + ex.getMessage(), ex);
            }
            return tempPath;
        }
    }

以上方法正常播放视频需要更多时间,所以请告诉我是否有其他方法。

谢谢。

最好的问候。

【问题讨论】:

    标签: android video-streaming


    【解决方案1】:

    抱歉,将视频流式传输到移动设备需要时间。你受限于连接,而不是代码

    【讨论】:

    • 还有其他方法可以同时流式传输和播放视频
    • 您可以使用 MediaPlayer 创建自己的视频播放器,但 VideoView 就是这样。 VideoView 会在设备流式传输到足以开始播放时立即启动,因此您无能为力
    【解决方案2】:

    我知道已经有一个公认的答案,但可能还有其他标准可能会有所帮助,尤其是文件的编码。

    默认情况下,MP4 视频的末尾通常有 MOOV ATOM。 “moov atom,也称为电影原子,定义了电影的时间尺度、持续时间、显示特征,以及包含电影中每个轨道信息的子原子。” (http://www.adobe.com/devnet/video/articles/mp4_movie_atom.html)。如果您在开始时使用 moov atom 对视频进行编码(您可以使用 FFMPEG 执行此操作),您的流媒体体验可能会得到改善。

    【讨论】:

      猜你喜欢
      • 2022-01-26
      • 2011-12-22
      • 1970-01-01
      • 2015-09-18
      • 2018-04-16
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多