2012-06-16 24 views
5

Muốn thay đổi kích thước video theo quan điểm của bề mặtandroid làm thế nào để thay đổi kích thước chiều rộng video và chiều cao theo quan điểm của bề mặt cho media player

Tôi Chơi một video trong Media Player với việc sử dụng một cái nhìn bề mặt và giữ cho video ..

// nhưng khi triển khai MediaPlayerControl trên một số thiết bị nói Micromax, iball, máy tính bảng Akash, nó cung cấp lỗi phương pháp trừu tượng không có sẵn như theo dõi bởi theo dõi lỗi ACRA.

Bây giờ tôi muốn có giải pháp của các vấn đề được đề cập:

  • Làm thế nào để có được điều khiển media player tích cực trong tất cả các thiết bị wihtout đâm do phương pháp trừu tượng như đối với bộ điều khiển phương tiện truyền thông ở một số thiết bị.

  • Làm cách nào để thay đổi kích thước chế độ xem bề mặt của video.

Mã này được f9 làm việc trên samsung galaxy OS gt P1000 2.2 và một số thiết bị rẻ hơn WorldTeck, vv

Nhưng trên ziio Creative 7 phiên bản hệ điều hành là 2.2.1 (480 * 800) Mật độ phân giải là 160 dpi video có vẻ đã được thu nhỏ và bị cắt ra khỏi các cạnh.

Mã này được hiển thị dưới đây:

/* Media Player Control is commented due to force close in some devices say *micromax,Creative ziio, akash etc */ 

    public class VideoViewerActivity extends Activity implements 
      OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener, 
      OnVideoSizeChangedListener, SurfaceHolder.Callback { 
     // implements ERROR in some devices , MediaPlayerControl 
     private static final String TAG = "MediaPlayerDemo"; 
     private int mVideoWidth; 
     private int mVideoHeight; 
     private MediaPlayer mMediaPlayer; 
     private SurfaceView mPreview; 
     private SurfaceHolder holder; 
     private String path = ""; 
     private Bundle extras; 
     private static final String MEDIA = "media"; 
     private static final int LOCAL_AUDIO = 1; 
     private static final int STREAM_AUDIO = 2; 
     private static final int RESOURCES_AUDIO = 3; 
     private static final int LOCAL_VIDEO = 4; 
     private static final int STREAM_VIDEO = 5; 
     private boolean mIsVideoSizeKnown = false; 
     private boolean mIsVideoReadyToBePlayed = false; 
     /* ERROR In Abstract method implementation in the other devices */ 
     // private MediaController mediaController; 
     private Context context; 
     private final Handler handler = new Handler(); 

     /** 
     * 
     * Called when the activity is first created. 
     */ 
     @Override 
     public void onCreate(Bundle icicle) { 
      super.onCreate(icicle); 
      setContentView(R.layout.video_layout); 
      context = this; 
      path = getIntent().getExtras().getString("media"); 

      Log.v("arpit", "path " + path); 
      mPreview = (SurfaceView) findViewById(R.id.surfaceview1); 
      holder = mPreview.getHolder(); 
      holder.addCallback(this); 
      holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
      extras = getIntent().getExtras(); 

     } 

     private void playVideo() { 
      doCleanUp(); 
      try { 

       // Create a new media player and set the listeners 
       File f = new File(path); 
       // FileInputStream in = new FileInputStream(f); 

       RandomAccessFile randomAccessFile = new RandomAccessFile(f, "r"); 
       // randomAccessFile.skipBytes(1024); 
       FileDescriptor fileDescriptor = randomAccessFile.getFD(); 

       mMediaPlayer = new MediaPlayer(); 
       mMediaPlayer.setDataSource(fileDescriptor, Constant.key1.length 
         + Data.deviceID.length(), f.length()); 

       mMediaPlayer.setDisplay(holder); 
       mMediaPlayer.prepare(); 
       mMediaPlayer.setOnBufferingUpdateListener(this); 
       mMediaPlayer.setOnCompletionListener(this); 
       mMediaPlayer.setOnPreparedListener(this); 
       mMediaPlayer.setOnVideoSizeChangedListener(this); 
       mMediaPlayer.setScreenOnWhilePlaying(true); 

       // mediaController = new MediaController(this); 
       mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

      } catch (Exception e) { 
       Log.e(TAG, "error: " + e.getMessage(), e); 
       Toast.makeText(context, "supported video was not found", 
         Toast.LENGTH_SHORT).show(); 
       finish(); 
      } 
     } 

     public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { 
      Log.v(TAG, "onVideoSizeChanged called"); 
      if (width == 0 || height == 0) { 
       Log.e(TAG, "invalid video width(" + width + ") or height(" + height 
         + ")"); 
       return; 
      } 
      mIsVideoSizeKnown = true; 
      mVideoWidth = width; 
      mVideoHeight = height; 
      if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) { 
       startVideoPlayback(); 
      } 
     } 


     public void surfaceDestroyed(SurfaceHolder surfaceholder) { 
      Log.d(TAG, "surfaceDestroyed called"); 
     } 

     public void surfaceCreated(SurfaceHolder holder) { 
      Log.d(TAG, "surfaceCreated called"); 
      playVideo(); 

     } 

     private void doCleanUp() { 
      mVideoWidth = 0; 
      mVideoHeight = 0; 
      mIsVideoReadyToBePlayed = false; 
      mIsVideoSizeKnown = false; 
     } 

     private void startVideoPlayback() { 
      Log.v(TAG, "startVideoPlayback"); 
//also tried and used the below line but nothing good 


// holder.setFixedSize(480, 800); 

holder.setFixedSize(mVideoWidth, mVideoHeight); 

mMediaPlayer.start(); 

     } 


    } 
+0

thử [câu trả lời của tôi] (http://stackoverflow.com/questions/8293909/surfaceview-height-width-gets-ignored/20798009#20798009) .Điều này sẽ giúp bạn. –

Trả lời

1

Hi arpit tôi cũng đã làm việc trên các thiết bị tương tự như bạn đã đề cập để chơi các file video, tôi để có cùng một vấn đề trong khi áp dụng các điều khiển để chơi video (Phương thức trừu tượng không khả dụng).

Theo R & D về chủ đề này tôi đi đến kết luận rằng hệ điều hành Android tùy chỉnh và phần cứng của các thiết bị này không tương thích với nhau vì chúng có chất lượng kém so với các thiết bị Samsung, các phương thức mặc dù chúng nằm trong hệ điều hành Android nhưng không được các thiết bị như vậy hỗ trợ.

Vì vậy, tôi nghĩ rằng không có giải pháp cho các vấn đề như vậy, trong các thiết bị này.

plz cố gắng tập trung sử dụng thiết bị chuẩn trong khi phát triển bất kỳ dự án nào. điều này có thể giúp bạn rất nhiều.

Cảm ơn. :)

2

tôi đã sử dụng TextureView thay vì nhìn bề mặt (nó cho phép để xoay video) và thiết lập setScale của nó {X | Y}() một cách thích hợp trong:

@Override 
public void onVideoSizeChanged(MediaPlayer mp, int w, int h) { 
    if (w > 0 && h > 0) { 
     RelativeLayout.LayoutParams l; 
     DisplayMetrics metrics = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(metrics); 
     l = new RelativeLayout.LayoutParams(metrics.heightPixels, metrics.widthPixels); 
     l.addRule(RelativeLayout.CENTER_IN_PARENT, -1); 
     float scale = (metrics.heightPixels * 1.0f)/(metrics.widthPixels * 1.0f); 
     videoView.setScaleX(scale); 
     videoView.setLayoutParams(l); 
     Log.d(YourApp.TAG, "video size: " + mp.getVideoWidth() + "x" + mp.getVideoHeight() + " vertical scale: " + scale); 
    } 
} 

Lưu ý rằng tôi đã quay video của tôi, điều này là lý do tôi đặt tỷ lệ cho X.