android - 为什么 SurfaceView 在 Android 中不显示 3gp 视频

标签 android video media surfaceview

我正在使用以下示例代码来播放 3gp 视频。在 android 2.3 上 .. 但只有音频在播放,但视频没有出现。有什么问题吗?

package pit.opensource.video;

import android.app.Activity;
import android.content.Context;
import android.graphics.PixelFormat;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;

public class L2VideoExampleActivity extends Activity implements SurfaceHolder.Callback{

    MediaPlayer mediaPlayer;
    SurfaceView surfaceView;
    SurfaceHolder surfaceHolder;
    boolean pausing = false;

    AudioManager audioManager;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
        int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        int curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
        SeekBar volControl = (SeekBar)findViewById(R.id.volbar);
        volControl.setMax(maxVolume);
        volControl.setProgress(curVolume);
        volControl.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

            @Override
            public void onStopTrackingTouch(SeekBar arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onStartTrackingTouch(SeekBar arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
                // TODO Auto-generated method stub
                audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, arg1, 0);
            }
        });


        Button buttonPlayVideo = (Button)findViewById(R.id.playvideoplayer);
        Button buttonPauseVideo = (Button)findViewById(R.id.pausevideoplayer);

        getWindow().setFormat(PixelFormat.UNKNOWN);
        surfaceView = (SurfaceView)findViewById(R.id.surfaceview);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setFixedSize(176, 144);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        mediaPlayer = new MediaPlayer();

        buttonPlayVideo.setOnClickListener(new Button.OnClickListener(){

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                pausing = false;

                if(mediaPlayer.isPlaying()){
                    mediaPlayer.reset();
                }

                mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                mediaPlayer.setDisplay(surfaceHolder);

                try {
                //  mediaPlayer.setDataSource(stringPath);
                //  mediaPlayer.prepare();
                    mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.samplevideo);

                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalStateException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                mediaPlayer.start();


            }});

        buttonPauseVideo.setOnClickListener(new Button.OnClickListener(){

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if(pausing){
                    pausing = false;
                    mediaPlayer.start();
                }
                else{
                    pausing = true;
                    mediaPlayer.pause();
                }
            }});

    }



    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        // TODO Auto-generated method stub

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub

    }
}

最佳答案

我认为您必须在 surfaceview 中播放视频。您现在在 oncreate 中播放视频并且可能尚未创建 surfaceview。 在 surfaceCreated

中使用类似的东西
    @Override
    public void surfaceCreated(SurfaceHolder holder) 
    {

             if(ArrayManager.array_for_playing != null)
        if(SDcard.icurrentIndex != -1)
          playVideo(SDcard.icurrentIndex);
    }

这是播放视频的方法

    private void playVideo(Integer Media) 
    {

        try {

            mPlayer.reset();
            mPlayer.setDataSource(ArrayManager.array_for_playing.get(SDcard.icurrentIndex).getPath());

          mPlayer.setDisplay(holder);                
            songProgressBar.setProgress(0);
            songProgressBar.setMax(100);
            mPlayer.prepare();
            mPlayer.start();
            btnPlay.setBackgroundResource(R.drawable.img_btn_pause);

            // Updating progress bar
            updateProgressBar();

        } 
        catch (Exception e) 
        {
            Log.e("video player", "error: " + e.getMessage(), e);
        }
    }

并在IniatializeUi方法中

     private void InitializeUI()
     {
            mPreview = (SurfaceView) findViewById(R.id.surface_view);
            holder = mPreview.getHolder();
            holder.addCallback(this);
            holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
      }

在 Activity 顶部:

    private SurfaceView mPreview;
    private SurfaceHolder holder;

我希望这对用户有帮助。

关于android - 为什么 SurfaceView 在 Android 中不显示 3gp 视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10660673/

相关文章:

java - 如何在Java中将.mp4视频转换为字节数组?

android - 使用 MediaMetadataRetriever 提取元数据有意外结果

Android - 图像选择器,错误的图像

android - 在这种情况下溢出意味着什么?

c# - 获取.MP4文件中的音频和视频流计数及其属性

java - 提取大量 zipper

android - 如何在 Android Webview 中停止后台播放声音

api - 目前哪些浏览器实现了对 HTML5 MediaController 的支持?

android - GestureDetector 已弃用的问题

android - 如何在 Kotlin 中使用 Koin 注入(inject) ViewModel?