Ứng dụng của tôi chỉ cung cấp chế độ Chân dung. Trong hoạt động dọc, tôi có một VideoView toàn màn hình. Những gì tôi muốn làm là xoay VideoView (video thực tế, videobuffer) 90 độ ở chế độ Phong cảnh. Bật hoạt động ở chế độ Lanscape không phải là một tùy chọn. Mở rộng VideoView và xoay canvas sẽ không hoạt động vì đó là SurfaceView không phải là chế độ xem thực tế. Có cách nào để đạt được điều đó với một videoView không?Xoay một VideoView android
Trả lời
Bạn có thể đặt riêng lẻ một hoạt động trong tệp kê khai, do đó video của bạn có thể được hiển thị theo chiều ngang (và dọc) trong khi phần còn lại của ứng dụng của bạn ở dạng dọc. xem câu trả lời của tôi here cho một giải pháp về điều này.
Đây là một ý tưởng tuyệt vời, nhưng sẽ không hoạt động nếu bạn muốn hiển thị video trong Phân đoạn, thay vì toàn màn hình. –
VideoView không hỗ trợ quay video ngay cả khi ma trận thành phần được đặt chính xác và thuộc tính xoay được sử dụng.
Việc bạn có thể làm là sử dụng TextureView và đặt xoay thuộc tính = "90" (ví dụ). Sau đó nó sẽ xoay các khung hình nhưng tỉ lệ khung hình là thứ bạn cần để xử lý bản thân. Để làm như vậy, bạn có thể sử dụng textureView.setScaleX ((screenHeight * 1.0f)/screenWidth)
Nó cũng phải xử lý video được truyền trực tuyến. Nhưng hãy nghĩ về nó như một ví dụ thay vì phát hành mã sẵn sàng. Tôi đổi tên một số thứ và loại bỏ những thứ khác, họ không có mối quan hệ với câu hỏi và điều này có thể phá vỡ một cái gì đó nhưng nói chung đây là ví dụ khả thi.
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);
}
}
}
Hy vọng điều này sẽ hữu ích. Tôi đã tìm kiếm giải pháp này trong một thời gian khá dài. Cố gắng gần như tất cả mọi thứ và điều này có vẻ là cách duy nhất.
- 1. Android VideoView lặp lại
- 2. Android VideoView lưu luồng RTSP
- 3. Android VideoView không chơi Portrait Hướng
- 4. Quay videobuffer thực tại Videoview
- 5. Android MediaPlayer/VideoView w/Phụ đề (SRT)
- 6. Android - Xoay màn hình xoay
- 7. Thay đổi VideoView & Toàn màn hình & Định hướng - Android
- 8. Android chân dung video định hướng sai trong VideoView
- 9. Xoay một bản vẽ trong Android
- 10. Xoay một mảng byte YUV trên Android
- 11. Đổi kích thước VideoView
- 12. Xoay hoạt ảnh android
- 13. Xoay MapView trong Android
- 14. VideoView và Progressive download
- 15. Hiển thị và ẩn nút phát qua VideoView trong Android
- 16. Android 3.1/Galaxy Tab/VideoView sẽ không phát
- 17. Android nhận đường dẫn nguồn video từ VideoView
- 18. Cách ẩn các điều khiển trong VideoView trong Android?
- 19. Android VideoView hiển thị rõ ràng sau stopPlayback()
- 20. Tránh tham nhũng Android VideoView khi quay lại ảnh chân dung
- 21. Xoay bitmap trên Android Canvas
- 22. Xoay ảnh. Danh sách hoạt ảnh hoặc xoay động? (Android)
- 23. Android emulator - Màn hình xoay
- 24. Xoay hình ảnh trong android
- 25. VideoView looping video Replenish
- 26. Gọi MediaPlayer.PrepareAsync từ VideoView
- 27. seekTo trong VideoView
- 28. Android: Xoay hình ảnh trong hình ảnh bằng một góc
- 29. Kéo dài để lấp đầy VideoView, tỷ lệ co của VideoView
- 30. Thêm VideoView vào bố cục XML
Tại sao chế độ Phong cảnh không phải là một tùy chọn, khi đây là những gì bạn muốn? – TouchBoarder