Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java surface已发布媒体编解码器_Java_Android_Surfaceview_Android Mediacodec_Surface - Fatal编程技术网

Java surface已发布媒体编解码器

Java surface已发布媒体编解码器,java,android,surfaceview,android-mediacodec,surface,Java,Android,Surfaceview,Android Mediacodec,Surface,我正在尝试对编码器/解码器进行编码,以便通过TCP服务器发送摄像头,并在执行解码时使用SurfaceView显示摄像头。配置我有“曲面已释放” 这是我的代码: SurfaceHolder.Callback callback1 = new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { Log.d(TAG,"inSurfac

我正在尝试对编码器/解码器进行编码,以便通过TCP服务器发送摄像头,并在执行解码时使用
SurfaceView
显示摄像头。配置
我有“曲面已释放”

这是我的代码:

SurfaceHolder.Callback callback1 = new SurfaceHolder.Callback() {

    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        Log.d(TAG,"inSurfaceCreated");
        hasActiveHolder = true;
    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
        Log.d(TAG,"inSurfaceChanged");
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        Log.d(TAG,"inSurfaceDestroyed");
        hasActiveHolder = false;
    }
};
FrameLayout frameLayout1=findViewById(R.id.frameLayout);
SurfaceView surfaceView = new SurfaceView(this);
SurfaceHolder holder1 = (surfaceView.getHolder());
holder1.addCallback(callback1);
Surface surfaceAffichage = holder1.getSurface();
frameLayout1.addView(surfaceView);
//while(!hasActiveHolder){ }

MediaFormat mediaFormat = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, 640, 640);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 1000000);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 20);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible);
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1);
final MediaCodec decodec = MediaCodec.createDecoderByType("video/avc");
decodec.configure(mediaFormat, surfaceAffichage, null, 0);
如果我删除while循环上的注释,我将永远等待,程序将永远不会进入回调
surfaceCreated


有人能帮我吗

您需要在SurfaceHoler.Callback的surfaceCreated主体中初始化解码器。创建基础曲面后,此回调将通知您

另外:
while(!hasActiveHolder){}
不要这样做。如果有回调,使用它来启动其余的逻辑。 如果确实需要检查某个事件是否定期发生,请引入等待时间并同步变量访问