小编fad*_*den的帖子

了解Android紧密循环/旋转暂停错误

我正在开发一款关于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)

java android loops dalvik

5
推荐指数
1
解决办法
1813
查看次数

多个MediaCodec实例

我使用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)

任何人都可以指出一些如何正确做到这一点的指导方针吗?也许不同的线程?我真的想在不同视频之间进行平滑过渡,但我需要它至少在某些设备上一致地工作.

非常感谢

android mediacodec

5
推荐指数
1
解决办法
3161
查看次数

在 Xperia Z1 上使用 MediaCodec 编码相机预览帧时视频质量不一致

我正在NV21对来自相机预览的帧进行编码。由于某种原因,在其他设备上运行良好的模式Sony Xperia Z1Android 4.3. 它发送回质量不正确(低)的编码帧。

MediaCodec的格式是COLOR_FormatYUV420SemiPlanar(NV12我通过交换 U 和 V 分量NV21来转换NV12)。发送回给我的输出缓冲区的大小非常小,与我使用的分辨率 ( ) 和比特率 ( )MediaCodec不对应。最初的几帧质量很好,但随后质量显着下降:1280x7201000000

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 android-mediacodec

5
推荐指数
1
解决办法
3716
查看次数

关闭Dalvik VM的所有优化

所以我正在尝试为Android编写一些低级代码,我主要担心的是我想通过JIT编译器(或其他任何东西)避免所有优化.在做了一些研究之后,最好的方法似乎是:

  1. 手工编写Java字节码
  2. 使用"dx"命令将其转换为dex文件
  3. 使用"dalvikvm"命令(通过adb shell)在程序上运行它,并指定"-Xverify:none -Xdexopt:none"参数

我的问题是:这实际上是否会避免所有优化?之前的讨论https://groups.google.com/forum/#!topic/android-platform/Y-pzP9z6xLw让我不确定,我不能100%通过阅读文档来说服自己.

任何确认方式都非常感谢.

performance android dalvik

5
推荐指数
1
解决办法
1769
查看次数

JNI在应用程序中检测到错误:输入无效修改的UTF-8:非法启动字节0xfc.

我在使用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)

java-native-interface android android-ndk twilio

5
推荐指数
0
解决办法
1941
查看次数

Android MediaCodec:多个 SurfaceView 支持多少个同步(视频)解码线程?

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)

android android-mediacodec

5
推荐指数
1
解决办法
3433
查看次数

Exoplayer 在满缓冲区上缓冲

我正在开发一个使用 ExoPlayer 播放 mp4 视频的应用程序。我已经成功设置它并播放一些视频,但有一些我不太明白的地方。当视频完全缓冲并且我向前查找时,播放器进入缓冲状态并需要一些(非常短的)时间来恢复播放。满缓冲区的时间是多少?我知道 exoplayer 不会缓冲之前的帧,但为什么它在前进时也会重新缓冲?我已将延迟跟踪到 TrackRenderers 上的“doSomeWork()”方法,但我仍然不知道如何“修复”它。我目前正在使用 ExoPlayer 演示中的代码和视频的 ExtractorRendererBuilder。

还有其他人遇到过这种情况吗?

谢谢。

android exoplayer

5
推荐指数
1
解决办法
1993
查看次数

直接在android中裁剪YUV420/NV21字节数组

我需要从相机的 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)

android crop libyuv

5
推荐指数
1
解决办法
1996
查看次数

使用MediaCodec和Surface进行Android编码

我一直在通过MediaCodec将视频直接渲染到我的UI中从SurfaceView获取的Surface.这非常有效.

我现在正在尝试使用MediaCodec作为编码器.作为测试,我想渲染到Surface(如上所述)并通过配置为编码器的MediaCodec的不同实例进行环回.

我看到编码器的createInputSurface()方法.我想我希望编码器创建这个表面然后让解码器MediaCodec使用它作为要绘制的表面.首先,这可能吗?

其次,我不确定如何从编码器创建的Surface创建SurfaceView.我只从SurfaceView中提取了一个Surface,而我从文档中看不到如何反向执行此操作.

android encoder decoder surfaceview mediacodec

4
推荐指数
1
解决办法
4832
查看次数

如何将位图绘制到 SurfaceView?

我正在尝试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 surfaceview xamarin.android xamarin android-bitmap

4
推荐指数
1
解决办法
6881
查看次数