surface view 播放视频,
设置:
xml 配置:warp_content
设置大小:mHolder.setFixedSize(mVideoWigth, mVideoHeight);
但是我调整mVideoWigth, mVideoHeight参数对于视频大小没有任何影响 同时音频是不卡的,视频播放非常不流畅:320*240的分辨率
将来想播放网上url视频,缓冲问题如何解决? 平台2.2版本的
设置:
xml 配置:warp_content
设置大小:mHolder.setFixedSize(mVideoWigth, mVideoHeight);
但是我调整mVideoWigth, mVideoHeight参数对于视频大小没有任何影响 同时音频是不卡的,视频播放非常不流畅:320*240的分辨率
将来想播放网上url视频,缓冲问题如何解决? 平台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>
我就纠结了 不都是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();
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也换个。
呵呵,我是新手。提点意见,关注楼主,给予问题的正确答案。方便的话,给个程序代码,让试试效果。
mSeekBar.setProgress(mMediaPlayer.getCurrentPosition());
没有效果。
对于音频是可以的,但是视频不行。不知道为什么。关于surface你的意思是在surface里面设定大小么?
我去试试
LayoutParams lp = getLayoutParams();
lp.height = height;
lp.width = width;
setLayoutParams(lp);
}mUvv.setVideoScale(mHeight, mHeight * 3 / 4);
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掉。
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);
}
}
非常感谢楼上的回答,最近小忙才来。
1、设置分辨率的搞定了,多媒体模块 MediaPlayer 可以直接得到其分辨率,然后用5楼的方法就可以得到适配大小的画面了
2、android的多线程我是菜鸟,不过我前面贴的方法在audio里面是可以很正常的使用的,但是video里面会重复的读1s的内容,不断的循环;
用了你的方法也是1s内容无限的循环。
如果方便的话可否试一下?非常感谢你热心的帮助!
终于发现自己错在哪里了,
刚才就隐约觉得seekBar的点击定位于handler无限循环
仔细看了下,有boolean fromUser这个判断
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {加上一个判断就不会因为线程改变seekbar而引起seekbar 监听的调用了
if(fromUser){
mVideoPlayer.seekTo(mSeekBar.getProgress());
}第一次做程序,很菜鸟的问题。
感谢ls几位的回答