2012-06-16 4 views
5

Хочет изменить размер видео в виде поверхностиандроида как изменить размер ширины и высоты видео с учетом поверхности для медиаплеер

Я Воспроизведение видео в Media Player с помощью представления поверхностей и держателя для видео ..

// но при внедрении MediaPlayerControl на некоторых устройствах говорят, что Micromax, iball, планшет Akash дает ошибку абстрактного метода, недоступную для отслеживания отслеживания ошибок ACRA.

Теперь я хочу иметь решение указанных проблем:

  • Как получить контроль медиаплеер активного во всех устройствах wihtout сбоя из-за абстрактный метод как для контроллера медиа в некоторых устройствах.

  • Как изменить размер изображения на поверхности.

код работает f9 на Samsung Galaxy GT P1000 OS 2,2 и некоторые более дешевые устройства WorldTeck и т.д.

Но креативного ZiiO 7 версия ОС 2.2.1 (480 * 800)плотность разрешения 160 т/д. видео, кажется, увеличено и удалено с краев.

Код показан ниже:

/* 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

попробуйте [мой ответ] (http://stackoverflow.com/questions/8293909/surfaceview-height-width-gets-ignored/20798009#20798009). Пусть это поможет вам. –

ответ

1

Привет Arpit я также работал на тех же устройствах, как вы уже упоминали для воспроизведения видео файлов, я получил ту же проблему, применяя элементы управления видеоплеером (Абстрактный метод недоступен).

В соответствии с моим R & D на эту тему я пришел к выводу, что Customized Android OS и аппаратные средства из этих устройств не совместимы друг с другом, поскольку они имеют очень низкое качество по сравнению с устройствами Samsung, так много методов, хотя они находятся в ОС Android, но не поддерживаются такими устройствами.

Так что я думаю, что в таких устройствах нет решений для таких проблем.

PLZ пытается сфокусироваться с использованием стандартных устройств при разработке любого проекта. это может вам помочь.

Спасибо. :)

2

Я использовал TextureView вместо зрения поверхности (она позволяет вращать видео) и установите его setScale {X | Y}() соответствующим образом:

@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); 
    } 
} 

Обратите внимание, что я повернутой мое видео, это поэтому я установил масштаб для X.