我想知道在流媒体视频方面它们之间是否存在差异.
我知道VideoView可以用于流媒体和什么是Mediaplayer?据我所知,MediaPlayer可以做同样的事情VideoView吗?
任何人都可以给我答案吗?
如果我想通过使用RTSP到服务器从服务器流式传输视频,我应该从哪个开始?VideoView还是MediaPlayer?
有什么建议吗?
我有以下代码将视频作为原始资源,启动视频并循环它,但我需要视频无缝循环,截至现在当它到达剪辑结束并再次启动剪辑时之间的过渡导致闪烁一瞬间,我真的不能为我的应用程序.
public class Example extends Activity {
VideoView vv;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
vv = (VideoView)findViewById(R.id.VideoView01);
//Video Loop
vv.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
vv.start(); //need to make transition seamless.
}
});
Uri uri = Uri.parse("android.resource://com.example/"
+ R.raw.video);
vv.setVideoURI(uri);
vv.requestFocus();
vv.start();
}
}
Run Code Online (Sandbox Code Playgroud)
该剪辑只有22秒长,但创建为无缝,因此可以毫无延迟地工作.
我有两个不同的视频,我正在尝试加载到VideoView使用中
videoView.setVideoURI(Uri.parse(url));
Run Code Online (Sandbox Code Playgroud)
这两个视频,即视频1和视频2,具有以下规格(使用提取ffmpeg -i); 实际上,它们是同一视频的两种不同编码:
视频1:
Seems stream 0 codec frame rate differs from container frame rate: 180000.00 (180000/1) -> 90000.00 (180000/2)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '4fbfd5ece4b0932236fc234d.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: mp42isomavc1
creation_time : 2011-12-03 04:43:46
genre : Trailer
artist : Paramount Pictures
title : Captain America: The First Avenger - Theatrical Trailer #2
encoder : HandBrake 4344svn 2011111001
date : 2011
Duration: 00:02:30.67, start: 0.000000, bitrate: 6738 …Run Code Online (Sandbox Code Playgroud)我写了这些代码行:
mVideoView = (VideoView) findViewById(R.id.video_view);
mVideoView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.v("LOG_TAG, click");
}
});
Run Code Online (Sandbox Code Playgroud)
但是,当我运行我的应用程序时,从不调用click事件.
所以我想知道,在VideoView上注册OnClickListener是不可能的?如果是这样,为什么会这样呢?
我VideoView在我的活动中创建了一个,下面是代码.
VideoView vvVideos = (VideoView) rootView.findViewById(R.id.videoView);
MediaController mediacontroller = new MediaController(ctx);
mediacontroller.setAnchorView(vvVideos);
Uri video = Uri.parse("android.resource://" + packageName +"/"+R.raw.sample);
vvVideos.setMediaController(mediacontroller);
LayoutParams params=vvVideos.getLayoutParams();
params.height=150;
vvVideos.setLayoutParams(params);
vvVideos.setVideoURI(video);
vvVideos.requestFocus();
vvVideos.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
vvVideos.start();
}
});
Run Code Online (Sandbox Code Playgroud)
现在,视频在创建活动时开始播放.我想让我的活动如下
在运行start()方法之前,我一直在寻找摆脱VideoView上令人讨厌的黑色初始屏幕的方法.
我已尝试在窗口小部件上使用背景图像,但它根本无法正常工作.我还尝试在视频顶部的视频中放置第一帧的图像,并将其隐藏在stars()方法之后.添加onPrepared侦听器以启动视频,然后隐藏图像.这有效,但过渡中有一个可怕的闪烁,我不知道如何摆脱它.
感谢您的回复.添加MediaController根本没有任何效果.问题仍然存在(我仍然看到黑色闪烁),我不想让视频控件可见.我的代码看起来像这样:
VideoView vSurface= (VideoView) findViewById(R.id.surfaceView1);
vSurface.setVideoURI(Uri.parse("android.resource://com.mypackage/" + R.raw.video1));
vSurface.setVisibility(View.VISIBLE);
vSurface.setOnPreparedListener(this);
vSurface.setDrawingCacheEnabled(true);
vSurface.setOnErrorListener(this);
Run Code Online (Sandbox Code Playgroud) 所以我扩展了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的重力设置为居中.
我正在尝试复制Android市场中最新YouTube应用的功能.观看视频时,有两个独立的布局,一个是纵向提供额外的信息,一个是横向,提供视频的全屏视图.

YouTupe应用程序处于纵向模式

横向模式的YouTube应用
(抱歉照片的随机性,但它们是我能找到的第一个实际布局照片)
这通常很容易做到 - 只需在layout-land中指定一个替代布局,一切都会很好.YouTube应用程序的功能非常好(以及我想要复制的内容)是在方向更改时,视频会继续播放,而不必从头开始重新缓冲.
我已经发现,覆盖onConfigurationChange()并设置新的LayoutParameters将允许我在不强制拒绝的情况下调整视频大小 - 但是当多次旋转屏幕时,视频会随机缩放到不同的宽度/高度.我已尝试在VideoView上进行各种invalidate()调用,尝试在父RelativeLayout容器上调用RequestLayout()并尝试尽可能多的不同内容,但我似乎无法让它正常工作.任何建议将不胜感激!
这是我的代码:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
questionText.setVisibility(View.GONE);
respond.setVisibility(View.GONE);
questionVideo.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
} else {
questionText.setVisibility(View.VISIBLE);
respond.setVisibility(View.VISIBLE);
Resources r = getResources();
int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150.0f, r.getDisplayMetrics());
questionVideo.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, height));
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我在logcat中发现了一些有趣的输出,当我的视频旋转时出现这似乎是罪魁祸首 - 虽然我不知道如何解决它:
正确调整大小时的Logcat输出(占用整个窗口)
注意h = 726
12-13 15:37:35.468 1262 1270 I ActivityManager: Config changed: { scale=1.0 imsi=310/4 loc=en_US touch=3 keys=1/1/2 nav=1/1 orien=2 layout=34 uiMode=17 seq=210}
12-13 15:37:35.561 1262 1268 I …Run Code Online (Sandbox Code Playgroud) 我对VideoView如何用于播放视频感到困惑:从本地文件,渐进式下载和流式传输.
这个例子适用于我(至少1.5和2.0),下载文件并在本地播放.
但是在播放之前是否有必要下载视频:是否可以通过使用setVideoPath或setVideoURI来播放视频作为渐进式下载或流式传输,如API示例中的VideoViewDemo?
VideoViewDemo代码建议使用setVideoURI进行流式传输,但我不清楚我应该使用哪种URL.有人拥有可以使用VideoViewDemo代码流式传输到Android模拟器的视频的示例网址吗?
可以使用渐进式下载与VideoViewDemo一起使用吗?我得到一个'抱歉,这个视频无法播放'消息使用setVideoPath,网址与上面链接的博客示例一起使用.(这是模拟器中的问题吗?我试过1.5和2.0.)
我在网上找到了很多例子和文档,但到目前为止,还没有真正回答这个问题.
我是android开发的初学者,尝试从链接播放视频.但它给出了错误"sorry,we can't play this video".我尝试了很多链接但是对于所有链接它显示相同的错误.
我的代码如下
public class VideoDemo extends Activity {
private static final String path ="http://demo.digi-corp.com/S2LWebservice/Resources/SampleVideo.mp4";
private VideoView video;
private MediaController ctlr;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
getWindow().setFormat(PixelFormat.TRANSLUCENT);
setContentView(R.layout.videoview);
video = (VideoView) findViewById(R.id.video);
video.setVideoPath(path);
ctlr = new MediaController(this);
ctlr.setMediaPlayer(video);
video.setMediaController(ctlr);
video.requestFocus();
}
}
Run Code Online (Sandbox Code Playgroud)
Logcat显示以下错误消息:
04-12 15:04:54.245: ERROR/PlayerDriver(554): HandleErrorEvent: PVMFErrTimeout
Run Code Online (Sandbox Code Playgroud)