所以我扩展了VideoView的onMeasure以扩展视频以适应全屏视图.
这是如何:
public void setVideoAspect(int w,int h){
wVideo=w;
hVideo=h;
onMeasure(w, h);
}
@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if(wVideo!=0 && hVideo!=0)
setMeasuredDimension(wVideo,hVideo);
}
Run Code Online (Sandbox Code Playgroud)
我使用屏幕的显示指标(宽度,高度)调用setVideoAspect().问题是这种方法会拉伸视频以适应屏幕内部.我希望能够保持纵横比.(我有4:3的视频和3:2的屏幕尺寸.)我使用下面的代码给视图保留比率测量值:
int height = (int) (metrics.widthPixels*3/(float)4);
int width= metrics.widthPixels;
mVideoView.setVideoAspect(width,height);
Run Code Online (Sandbox Code Playgroud)
所以这可以完成这项工作,但是有一个问题:它给了我一个4:3的视频,屏幕的宽度和正确的比例,但它不会使视频居中.(它只是播放视频的底部而不是顶部和底部.)我有一个包含VideoView的相对布局,VideoView的重力设置为居中.
我正在进行活动
VideoView - 从网络服务器流式传输视频.
按钮 - 使用户进入下一个要显示的活动.
应用程序启动时,VideoView将从Web服务器播放视频.
现在假设
Total Video length is 60 Minutes
Current Video progress is 20 Minutes
Current Buffered progress 30 Minutes
Run Code Online (Sandbox Code Playgroud)
现在,当我点击上面提到的Button时,用户将进入下一个活动.
如果按下后退按钮,则从该活动开始,用户前面会显示"上一个活动"(带有VideoView和"按钮").但是当恢复时,视频的所有缓冲部分都会丢失,因此VideoView从一开始就播放视频,这真的很糟糕. < - 实际问题
问题
当Activity重新恢复时,视频的缓冲部分会丢失,因此会再次开始缓冲.那么如何克服重新缓冲视频的缓冲部分呢?
甚至官方Youtube Android应用程序.有同样的问题.
编辑1:
我在Activity中尝试了下面的代码,但它不起作用.
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
videoView.suspend();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
videoView.resume();
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以指导我这个问题吗?或者我错过了一些能使这项工作完美的东西?
目前的解决方法
我已经用onPause()方法和onResume()方法保存了视频的当前播放位置,我已经使用该位置来寻找该持续时间的视频.这很好用.但是视频缓冲从一开始就从搜索位置开始视频开始.
非常感谢任何帮助.
android video-streaming android-video-player android-videoview
我正在使用AbsoluteLayout定位VideoView(我需要在特定位置的屏幕上的几个位置显示它).
public void showVideo(RectF bounds, final String videoUrl) {
AbsoluteLayout.LayoutParams params = (AbsoluteLayout.LayoutParams) video.getLayoutParams();
params.width = (int) bounds.width();
params.height = (int) bounds.height();
params.x = (int) bounds.left;
params.y = (int) bounds.top;
video.requestLayout();
video.setVisibility(View.VISIBLE);
video.setFocusable(true);
video.setFocusableInTouchMode(true);
video.requestFocus();
File file = new File(videoUrl);
video.setVideoPath(file.getAbsolutePath());
video.start();
}
Run Code Online (Sandbox Code Playgroud)
但视频没有调整到我指定的范围.
有小费吗?
另一个相关的问题是,如何通过VideoView使MediaController显示?
我的应用程序允许用户捕获视频:
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_VIDEO_REQUEST);
Run Code Online (Sandbox Code Playgroud)
或图片:
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
Run Code Online (Sandbox Code Playgroud)
在图片的情况下,我可以判断它们是否以除横向以外的任何模式拍摄,然后在我将它们上传到网络之前旋转它们:
ExifInterface exif = new ExifInterface(fileName);
int exifOrientation = Integer.parseInt(exif.getAttribute(ExifInterface.TAG_ORIENTATION));
float rotate = 0;
switch (exifOrientation){
case ExifInterface.ORIENTATION_ROTATE_90:
rotate = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
break;
}
if(rotate > 0){
Bitmap bitmap = BitmapFactory.decodeFile(fileName);
Matrix matrix = new Matrix();
matrix.postRotate(rotate);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
OutputStream outStream = context.getContentResolver().openOutputStream(Uri.fromFile(file));
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream); …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试实施一个视频视频,该视频将显示特定位置的视频.我可以毫无问题地显示全屏视频.但是每当我试图在一个帧内显示该视频时(例如一个小矩形),我只能在该视图中显示一部分视频.我无法将视频放入该视图中.
我已经在android中查找了很多关于缩放视频的链接,但是我无法找到任何方法来做到这一点.有关该问题的任何帮助都会有所帮助.
我正在使用的是我有2个不同的课程.其中一个是我的视频活动类,另一个是帮助类:
public class VideoViewCustom extends VideoView {
private int mForceHeight = 0;
private int mForceWidth = 0;
public VideoViewCustom(Context context) {
super(context);
}
public VideoViewCustom(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public VideoViewCustom(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setDimensions(int w, int h) {
this.mForceHeight = h;
this.mForceWidth = w;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(mForceWidth, mForceHeight);
}
}
Run Code Online (Sandbox Code Playgroud)
该课程帮助我正确设置videoview的尺寸,但我无法使视频适合该区域.我的意思是我无法缩放视频以适应该区域.我不知道android是否自动缩放到给定的尺寸但我不能这样做.
我设法写了一个有限的视频播放器,能够从互联网上查看.3gp文件.视频将以全屏显示,保持视频宽高比.此外,旋转不会中断视频,从而保持播放没有问题.
一切似乎都很好,但是......当你旋转回到肖像时,我的HTC图例中,视频已损坏,而不是显示全屏,它以原始像素大小显示.但再次旋转到景观作品,并完美展现.有什么想法吗?不幸的是,我没有更多的硬件来测试它,我已经用尽了测试的想法.
您可以从https://github.com/gradha/Android-video-stream-rotation获取完整的示例源代码.以下是我打开应用程序,旋转到横向,触摸屏幕以显示视频控件,然后旋转回到肖像以查看损坏的屏幕截图.



我在片段中有一个MediaPlayer,它在配置更改时保留其实例.播放器正在播放从我的资源目录加载的视频.我设置了方案,目的是重现YouTube应用程序播放,其中音频在配置更改期间继续播放,并且显示器已分离并重新连接到媒体播放器.
当我开始播放并旋转设备时,位置会向前跳跃约6秒,并且(必要时)音频会在发生这种情况时切断.然后,播放继续正常进行.我不知道是什么导致这种情况发生.
根据要求,这是代码:
public class MainFragment extends Fragment implements SurfaceHolder.Callback, MediaController.MediaPlayerControl {
private static final String TAG = MainFragment.class.getSimpleName();
AssetFileDescriptor mVideoFd;
SurfaceView mSurfaceView;
MediaPlayer mMediaPlayer;
MediaController mMediaController;
boolean mPrepared;
boolean mShouldResumePlayback;
int mBufferingPercent;
SurfaceHolder mSurfaceHolder;
@Override
public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) {
super.onInflate(activity, attrs, savedInstanceState);
final String assetFileName = "test-video.mp4";
try {
mVideoFd = activity.getAssets().openFd(assetFileName);
} catch (IOException ioe) {
Log.e(TAG, "Can't open file " + assetFileName + "!");
}
}
@Override
public void onCreate(Bundle savedInstanceState) { …Run Code Online (Sandbox Code Playgroud) 我有一个内部布局和SurfaceTexture视频流的对话框.当我收到视频width和height视频时,我会调整我的布局:
private void resizeView(final VideoFormatInfo info) {
final Size size = calculateSize(info.getWidth(), info.getHeight());
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
final ViewGroup.LayoutParams layoutParams = mInnerLayout.getLayoutParams();
layoutParams.width = size.x;
layoutParams.height = size.y;
Log.i(TAG, String.format("run: setting innerlayout bounds to %d,%d", size.x, size.y));
mInnerLayout.setLayoutParams(layoutParams);
}
});
}
Run Code Online (Sandbox Code Playgroud)
现在我有一个全屏按钮,应该将布局调整到整个屏幕.但是当我按下它时,布局仍然在屏幕的一个小区域内.
当我检查日志中正确的值size.x和size.y是否(屏幕的边界),但布局没有正确调整大小.
innerlayout被添加到名为"VideoPlayer"的customView中.我将视频播放器背景的颜色设置为红色,因此当我切换到全屏时,整个屏幕变为红色,除了中间的视频流.这意味着底层视图正在适当调整大小,但innerLayout不是出于某种原因.
有趣的是,我在视频渲染上有另一种布局,可以创建"闪光效果"来模拟拍摄快照时的相机闪光.触发该闪光效果后,视频将调整为整个屏幕.
所以这是我的布局树:
VideoPlayerView (CustomView, not VideoView)
innerLayout (RelativeLayout)
videoSurfaceTexture (SurfaceTextureView)
flashLayout (RelativeLayout)
Run Code Online (Sandbox Code Playgroud)
我也将其设置为调试:
@Override
public void onSurfaceTextureSizeChanged(final SurfaceTexture surfaceTexture, final int width, …Run Code Online (Sandbox Code Playgroud) 我已经用谷歌搜索了很多来解决这个问题,但是在任何情况下都行不通。尝试了具有videoview 的ScrollView和Android Scrollview 内的Android :: VideoView中提到的所有操作,都出现了问题。
问题是当我将视频视图放入scrollview时不起作用,但是当删除scrollview时,它确实可以正常工作。
这是示例代码:
// xml file
<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" >
<Button
android:id="@+id/btn_video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="start" />
<ScrollView
android:id="@+id/scrl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_video" >
<VideoView
android:id="@+id/videoView_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</ScrollView>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
和Java代码,MainActivity类
package com.practice.videoviewexample;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.widget.Button;
import android.widget.VideoView;
public class MainActivity extends Activity {
private VideoView videoView_exhibit;
private Button btnVideo;
@Override
protected void …Run Code Online (Sandbox Code Playgroud)