我已经实现了使用纹理视图和媒体播放器实现的视频播放器的回收器视图。
如果我向下滚动列表,我可以单击该项目并播放视频。但是,对于回收器视图,一旦视图离开屏幕,它就会被回收以供重用。如果我向上滚动,所有视图现在都是空白(黑色)。
我希望添加功能,当用户将视频滚动到屏幕外时,它将暂停并保持对该视频的引用,以便如果他们滚动回该视频,它将从该点开始播放。
我已签这个了,但是我不想下载的视频,我只是想流。我不是在找人为我做这件事,我只是在寻找一些指示,并希望有人可以分享他们的知识......在此先感谢
这是我到目前为止所做的:
视频播放器
public class CustomVideoPlayer implements TextureView.SurfaceTextureListener, VideoControllerView.MediaPlayerControl, MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnVideoSizeChangedListener {
private Context mContext;
private String mUrl;
private MediaPlayer mMediaPlayer;
private Surface mSurface;
private VideoControllerView mControllerView;
private TextureView mTextureView;
private CardView mCardView;
private ProgressBar mProgress;
private FrameLayout mView;
private RelativeLayout mLayout;
public CustomVideoPlayer(Context ctx, TextureView view, ProgressBar progressDialog, FrameLayout holderView){
this.mContext = ctx;
mTextureView = view;
mTextureView.setSurfaceTextureListener(this);
mProgress = progressDialog;
mControllerView = new VideoControllerView(ctx);
mView = holderView;
mTextureView.setOnTouchListener(new ControlTouchListener());
}
@Override
public …Run Code Online (Sandbox Code Playgroud) android android-mediaplayer textureview android-textureview android-recyclerview
我试图简单地改变TextureView的背景颜色.我希望通过半透明相机预览可以看到这种颜色.出于某种原因,它没有.如果我从onSurfaceTextureAvailable完全删除相机预览,则视图保持白色(或无法看到).有任何想法吗?我正在尝试实现一个有时包含相机预览的TextureView框,其他时候是我选择的简单颜色.谢谢.
import android.graphics.Color;
import android.graphics.SurfaceTexture;
import android.hardware.Camera;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.Surface;
import android.view.TextureView;
import android.widget.FrameLayout;
import android.widget.RelativeLayout;
import java.io.IOException;
public class MainActivity extends Activity {
private TextureView mTextureView;
FrameLayout screenFrame;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
screenFrame = (FrameLayout)findViewById(R.id.screenFrame);
setVideoScreens();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private void setVideoScreens()
{
final …Run Code Online (Sandbox Code Playgroud) 我试图在Service中创建一个纹理视图,我似乎没有得到"onSurfaceTextureAvailable"回调."TextureView或子类只能在启用硬件加速的情况下使用." 当我为应用程序提供android:hardwareAccelerated ="true"时出现在日志中,是否有任何权限可以明确地提供给服务
package com.example.textures;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.graphics.SurfaceTexture;
import android.os.IBinder;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.TextureView;
import android.view.ViewGroup;
import android.view.TextureView.SurfaceTextureListener;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
public class FlyMaadi extends Service implements SurfaceTextureListener {
private final String TAG = "FlyMaadi";
private TextureView mTextureView;
private WindowManager mWindowManager;
private LayoutInflater minflater;
private ViewGroup mrel_layout;
private TextureView mTextureView1;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return …Run Code Online (Sandbox Code Playgroud) 我们怎样才能将像棕褐色,复古等过滤器应用到视频中,然后在我们的服务器上发布?
同样,我们可以通过在TextureView上创建过滤器层来欺骗用户,从而在服务器上应用相应的过滤器.
代码:
package com.example.mediaplayerdemo_video;
import java.io.IOException;
import android.app.Activity;
import android.content.res.AssetFileDescriptor;
import android.graphics.Matrix;
import android.graphics.SurfaceTexture;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.Surface;
import android.view.TextureView;
public class MainActivity extends Activity implements TextureView.SurfaceTextureListener {
// Log tag.
private static final String TAG = MainActivity.class.getName();
// Asset video file name.
private static final String FILE_NAME = "test.mp4";
// MediaPlayer instance to control playback of video file.
private MediaPlayer mMediaPlayer;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() …Run Code Online (Sandbox Code Playgroud) 我试图TextureView在Android上使用绘图/绘画应用程序.我想支持高达4096x4096像素的绘图表面,这对于我的最小目标设备(我用于测试)似乎是合理的,这是一款具有漂亮的四核CPU和2GB内存的Google Nexus 7 2013.
我的一个要求是我的视图必须在一个允许它放大和缩小的视图中,这是我编写的所有自定义代码(想想来自iOS的UIScrollView).
我尝试过使用TextureViewOnDraw 的常规View(不是),性能非常糟糕 - 每秒不到1帧.即使我Invalidate(rect)只用改变的矩形调用,也会发生这种情况.我尝试关闭视图的硬件加速,但没有渲染,我假设因为4096x4096对于软件来说太大了.
然后我尝试使用TextureView并且性能稍微好一点 - 大约每秒5-10帧(仍然很糟糕但更好).用户绘制一个位图,然后使用后台线程将其绘制到纹理中.我正在使用Xamarin,但希望代码对Java人员有意义.
private void RunUpdateThread()
{
try
{
TimeSpan sleep = TimeSpan.FromSeconds(1.0f / 60.0f);
while (true)
{
lock (dirtyRect)
{
if (dirtyRect.Width() > 0 && dirtyRect.Height() > 0)
{
Canvas c = LockCanvas(dirtyRect);
if (c != null)
{
c.DrawBitmap(bitmap, dirtyRect, dirtyRect, bufferPaint);
dirtyRect.Set(0, 0, 0, 0);
UnlockCanvasAndPost(c);
}
}
}
Thread.Sleep(sleep);
}
}
catch
{
}
}
Run Code Online (Sandbox Code Playgroud)
如果我将lockCanvas更改为传递null而不是rect,则性能在60 fps时很好,但TextureView闪烁的内容会被破坏,这是令人失望的.我原本以为它只是在下面使用OpenGL帧缓冲区/渲染纹理,或者至少有一个保留内容的选项.
有没有其他选择在Android中的原始OpenGL中做所有事情,以便在绘制调用之间保留的表面上进行高性能绘图和绘画?
我正在使用TextureView在ListView中播放视频.TextureView本身运行完美,但是,如果我按下主页按钮并重新输入应用程序几次,TextureView会变黑(尽管音频继续播放).如果我退出并再次重新进入,TextureView将变为白色(或者可能是透明的,因为白色是我背景的颜色).
这是我的代码:
holder.instagramTextureView
.setSurfaceTextureListener(new SurfaceTextureListener() {
@Override
public void onSurfaceTextureUpdated(
SurfaceTexture surface) {
// TODO Auto-generated method stub
}
@Override
public void onSurfaceTextureSizeChanged(
SurfaceTexture surface, int width, int height) {
// TODO Auto-generated method stub
}
@Override
public boolean onSurfaceTextureDestroyed(
SurfaceTexture surface) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onSurfaceTextureAvailable(
SurfaceTexture surface, int width, int height) {
final Surface s = new Surface(surface);
try {
holder.mMediaPlayer = new MediaPlayer();
holder.mMediaPlayer.setDataSource(post
.getMedias().get(0)
.getMediaUrlVideomp4StandardRes());
holder.mMediaPlayer.setSurface(s);
holder.mMediaPlayer.prepare();
holder.instagramVideoVolume …Run Code Online (Sandbox Code Playgroud) android android-listview onpause android-mediaplayer textureview
我正在使用 Java API 实现解码器MediaCodec来解码实时 H.264 远程流。我使用回调 ( ) 从本机层接收 H.264 编码数据,在上void OnRecvEncodedData(byte[] encodedData)进行解码和渲染。我的实现已完成(使用回调、解码和渲染等检索编码流)。这是我的解码器类:SurfaceTextureView
public class MediaCodecDecoder extends Thread implements MyFrameAvailableListener {
private static final boolean VERBOSE = true;
private static final String LOG_TAG = MediaCodecDecoder.class.getSimpleName();
private static final String VIDEO_FORMAT = "video/avc"; // h.264
private static final long mTimeoutUs = 10000l;
private MediaCodec mMediaCodec;
Surface mSurface;
volatile boolean m_bConfigured;
volatile boolean m_bRunning;
long startMs;
public MediaCodecDecoder() {
JniWrapper.SetFrameAvailableListener(this);
}
// this is my callback …Run Code Online (Sandbox Code Playgroud) 有没有一种好方法可以View在a之上绘制标准Android对象GLSurfaceView并同步两层之间的移动?
我的布局看起来像
\n<FrameLayout>\n <RelativeLayout>\n <MyCustomGLSurfaceView>\n</FrameLayout>\nRun Code Online (Sandbox Code Playgroud)\n它MyCustomGLSurfaceView实现了一个摄像头,当用户适当地触摸屏幕时,该摄像头就会移动。
在渲染器中的回调结束时,onDrawFrame()我调用回调来告诉RelativeLayout相机已移动,并且它应该根据需要更新任何子视图的位置。
为了尝试同步两个层,我正在执行以下操作:
\nrenderMode = RENDERMODE_WHEN_DIRTY范围内MyCustomGLSurfaceViewMyCustomGLSurfaceView实现Choreographer.FrameCallback并在doFrame(frameTimeNanos: Long)方法调用中requestRender()RelativeLayout根据需要更新 it\xe2\x80\x99s 子视图的位置。MyCustomGLSurfaceView看起来 AndroidView对象直到下一帧才在屏幕上更新,而 则MyCustomGLSurfaceView立即更新。其理论是,通过侦听Choreographer回调,渲染MyCustomGLSurfaceView会在应用程序重新绘制标准 UI 元素的同时进行。
这似乎工作得相当好,但 Android 对象层中存在明显的卡顿View。另外,通过设置边距来定位 Android 层中的元素View会出现一些奇怪的行为(视图在离开屏幕时会被破坏,并且并不总是重新出现,有时甚至根本停止更新)。我尝试使用它们来定位它们translationX …
我有一个基于Romain Guy的例子的TextureView,可以在这里找到.在Android 4.3和4.4上,经过几轮暂停和恢复应用程序后,应用程序崩溃,唯一的错误痕迹是LogCat中的致命信号11.我创建了一个测试应用程序,它使用Romain Guy的确切代码来查看它是否是我在代码中所做的事情,而Romain的代码也与致命信号11一起崩溃.
我已经确定,如果我使用Handler而不是Thread运行代码,它似乎不会使应用程序崩溃.Handler应该在主UI线程上运行(或者至少我相信它),这可能暗示它是一个线程问题.
我还确定在调用canvas.drawX(drawColor,drawBitmap,drawRect等等)期间发生了崩溃.锁定和解锁画布似乎不是问题.我怀疑线程正在被取消,而其他一些代码仍在使用画布,但由于缺少任何真正的异常并且崩溃相当不一致,我很难跟踪问题.
任何见解将不胜感激.
我在纹理视图中重复播放视频,其目的是显示背景视频。我需要将纹理视图的宽度和高度设置为 match_parent。
我想缩放视频,使其看起来在播放它的纹理视图上被裁剪。
我按照这个链接TextureView缩放并使用了给定的函数。
private void updateTextureViewSize(int viewWidth, int viewHeight) {
float scaleX = 1.0f;
float scaleY = 1.0f;
if (mVideoWidth > viewWidth && mVideoHeight > viewHeight) {
scaleX = mVideoWidth / viewWidth;
scaleY = mVideoHeight / viewHeight;
} else if (mVideoWidth < viewWidth && mVideoHeight < viewHeight) {
scaleY = viewWidth / mVideoWidth;
scaleX = viewHeight / mVideoHeight;
} else if (viewWidth > mVideoWidth) {
scaleY = (viewWidth / mVideoWidth) / (viewHeight / mVideoHeight);
} else if …Run Code Online (Sandbox Code Playgroud) android ×10
textureview ×10
opengl-es ×2
background ×1
drawing ×1
filter ×1
h.264 ×1
onpause ×1
performance ×1
surfaceview ×1