Mi aplicación solo ofrece el modo de retrato. En una actividad de retrato, tengo una VideoView a pantalla completa. Lo que quiero hacer es girar la VideoView (el video real, el videobuffer) 90 grados en el modo Paisaje. Permitir que la actividad esté en modo Lanscape no es una opción. Extender VideoView y girar la lona no funcionará, ya que es una vista de superficie no una vista real. ¿Hay alguna manera de lograr eso con un videoView?Girar una vista de video de Android
Respuesta
Puede establecer la oriación individual de una actividad en el manifiesto, por lo que su video se puede mostrar en horizontal (y vertical) mientras que el resto de la aplicación está en vertical. ver mi respuesta here para una solución al respecto.
Esta es una gran idea, pero no funcionará si desea mostrar el video en un Fragmento, en lugar de la pantalla completa. –
VideoView no admite la rotación de video, incluso si la matriz de composición está configurada correctamente y se utiliza el atributo de rotación.
Lo que puede hacer es usar TextureView y establecer su atributo rotation = "90" (por ejemplo). A continuación, girará los cuadros, pero la relación de aspecto es algo que necesita para manejar su auto. Con el fin de hacer lo que puede utilizar textureView.setScaleX ((* ScreenHeight 1.0f)/ScreenWidth)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextureView
android:id="@+id/playback_video"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:rotation="90" />
</RelativeLayout>
Debe manejar el vídeo streaming también. Pero piense en ello como un ejemplo en lugar de liberar el código listo. Cambié el nombre de algunas cosas y eliminé otras, no tienen relación con la pregunta y esto podría romper algo, pero en general este es un ejemplo viable.
public class PlaybackActivity extends Activity implements MediaPlayer.OnErrorListener, OnPreparedListener,
OnCompletionListener, OnVideoSizeChangedListener, OnBufferingUpdateListener, OnInfoListener,
SurfaceTextureListener
{
private MediaPlayer mediaPlayer;
private TextureView videoView;
private boolean startedPlayback = false;
private boolean playerReady = false;
public static final int MEDIA_INFO_NETWORK_BANDWIDTH = 703;
private void createMediaPlayer() {
mediaPlayer = new MediaPlayer();
}
private void releaseMediaPlayer() {
if (mediaPlayer != null) {
mediaPlayer.setSurface(null);
mediaPlayer.release();
mediaPlayer = null;
}
}
public void onCompletion(MediaPlayer mp) {
Log.w(TAG, "Video playback finished");
}
@Override
public boolean onError(MediaPlayer player, int what, int extra) {
if (what == MediaPlayer.MEDIA_ERROR_UNKNOWN) {
/*
* Restart play back in case we did not start anything yet. This may
* be the case when we tried to tune in in very first secs of the
* broadcast when there is no data yet.
*/
if (liveBroadcast && mediaPlayer != null && !mediaPlayer.isPlaying() && !startedPlayback) {
if (checkCount-- > 0) {
mediaPlayer.reset();
checkBroadcast();
} else {
Log.w(TAG, "Broadcast finished");
}
} else {
Log.w(TAG, "No media in stream");
}
} else if (what == MediaPlayer.MEDIA_ERROR_SERVER_DIED) {
Log.w(TAG, "Media service died unexpectedly");
} else {
Log.w(TAG, "Unknown media error");
}
return true;
}
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
switch (what) {
case MediaPlayer.MEDIA_INFO_VIDEO_TRACK_LAGGING:
Log.w(TAG, "Media is too complex to decode it fast enough.");
startedPlayback = true;
break;
case MEDIA_INFO_NETWORK_BANDWIDTH:
Log.w(TAG, "Bandwith in recent past.");
break;
case MediaPlayer.MEDIA_INFO_BUFFERING_START:
Log.w(TAG, "Start of media bufferring.");
startedPlayback = true;
break;
case MediaPlayer.MEDIA_INFO_BUFFERING_END:
Log.w(TAG, "End of media bufferring.");
startedPlayback = true;
break;
case MediaPlayer.MEDIA_INFO_BAD_INTERLEAVING:
Log.w(TAG, "Media is not properly interleaved.");
break;
case MediaPlayer.MEDIA_INFO_NOT_SEEKABLE:
Log.w(TAG, "Stream is not seekable.");
break;
case MediaPlayer.MEDIA_INFO_METADATA_UPDATE:
Log.w(TAG, "New set of metadata is available.");
break;
case MediaPlayer.MEDIA_INFO_UNKNOWN:
default:
Log.w(TAG, "Unknown playback info (" + what + ":" + extra + ").");
break;
}
return true;
}
private void startPlayback() {
if (mediaPlayer != null) {
onLoaded(mediaPlayer);
mediaPlayer.start();
}
}
private void pausePlayback() {
if (mediaPlayer != null && mediaPlayer.isPlaying())
mediaPlayer.pause();
}
private void resumePlayback() {
if (mediaPlayer != null && mediaPlayer.isPlaying())
mediaPlayer.start();
}
private void onLoaded(MediaPlayer mp) {
}
public void onPrepared(MediaPlayer mp) {
playerReady = true;
startPlayback();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.playback);
videoView = (TextureView) findViewById(R.id.playback_video);
videoView.setOnClickListener(videoViewClickHandler);
videoView.setSurfaceTextureListener(this);
createMediaPlayer();
}
@Override
protected void onDestroy() {
releaseMediaPlayer();
if (surface != null) {
surface.release();
surface = null;
}
super.onDestroy();
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
this.surface = new Surface(surface);
loadMedia(someurl);
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
if (this.surface != null) {
releaseMediaPlayer();
this.surface.release();
this.surface = null;
}
return true;
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
@Override
public void onVideoSizeChanged(MediaPlayer mp, int w, int h) {
if (w > 0 && h > 0 && !videoSizeSetupDone) {
Log.w(TAG, "Video size changed: " + w + "x" + h);
changeVideoSize(w, h);
}
}
private boolean videoSizeSetupDone = false;
private void changeVideoSize(int width, int height) {
DisplayMetrics metrics = new DisplayMetrics();
RelativeLayout.LayoutParams params;
Utils.getScreenMetrics(this, metrics);
VideoOrientation orientation = someVideoSource.getVideoOrientation();
if (orientation == LANDSCAPE) {
params = new RelativeLayout.LayoutParams(metrics.widthPixels, metrics.heightPixels);
} else {
float rotation = orientation == BroadcastVideoOrientation.BroadcastVideoFrontCamera ? -90.0f : 90.0f;
params = new RelativeLayout.LayoutParams(metrics.heightPixels, metrics.widthPixels);
float scale = (width * 1.0f)/(height * 1.0f);
videoView.setRotation(rotation);
videoView.setScaleX(scale);
}
params.addRule(RelativeLayout.CENTER_IN_PARENT, -1);
videoView.setLayoutParams(params);
videoSizeSetupDone = true;
}
private void loadMedia(String url) {
if (surface == null)
return;
Log.d(App.TAG, "Loading url: " + url);
startedPlayback = false;
try {
mediaPlayer.reset();
mediaPlayer.setSurface(surface);
mediaPlayer.setDataSource(url);
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.setOnCompletionListener(this);
mediaPlayer.setOnErrorListener(this);
mediaPlayer.setOnVideoSizeChangedListener(this);
mediaPlayer.setScreenOnWhilePlaying(true);
mediaPlayer.setOnBufferingUpdateListener(this);
mediaPlayer.setOnInfoListener(this);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.prepareAsync();
} catch (Exception e) {
Log.w(TAG, "Media load failed");
Utils.alert(this, "Playback Error", e.getMessage(), finishHandler);
}
}
}
Espero que esto ayude. Estaba buscando esta solución por bastante tiempo. Intenté casi todo y esta parece ser la única forma.
- 1. Girar vista de anuncio con API 8
- 2. cámara Android girar
- 3. ¿Cómo crear una vista previa de video en Android?
- 4. ¿Cómo dejar girar una vista para siempre?
- 5. Android Animate Girar
- 6. Android - Pantalla de fragmento girar
- 7. Girar imagen en android
- 8. Problema de vista de video en android 4.0 y superior
- 9. ¿La vista web de android admite reproducción de video html5?
- 10. ¿Cómo puedo ver un video dentro de una vista de video en una posición específica?
- 11. Grabación de video sin previa vista
- 12. Girar un dibujo en Android
- 13. iPhone/iPad Pan, pellizcar y girar una vista simultáneamente
- 14. Borde blanco molesto al girar una vista en iPad
- 15. Android Girar imagen antes de guardar
- 16. Girar mapa de bits en Android Canvas
- 17. Android: Vista de video: cómo reproducir un video en un bucle
- 18. cómo obtener la duración total del video en la vista de video en android
- 19. Girar CÁMARA SIN PROCESAR (no solo el video) en el aire para Android
- 20. una vista de texto en Android
- 21. cómo obtener una miniatura de video de youtube video en la lista de android en android
- 22. girar una AVAsset con AVAssetExportSession
- 23. ¿Android admite escalar video?
- 24. Girar una UITableViewCell personalizada
- 25. IOS: girar una UIImageView
- 26. Actualizar una vista Android
- 27. Android: Creación de miniaturas de video desde URI de video
- 28. Girar una imagen en Android sin OutOfMemoryError o downscaling
- 29. Evite la corrupción de Android VideoView al girar de nuevo al retrato
- 30. Procesamiento de video en Android
¿Por qué el modo Paisaje no es una opción, cuando esto es lo que quiere? – TouchBoarder