Uygulamam sadece Portre modunu sunar. Bir portre etkinliğinde tam ekran VideoView var. Yapmak istediğim, Manzara modunda VideoView'u (gerçek video, video oynatıcısı) 90 derece döndürmektir. Etkinliğin Lanscape modunda olmasını sağlamak bir seçenek değildir. VideoView ve canvas rotate genişletme, SurfaceView olmayan bir gerçek görünüm olarak çalışmayacaktır. VideoView ile bunu başarmanın bir yolu var mı?Bir Android Videonun Döndürülmesi Videosu
cevap
uygulamanın kalanı portre iken video manzara (ve portre) görüntülenebilir, böylece apaçık tek tek bir faaliyetin Oryantasyon ayarlayabilirsiniz. Bu konuda bir çözüm için cevabımı here bakın.
Bu harika bir fikir, ancak videoyu tam ekran yerine bir Fragmentte görüntülemek istiyorsanız çalışmayacaksınız. –
VideoView bileşimi matrisi doğru ayarlanmış ve dönme özelliği kullanıldığında bile videonun dönmesini desteklemez.
Ne yapabilirsiniz TextureView kullanmak ve nitelik dönüşünü (örneğin) = "90" ayarlamaktır. Daha sonra kareleri döndürür, ancak en boy oranı kendinizle başa çıkmanız gereken bir şeydir. böylece textureView.setScaleX ((screenHeight * 1.0f)/screenWidth) kullanabilir
<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>
yapabilmek için Çok duraksız video işlemek gerekir. Ancak lütfen hazır koddan çıkmak yerine bir örnek olarak düşünün. Bazı şeyleri yeniden adlandırdım ve diğerlerini çıkardım, soruyla bir ilişkisi yok ve bu bir şeyi kırıyor olabilir ama genel olarak bu uygulanabilir bir örnek.
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);
}
}
}
Bu yardımcı olur umarım. Bu çözümü uzun zamandır arıyordum. Hemen hemen her şeyi denedim ve bu tek yol gibi görünüyor.
- 1. Android MediaCodec API videosu çok hızlı oynar
- 2. Android uygulama geliştirmede Ön Yükleme veya Ön Tampon .mp4 videosu
- 3. Iframe videosu% 100 genişlik
- 4. youtube videonun video küçük resmi android listemde
- 5. MKOverlayView döndürülmesi gereken
- 6. Video klibin Dailymotion videosu, youtube'daki gibi videonun video kimliğinden nasıl elde edilir? youtube için
- 7. Spritekit - SKSpriteNode videosu, AVPlayer
- 8. Bir alanın DISTINCT ilk karakterinin döndürülmesi (MySQL)
- 9. HTML5 videosu: http aralığı istek başlıklarını değiştir
- 10. C++ polimorfik nesnelerin (arabirimler) döndürülmesi
- 11. doT.js [object HTMLScriptElement] öğesinin döndürülmesi
- 12. Elasticsearch'teki zaman damgası alanının döndürülmesi
- 13. Görüntü ve ses uzunluğundan itibaren FFmpeg videosu
- 14. Android'de videonun mediaPlayer'ını alın
- 15. html'de oynatma videosu
- 16. JFrame'den kayıt videosu
- 17. YouTube videosu API
- 18. HTML5 videosu kullanarak Firefox'ta MP4 dosyalarını oynatma
- 19. Youtube Videosu Görüntülemede GörülemiyorGörünüm
- 20. Libav filtreleri kullanarak bir videonun ölçeklendirilmesi hatası
- 21. youtube api videonun sonuna bir fonksiyon yükleniyor
- 22. Android'deki bir Videonun Üzerinden Görünümünü Göster
- 23. Başka bir videoda yeşil ekran videosu yayınlanıyor
- 24. WP7 uygulamasına bir youtube videosu nasıl gösterilecek?
- 25. Videonun perde değeri nasıl ayarlanır?
- 26. ASP.NET MVC - Görüntülemeye iki havuzun döndürülmesi
- 27. HTML5 videosu sonda moov atomuyla nasıl video ele alır
- 28. Web API ile anonim tiplerin döndürülmesi
- 29. Kendi sitenizde kullanmak için youtube'dan bir videonun puanını alabilir/getirebilir misiniz?
- 30. Blob Storage'dan Pürüzsüz Akış Videosu
Manzara modu neden bir seçenek değil, istediğiniz zaman nedir? – TouchBoarder