surface view 播放视频,
设置: 
xml 配置:warp_content  
设置大小:mHolder.setFixedSize(mVideoWigth, mVideoHeight);  
但是我调整mVideoWigth, mVideoHeight参数对于视频大小没有任何影响 同时音频是不卡的,视频播放非常不流畅:320*240的分辨率 
将来想播放网上url视频,缓冲问题如何解决? 平台2.2版本的 

解决方案 »

  1.   

    我补充一下,我后来push进去更小的分辨率视频以及更大的分辨率视频更大的就完全播放不出来——这个我找过说2.2模拟器不支持高分辨率
    更小的画面被拉伸到占满surface大小,画质严重损失。我在想是不是surface配置的有问题。
    xml就是直接写的linearlayout,有控制按钮什么的,surface直接占满了剩下的屏幕画面:LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:gravity="center"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"> <TextView
    android:text="TextView"
    android:id="@+id/VideoStates"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"></TextView><SeekBar
    android:id="@+id/seekBar"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    </SeekBar>
          <LinearLayout 
          android:orientation="horizontal"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:gravity="center">
            <ImageButton
          android:id="@+id/LastImageButton"
          android:src="@drawable/last"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          />
          <ImageButton
          android:id="@+id/StartImageButton"
          android:src="@drawable/start"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          />
          <ImageButton
          android:id="@+id/StopImageButton"
          android:src="@drawable/stop"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          />
          <ImageButton
          android:id="@+id/NextImageButton"
          android:src="@drawable/next"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          /> 
           </LinearLayout>
    <ListView
    android:id="@id/android:list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:drawSelectorOnTop="true"/>
     <SurfaceView
           android:id="@+id/VideoSurface"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_gravity="center">
      </SurfaceView>
    </LinearLayout>
      

  2.   

    顺便再问一个问题 关于seekbar与视频的同步音频的可以成功同步,but视频的用同样的方法搞不定
    我就纠结了 不都是media么……//Seekbar 进程
       final Runnable updateSeekBar =new Runnable(){
    @Override
    public void run() {
    // TODO Auto-generated method stub
    while(mFlag)
    {
    //线程的实际动作
    mSeekBar.setProgress(mMediaPlayer.getCurrentPosition());

    try {
    //更新时间
    Thread.sleep(1000);
    //每秒钟更新一次
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }    };
        mSeekbarThread = new Thread(updateSeekBar);
        mSeekbarThread.start();
      

  3.   

    mSeekbarThread = new Thread(updateSeekBar);
    mSeekbarThread.start();放在构造函数里。或者上层吧。<SurfaceView
      android:id="@+id/VideoSurface"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="center">
      </SurfaceView>width,height都用小点的dp试试。
    把gravity也换个。
    呵呵,我是新手。提点意见,关注楼主,给予问题的正确答案。方便的话,给个程序代码,让试试效果。
      

  4.   

    首先 线程我debug查看的时候是已启动,也就是说定位刷新
    mSeekBar.setProgress(mMediaPlayer.getCurrentPosition());
    没有效果。
    对于音频是可以的,但是视频不行。不知道为什么。关于surface你的意思是在surface里面设定大小么? 
    我去试试
      

  5.   

    public void setVideoScale(int width, int height) {
    LayoutParams lp = getLayoutParams();
    lp.height = height;
    lp.width = width;
    setLayoutParams(lp);
    }mUvv.setVideoScale(mHeight, mHeight * 3 / 4);
      

  6.   

    楼上的方法是动态改变surfaceView的大小,也就是你播放屏幕的大小。首先你要获取到媒体分辨率的参数,即width * height。可以用以下方法:
    MediaMetadataRetriever retr = new MediaMetadataRetriever();  
    retr.setDataSource(path); //媒体文件绝对路径    
    Bitmap bm = retr.getFrameAtTime(); //根据位图来获取分辨率
    width = bm.getWidth();  
    height = bm.getHeight(); 
    然后再mHolder.setFixedSize(width, height);这样视屏就不会模糊了。
    注意在每次开关机和sdcard热插拔时,系统才会自动扫描sdcard,并更新应用程序信息。
    所以说push完毕后需要重启模拟器,当然可以使用sdcard.iso作为sdcard,直接将文件放进.iso.还有要注意的是,动态改变surfaceView没有问题,但是在播放的时候可能会在动态拉伸视屏图像的时候出现问题。这里我不知道怎样处理,我的surfaceView是定死的,没有动态改变。
    2.2模拟器可以播放一般的mp4,3gp. 3.0的模拟器虽然支持高清mp4(h264),但是播放的时候会有延迟,造成音频视频不同步(大约每5秒延迟1秒),但可以很流畅的播放一般的mp4,3gp。至于播放流媒体,可以另开一个线程缓冲,使用prepareAsync()异步方法缓冲,再通过public void onPrepared(MediaPlayer mp) 接口start。千万不能让主线程缓冲,很容易因为超时down掉。
      

  7.   

    顺便说一下,你这样子写肯定是不行的。Android 不允许将UI线程放在子线程中执行,只能在主线程中执行!所以你要通过使用Handler来通知主线程去处理UI事件。
    Handler handler = new Handler(){
         public void handleMessage(Message msg) {
         switch (msg.what) {
    case 0:
    changeCurrentTime();
    break;
            }
        }
    }Time timer = new Timer();
    timer.schedule(new audioTimerTask(), 0, 1000);private void changeCurrentTime(){
    if(mPlayer != null){);
    mSeekBar.setProgress(mPlayer.getCurrentPosition());
    }
    }class audioTimerTask extends TimerTask{
            @Override
    public void run() {
    handler.sendEmptyMessage(0);
    }
    }
      

  8.   


    非常感谢楼上的回答,最近小忙才来。
    1、设置分辨率的搞定了,多媒体模块 MediaPlayer 可以直接得到其分辨率,然后用5楼的方法就可以得到适配大小的画面了
    2、android的多线程我是菜鸟,不过我前面贴的方法在audio里面是可以很正常的使用的,但是video里面会重复的读1s的内容,不断的循环;
    用了你的方法也是1s内容无限的循环。
    如果方便的话可否试一下?非常感谢你热心的帮助!
      

  9.   


    终于发现自己错在哪里了,
    刚才就隐约觉得seekBar的点击定位于handler无限循环
    仔细看了下,有boolean fromUser这个判断
    public void onProgressChanged(SeekBar seekBar, int progress,
    boolean fromUser) {加上一个判断就不会因为线程改变seekbar而引起seekbar 监听的调用了
    if(fromUser){
    mVideoPlayer.seekTo(mSeekBar.getProgress());
    }第一次做程序,很菜鸟的问题。
    感谢ls几位的回答