Воспроизведение видео с использованием класса MediaPlayer
Я пытаюсь использовать класс MediaPlayer
для воспроизведения видеофайла. Проблема в том, что видео не отображается вообще, хотя я могу слышать звук в воспроизведении видео.
Ниже приведен код действия
public class MainActivity extends Activity implements OnClickListener {
private SurfaceView surfaceView;
private Button btnPlay;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
addListener();
}
private void init() {
// TODO Auto-generated method stub
surfaceView = (SurfaceView) findViewById(R.id.surfaceView1);
btnPlay = (Button) findViewById(R.id.btnPlay);
}
private void addListener() {
// TODO Auto-generated method stub
btnPlay.setOnClickListener(this);
}
MediaPlayer mediaPlayer = null;
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btnPlay:
try{
if (mediaPlayer != null) {
mediaPlayer.reset();
mediaPlayer.release();
}else{
getWindow().setFormat(PixelFormat.UNKNOWN);
MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.wildlife);
SurfaceHolder surfaceHolder = surfaceView.getHolder();
surfaceHolder.setFixedSize(176, 144);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mediaPlayer.setDisplay(surfaceHolder);
mediaPlayer.start();}
}catch (Exception e) {
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
}
break;
default:
break;
}
}
}
Ниже приведен код макета xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<SurfaceView
android:id="@+id/surfaceView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true" />
<Button
android:id="@+id/btnPlay"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/surfaceView1"
android:layout_alignTop="@+id/surfaceView1"
android:text="@string/play" />
</RelativeLayout>
Скажите, пожалуйста, что нужно сделать?
Спасибо заранее.
Ответы
Ответ 1
установить поверхность Просмотр высоты и ширины для заполнения родительского элемента в XML файле.
<SurfaceView
android:id="@+id/surfaceView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true" />
Ответ 2
Настройка размера SurfaceView на wrap_content не приведет к тому, что видео будет воспроизводиться с соответствующим соотношением сторон.
Вы можете ссылаться на эту ссылку ответа
fooobar.com/questions/169898/...
А также этот блог Воспроизведение медиафайлов на поверхности с помощью android.media.MediaPlayer
Ответ 3
Ну, я не знаю, нужна ли вам конкретная ситуация, но вы уже пробовали FullscreenVideoView?
Он пытается абстрагировать все эти проблемы SurfaceView, и вы можете сфокусироваться только на кнопках пользовательского интерфейса. Поскольку он открыт, вы можете подклассифицировать FullscreenVideoView и настроить по мере необходимости.
Ответ 4
Вы можете переопределить onSizeChanged()
класса SurfaceView
чтобы получить и установить размер представления.
protected void onSizeChanged (int w, int h, int oldw, int oldh)
Когда когда-либо размер экрана изменился, этот класс называется.
В качестве второй альтернативы вы можете установить размер, задав параметры макета (не уверены, работает ли это с ScrollView):
@Override
public void surfaceCreated(SurfaceHolder holder) {
android.view.ViewGroup.LayoutParams lp = this.getLayoutParams();
lp.width = 1000; // required width
lp.height = 1000; // required height
this.setLayoutParams(lp);
}