2012-08-10 6 views
12

Tôi đã tạo trình phát video với trình xem lướt sóng và trình phát đa phương tiện. tôi có 10 video và 10 nút. nếu nhấp vào từng nút, mỗi video sẽ phát.Làm cách nào để xóa bộ giữ bề mặt khi trình phát đa phương tiện kết thúc?

đây là mã của tôi ..

//onCreate 
holder = surfaceview.getHolder(); 
holder.addCallback(this); 
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 


//Button1 
if(mp == null)mp = new MediaPlayer(); 

mp.setDataSource(mediaplay_path); 
mp.setDisplay(holder); 
mp.setScreenOnWhilePlaying(true); 
mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 
mp.prepare(); 
mp.start(); 


//Button2 
if(mp != null){ 
    mp.stop(); 
    mp.reset(); 
} 

mp.setDataSource(mediaplay_path2); 
mp.setDisplay(holder); 
mp.setScreenOnWhilePlaying(true); 
mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 
mp.prepare(); 
mp.start(); 

//Button3~Button10 is same as Button2.. 

mọi thứ đều tốt. videoview tùy chỉnh của tôi đang hoạt động ổn. nhưng khi video chuyển sang video tiếp theo, cảnh cuối cùng của video trước đó vẫn còn trong một khoảng thời gian và chuyển sang cảnh video tiếp theo.

tôi nghĩ rằng đó là vì các bản xem trước trước đó phải rõ ràng trước khi video tiếp theo phát. nhưng tôi không có ý tưởng làm thế nào để xóa các surfaceview hoặc chủ bề mặt.

Tôi đã tìm kiếm điều này nhưng chỉ có thể tìm cách phát video chứ không phải cách xóa bản xem trước được đặt không đúng với trình phát đa phương tiện.

hãy giúp tôi ~~!

Trả lời

1

Các SurfaceHolderlockCanvas phương pháp này sẽ cho phép bạn vẽ trực tiếp đến Surface. Sử dụng phương pháp drawColor của Canvas để tô màu đen.

Điều đó nói rằng, có thể thích hợp hơn là xóa SurfaceView (như đề xuất bởi smile2you), vì điều đó sẽ hủy hoàn toàn Surface hoàn toàn và giải phóng các tài nguyên không được sử dụng. Và chắc chắn rằng bạn đang gọi release trên MediaPlayer giây sau khi chúng được thực hiện với phát lại. Nắm giữ quá nhiều tài nguyên video sẽ làm hỏng ứng dụng của bạn.

+0

Đó là số tiền thưởng tốt nhất? Không có cách nào để xóa sạch SurfaceHolder trước video tiếp theo? –

+0

void ClearTextureView() { var cnv = _textureView.LockCanvas(); cnv.DrawColor (Android.Graphics.Color.Transparent, Android.Graphics.PorterDuff.Mode.Clear); _textureView.UnlockCanvasAndPost (cnv); } –

1

có thể bạn có thể sử dụng để loại bỏ các removeView videoview custome cũ, sau đó thêm các điểm mới

7

Đã cho tôi hai tuần để con số này ra. Bằng cách đặt bề mặt thành TRANSPARENT, Android sẽ phá hủy bề mặt. Sau đó, thiết lập nó trở lại OPAQUE tạo ra một bề mặt mới "thanh toán bù trừ" bề mặt. Lưu ý surfacecreate và surfacedestroy sự kiện sẽ cháy, vì vậy nếu bạn có mã ở đó, hãy cẩn thận. Tôi đặt một bộ tưởng tượng thành màu đen để cho nó một nền đen. Có thể có những cách tốt hơn cho điều đó.

private void playVideoA() { 
    imageViewBlack.bringToFront(); 
    surfaceHolder.setFormat(PixelFormat.TRANSPARENT); 
    surfaceHolder.setFormat(PixelFormat.OPAQUE); 
    surfaceView.bringToFront(); 
    mediaPlayerA.setDisplay(surfaceHolder); 
    //surfaceView.setAlpha((float) 0.01); 
    mediaPlayerA.start(); 
}; 
private void prepareVideoA(String url) { 
    try { 
     mediaPlayerA = new MediaPlayer(); 
     mediaPlayerA.setDataSource(url); 
     mediaPlayerA.prepareAsync(); 
     mediaPlayerA.setOnPreparedListener(this); 
     mediaPlayerA.setOnCompletionListener(this); 
     mediaPlayerA.setOnBufferingUpdateListener(this); 
     mediaPlayerA.setOnInfoListener(this); 
    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
}; 
@Override 
public void onPrepared(MediaPlayer mp) { 
    playVideoA() 
} 
+0

Tại sao không chỉ sử dụng lockCanvas trên SurfaceHolder và điền vào Bề mặt bằng màu đen thay thế? – Dave

+1

'surfaceHolder.setFormat (PixelFormat.TRANSPARENT); surfaceHolder.setFormat (PixelFormat.OPAQUE);' làm việc cho tôi. Nhưng nó thực sự làm gì ?! –

+1

@MarceloFilho cảm ơn anh chàng, làm việc tốt cho tôi – vuhung3990

2
video.getHolder().setFormat(PixelFormat.TRANSPARENT); 
video.getHolder().setFormat(PixelFormat.OPAQUE); 
video.setVideoURI(Uri.parse(temp)); 
video.setOnPreparedListener(new OnPreparedListener() { 
@Override 
public void onPrepared(MediaPlayer mp) { 
     mp.start(); 
    } 
}); 

nó làm việc cho tôi

0

surfaceview.setVisibility (View.GONE);