我正在开发一款关于android的游戏,"Space RPG" - 目前只在大多数Galaxy S4和HTC Ones上看到这个错误.这都是Java.
游戏将停止,当我尝试调试进程并暂停有问题的线程时,它将不会挂起,并且会发生旋转挂起错误.线程转储让我看到它在一个特定的while循环中,它正在采取所需的"结束位置"并在不断增加的距离步骤向后迭代以找到"起始位置".
这是事情变得烦人的地方.我可以验证循环无法无限运行,即使条件是while(true),在我的break被调用之前它不可能运行超过200次迭代(这个断言由正在运行的代码备份)我试过的每一部电话).
为了帮助我缓解这个问题,我在循环中添加了一个简单的递增变量,如果它超过1000,它会记录一些东西,所以我可以看到DID运行太多次,以防万一设置了一些变量严重或某事. 当此计数器代码存在时,不会发生崩溃/挂起.我也没有看到任何日志表明它跑了1000多次.
如果我删除此计数器,则每次播放5-10秒后都会发生挂起[其中while循环可能会运行10次,尽管有所不同].
因此,我的问题是,到底发生了什么?:P为什么这些较新的手机(但似乎没有旧款手机)在执行有效工作的循环中存在问题,并且在没有增量变量的情况下不会持续很长时间.线程如何可能在该循环中停止,以及如何使用额外的计数器变量来解决问题?这项工作是在opengl渲染线程上完成的,如果这很重要的话.
我有关于大多数S4发生这种情况的报告,但至少有一个S4在那里没有发生.我今天使用的那个正在发生.这让我想知道它是否可能与特定的android,java,dalvik或手机上的其他东西有关,但遗憾的是我没有从S4工作的任何细节.
非常感谢任何有关此类内容的帮助,指导,想法或进一步阅读.
float vel = 1.0f; // final velocity is 1. We are working backwards to find out what the starting velocity will need to be.
int i = 0;
double xmath = Math.sin(rot* (Math.PI/180.0f)); // component of velocity for x,y direction based on rotation
double ymath = Math.cos(rot* (Math.PI/180.0f));
while (true) {
/* with this section uncommented, the stall never happens...
++i;
if (i>1000) {
// Something …
Run Code Online (Sandbox Code Playgroud) 我使用MediaCodec库制作了一个视频播放器,我想添加一个播放列表功能.我试图有两个MediaCodec实例,以便在两个连续的视频之间进行更平滑的过渡,但是这似乎很危险,在某些设备中(我尝试使用带有氰的S4)它完美地工作,但是在S4中使用TouchWiz同样如此代码在媒体编解码器声明中崩溃.这是代码片段:
MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource(path1);
MediaFormat format = extractor.getTrackFormat(0);
String mime = format.getString(MediaFormat.KEY_MIME);
extractor.selectTrack(0);
MediaCodec decoder = MediaCodec.createDecoderByType(mime);
decoder.configure(format, null, null, 0);
MediaExtractor extractor2 = new MediaExtractor();
extractor2.setDataSource(path2);
MediaFormat format2 = extractor2.getTrackFormat(0);
String mime2 = format.getString(MediaFormat.KEY_MIME);
extractor2.selectTrack(0);
MediaCodec decoder2 = MediaCodec.createDecoderByType(mime2);
decoder2.configure(format2, null, null, 0);
Run Code Online (Sandbox Code Playgroud)
我在TouchWiz S4上获得的例外是
E/ACodec(17651): configureCodec multi window instance fail appPid : 17651
E/ACodec(17651): [OMX.qcom.video.decoder.avc] configureCodec returning error -38
E/MediaCodec(17651): Codec reported an error. (omx error 0x80001001, internalError -38)
Run Code Online (Sandbox Code Playgroud)
任何人都可以指出一些如何正确做到这一点的指导方针吗?也许不同的线程?我真的想在不同视频之间进行平滑过渡,但我需要它至少在某些设备上一致地工作.
非常感谢
我正在NV21
对来自相机预览的帧进行编码。由于某种原因,在其他设备上运行良好的模式Sony Xperia Z1
在Android 4.3
. 它发送回质量不正确(低)的编码帧。
MediaCodec
的格式是COLOR_FormatYUV420SemiPlanar
(NV12
我通过交换 U 和 V 分量NV21
来转换NV12
)。发送回给我的输出缓冲区的大小非常小,与我使用的分辨率 ( ) 和比特率 ( )MediaCodec
不对应。最初的几帧质量很好,但随后质量显着下降:1280x720
1000000
int encoderStatus = mMediaCodec.dequeueOutputBuffer(mBufferInfo, TIMEOUT_USEC);
// a few encoderStatus checks skipped
ByteBuffer encodedData = outputBuffers[encoderStatus];
Log.i(Constants.TAG, "Buffer size " + mBufferInfo.size);
Run Code Online (Sandbox Code Playgroud)
Xperia Z1 上的日志如下:
Buffer size 26
Buffer size 52172
Buffer size 23650
Buffer size 14394
Buffer size 3591
Buffer size 1849
Buffer size 3908
... …
Run Code Online (Sandbox Code Playgroud) 所以我正在尝试为Android编写一些低级代码,我主要担心的是我想通过JIT编译器(或其他任何东西)避免所有优化.在做了一些研究之后,最好的方法似乎是:
我的问题是:这实际上是否会避免所有优化?之前的讨论https://groups.google.com/forum/#!topic/android-platform/Y-pzP9z6xLw让我不确定,我不能100%通过阅读文档来说服自己.
任何确认方式都非常感谢.
我在使用Twilio SDK启动呼叫时遇到此错误.
02-20 11:19:51.366: A/art(27475): art/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal start byte 0xfc
02-20 11:19:51.366: A/art(27475): art/runtime/check_jni.cc:65] string: '100.90.133.117???*?'
02-20 11:19:51.366: A/art(27475): art/runtime/check_jni.cc:65] in call to NewStringUTF
02-20 11:19:51.366: A/art(27475): art/runtime/check_jni.cc:65] "Thread-1849" prio=5 tid=43 Runnable
02-20 11:19:51.366: A/art(27475): art/runtime/check_jni.cc:65] | group="main" sCount=0 dsCount=0 obj=0x1e1b5560 self=0xb8b125b0
02-20 11:19:51.366: A/art(27475): art/runtime/check_jni.cc:65] | sysTid=27495 nice=0 cgrp=apps sched=0/0 handle=0xb87bb970
02-20 11:19:51.366: A/art(27475): art/runtime/check_jni.cc:65] | state=R schedstat=( 794242861 121820754 4071 ) utm=53 stm=26 core=0 HZ=100
02-20 11:19:51.366: …
Run Code Online (Sandbox Code Playgroud) 从Grafika项目中,文件 DoubleDecodeActivity.java。我在 3 个 SurfaceView 上使用 MediaCodec API 尝试了 3 个同步视频(h264)解码器。在使用 Android 5.1 将第四个解码器添加到第四个 SurfaceView 到 Nexus 7 时崩溃,那么可以或支持多少个同时解码器。
附言。这次崩溃后,MediaCodec 不再工作。需要重启设备才能使用MediaCodec。
下面是崩溃日志。第四个解码器线程的函数崩溃decoder.start()
。
com.example.app.one V/DecodeActivity: Mime: video/avc
com.example.app.one I/OMXClient: Using client-side OMX mux.
com.example.app.one V/DecodeActivity: Mime: video/avc
com.example.app.one I/OMXClient: Using client-side OMX mux.
com.example.app.one V/DecodeActivity: Mime: video/avc
com.example.app.one E/ACodec: [OMX.qcom.video.decoder.avc] storeMetaDataInBuffers failed w/ err -2147483648
com.example.app.one E/ACodec: [OMX.qcom.video.decoder.avc] storeMetaDataInBuffers failed w/ err -2147483648
com.example.app.one W/ACodec: do not know color format 0x7fa30c03 = 2141391875
com.example.app.one W/ACodec: do not …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用 ExoPlayer 播放 mp4 视频的应用程序。我已经成功设置它并播放一些视频,但有一些我不太明白的地方。当视频完全缓冲并且我向前查找时,播放器进入缓冲状态并需要一些(非常短的)时间来恢复播放。满缓冲区的时间是多少?我知道 exoplayer 不会缓冲之前的帧,但为什么它在前进时也会重新缓冲?我已将延迟跟踪到 TrackRenderers 上的“doSomeWork()”方法,但我仍然不知道如何“修复”它。我目前正在使用 ExoPlayer 演示中的代码和视频的 ExtractorRendererBuilder。
还有其他人遇到过这种情况吗?
谢谢。
我需要从相机的 onPreviewFrame 中裁剪每一帧。我想直接裁剪它,对字节数组进行操作,而不将其转换为位图。我想直接在阵列上执行此操作的原因是因为它不能太慢或太昂贵。裁剪操作后,我将直接使用输出字节数组,因此不需要任何位图转换。
int frameWidth;
int frameHeight;
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
// Crop the data array directly.
cropData(data, frameWidth, frameHeight, startCropX, startCropY, outputWidth, outputHeight);
}
Run Code Online (Sandbox Code Playgroud) 我一直在通过MediaCodec将视频直接渲染到我的UI中从SurfaceView获取的Surface.这非常有效.
我现在正在尝试使用MediaCodec作为编码器.作为测试,我想渲染到Surface(如上所述)并通过配置为编码器的MediaCodec的不同实例进行环回.
我看到编码器的createInputSurface()方法.我想我希望编码器创建这个表面然后让解码器MediaCodec使用它作为要绘制的表面.首先,这可能吗?
其次,我不确定如何从编码器创建的Surface创建SurfaceView.我只从SurfaceView中提取了一个Surface,而我从文档中看不到如何反向执行此操作.
我正在尝试SurfaceView
使用以下代码为我的实际绘制位图:(这将在另一个Thread
和 a 中运行while
,因为它需要刷新SurfaceView
)。
while (true)
{
try
{
// Enable drawing
// ERROR LINE!
Canvas ca = mPreview2.Holder.LockCanvas();
// Get current frame
Bitmap test = mediaPlayer.CurrentFrame;
// Actual drawing
Paint paint = new Paint();
ca.DrawBitmap(test, 0, 0, paint);
// Stop drawing
mPreview2.Holder.UnlockCanvasAndPost(ca);
} catch (Exception ex)
{
throw ex;
}
}
Run Code Online (Sandbox Code Playgroud)
但是我有以下错误:(这是在线发生的: Canvas ca = mPreview2.Holder.LockCanvas();
Java.Lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.Bitmap.isRecycled()' on a null object reference
Run Code Online (Sandbox Code Playgroud) android ×10
dalvik ×2
mediacodec ×2
surfaceview ×2
android-ndk ×1
crop ×1
decoder ×1
encoder ×1
exoplayer ×1
java ×1
libyuv ×1
loops ×1
performance ×1
twilio ×1
xamarin ×1