是否可以在两个进程之间共享SurfaceTexture,例如Activity和Service?
我想用TextureView创建一个Activity,并从一个单独的Service更新它的SurfaceTexture.
到目前为止,我正在创建一个带有生成的OpenGL纹理的SurfaceTexture(通过glGenTextures),然后我将这个表面纹理设置为我的TextureView:
mSurfaceTexture = new SurfaceTexture(texture_id);
mTextureView.setSurfaceTexture(mSurfaceTexture);
Run Code Online (Sandbox Code Playgroud)
在活动上显示此SurfaceTexture的相机预览正常工作:
mCamera = Camera.open();
mCamera.setPreviewTexture(mTextureView.getSurfaceTexture());
mCamera.startPreview();
Run Code Online (Sandbox Code Playgroud)
我想做同样的事情,但是从一个单独的服务,将texture_id传递给它,类似于:
mCamera = Camera.open();
mCamera.setPreviewTexture(new SurfaceTexture(texture_id));
mCamera.startPreview();
Run Code Online (Sandbox Code Playgroud)
原因是我有一个单独的进程调用私有api,需要SurfaceTexture来传输一些内容,并且可以通过应用程序中的aidl访问此进程.
谢谢
我无法通过setAlpha方法更改TextureView的透明度,以将其半透明地掩盖,因为它是由android SDK承诺的.例如,mTextureView.setAlpha(0.5f)没有任何效果.
我在Nexus 5上运行的Grafika MediaCodec示例代码中执行了一些简单的MoviePlayer.java计时.我在这些位置放了一个日志语句:
在前一行的203行
decoder.queueInputBuffer
Run Code Online (Sandbox Code Playgroud)
在第244行之后
decoder.dequeueOutputBuffer
Run Code Online (Sandbox Code Playgroud)
我使用了日志语句presentationTimeUs.
以下是logcat的摘录:
01-29 10:56:43.295: I/Grafika(21286): queueInputBuffer index/pts, 2,0
01-29 10:56:43.305: I/Grafika(21286): queueInputBuffer index/pts, 0,33100
01-29 10:56:43.315: I/Grafika(21286): queueInputBuffer index/pts, 3,66466
01-29 10:56:43.325: I/Grafika(21286): queueInputBuffer index/pts, 1,99833
01-29 10:56:43.325: I/Grafika(21286): queueInputBuffer index/pts, 2,133200
01-29 10:56:43.335: I/Grafika(21286): queueInputBuffer index/pts, 0,166566
01-29 10:56:43.345: I/ATSParser(21286): discontinuity on stream pid 0x1011
01-29 10:56:43.345: I/ATSParser(21286): discontinuity on stream pid 0x1100
01-29 10:56:43.345: I/Grafika(21286): queueInputBuffer index/pts, 3,199933
01-29 10:56:43.345: I/Grafika(21286): dequeueOutputBuffer index/pts, 7,0
01-29 10:56:43.345: …Run Code Online (Sandbox Code Playgroud) 我有一个MediaPlayer渲染视频TextureView.这很有效.
现在,我希望在TextureView给定时间MediaPlayer内在此上显示静止图像,然后将视频呈现为相同TextureView.
这是我渲染位图的代码:
Canvas canvas = mTextureView.lockCanvas();
canvas.drawBitmap(sourceBitmap, matrix, new Paint());
mTextureView.unlockCanvasAndPost(canvas);
Run Code Online (Sandbox Code Playgroud)
在此之后,任何播放视频的尝试都会导致ERROR_INVALID_OPERATION(-38)从视频播放器触发.
我试着评论出来的电话drawBitmap,但错误仍然发生了.如此看来,中调用简单的动作lockCanvas,然后unlockCanvasAndPost在结果TextureView是不适合MediaPlayer使用.
有什么方法可以将其重置为TextureView允许MediaPlayer使用它的状态吗?
我正在研究Android 4.2.2.
我已经搜索,阅读并尝试了许多关于如何将值传递给GLSL程序的不同示例.但遗憾的是每一次尝试都失败了:(
我打算做的很简单:在我的Android应用程序中只需要一个小小的开放式3D动画.由于我的GUI设计,我更喜欢使用TextureView作为OpenGl Surface.我找到了一些适合我项目的代码.
但我的问题似乎完全在这个例子中.
当我编译并运行它时,它确实完成了它应该做的事情.在屏幕上绘制一个三角形.
然后我像这样修改了顶点着色器:
final String vertexShaderSource =
"attribute vec4 position;\n" +
"attribute float myValue;\n" +
"void main () {\n" +
"vec4 oo;\n"+
"oo[0] = position[0];\n"+
"oo[1] = position[1] * myValue;\n"+
"oo[2] = position[2];\n"+
"oo[3] = position[3];\n"+
"gl_Position = oo;\n" +
"}";
Run Code Online (Sandbox Code Playgroud)
现在,我想将值传递给属性myValue.
所以这是我对run方法的修改.
public void run() {
initGL();
int attribPosition = GLES20.glGetAttribLocation(mProgram,
"position");
checkGlError();
int valuePosition = GLES20.glGetAttribLocation(mProgram,
"myValue");
checkGlError();
System.out.println("att id:"+ attribPosition
+ " val id:" + valuePosition);
//[...]
while (true) { …Run Code Online (Sandbox Code Playgroud) 我正在尝试将实时效果应用于相机预览并在多个视图中显示,我该怎么办?
(就像相机2)(快照)
如果左侧没有ScrollView,我知道有两种方法可以显示相机预设的实时效果.
但是,我不知道如何使ScrollView与实时效果项叠加GLES组合.
在谷歌搜索和阅读漂亮的图形架构文章和Grafika项目后,我仍然不知道......
也许我想念一些重要的事情,有人指出我了吗?提前致谢.
我是第一次使用 Camera X,但找不到方法来检查设备在运行时是否有前置或后置摄像头...
我只需要使用预览,我不捕获图像,所以我不能使用按钮。
private var lensFacing = CameraX.LensFacing.FRONT
val viewFinderConfig = PreviewConfig.Builder().apply {
setLensFacing(lensFacing)
setTargetAspectRatio(screenAspectRatio)
setTargetRotation(viewFinder.display.rotation)
}.build()
Run Code Online (Sandbox Code Playgroud)
如果用户设备没有前置摄像头,如何确保应用程序不会崩溃?提前致谢!
我有一个显示位图(占位符图像)的TextureView,当用户加载视频时,textureView应该显示视频.
我设法在纹理视图中播放视频并在纹理视图中显示位图,但是当按顺序完成时,我只得到一个黑屏.
在我的onSurfaceTextureAvailable方法中,我在表面视图上绘制一个位图,如下所示:
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.ic_add_clip);
Canvas canvas = lockCanvas();
canvas.drawBitmap(bm, (width/2)-(bm.getWidth()/2), (height/2)-(bm.getHeight()/2), null);
unlockCanvasAndPost(canvas);
}
Run Code Online (Sandbox Code Playgroud)
当用户从其库中选择视频时,我将Uri加载到媒体播放器中并将曲面设置为媒体播放器.但是仍然显示位图.我试图通过清除画布删除位图,它确实删除了位图,但纹理视图只是黑色,也不会显示视频.
public void setMediaPlayer(MediaPlayer mediaPlayer) {
// Canvas canvas = lockCanvas();
// canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
// unlockCanvasAndPost(canvas);
Surface s = new Surface(getSurfaceTexture());
mMediaPlayer = mediaPlayer;
mMediaPlayer.setSurface(s);
mMediaPlayer.setOnPreparedListener(this);
}
Run Code Online (Sandbox Code Playgroud)
有些东西告诉我,用于显示视频的表面视图位于我在TextureAvailble上绘制的位图的后面.当我尝试清除画布时,我也清除了媒体播放器想要使用的表面.有解决方案吗
我知道在ICS之后出现了TextureView.但是,ICS并未弃用SurfaceView.
SurfaceView具有穿孔结构,因此它有许多限制点.无法堆叠两个SurfaceView而无法翻译等.
尽管出现了TextureView,为什么不推荐使用SurfaceView?
Iam试图使用纹理视图渲染视频动画,动画效果很好,但是当我将纹理缩放到不同大小时,媒体播放器不会缩放以适应纹理的大小,视频总是在后台播放全屏我只能看到视频的一部分,当我缩放纹理
我的代码在运行Android 4.0的一些Android设备上工作正常,但不适用于更高版本的Android设备.继承我的动画代码,请告诉我问题出在哪里..
public class MainActivity extends Activity implements TextureView.SurfaceTextureListener{
AnimationSet animset;
TextureView myTexture;
MediaPlayer mMediaPlayer;
Surface s;
int height;
static final String LogFileName = "Log";
int width;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myTexture = new TextureView(this);
myTexture.setSurfaceTextureListener(this);
setContentView(myTexture);
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture arg0, int arg1,
int arg2) {
String mediaStorageDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
s = new Surface(arg0);
try {
mMediaPlayer= new MediaPlayer();
mMediaPlayer.setSurface(s);
mMediaPlayer.setDataSource(mediaStorageDir+"/AirIndia.mp4");
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.prepareAsync();
mMediaPlayer.setLooping(true);
mMediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mMediaPlayer.start(); …Run Code Online (Sandbox Code Playgroud) 我正在使用带有 MediaPlayer 的 TextureView 来播放 url 中的 mp4 视频。有什么方法可以以编程方式检查我正在播放的视频是否有声音?
编辑:我正在使用 API 14,所以我无权访问 MediaPlayer 方法 getTrackInfo
非常感谢
mp4 android android-mediaplayer textureview android-textureview
android ×11
textureview ×11
opengl-es ×2
surfaceview ×2
aidl ×1
alpha ×1
h.264 ×1
java ×1
mediacodec ×1
mp4 ×1
scaling ×1
transparent ×1
video ×1