MediaRecorder(18373): start failed: -38

我在利用手机摄像头录像并通过localsocket推送rtsp流到电脑。现在有时候会出现这个错误MediaRecorder(18373): start failed: -38,出现后很长一段时间后又突然好了,过一段时就又突然出现这个错误。
有时候会出现如下错误才会提示start failed: -38,我觉得和这个有关系

 08-23 11:30:00.871: E/ACodec(12103): [OMX.google.h264.encoder] ERROR(0x80001001)
08-23 11:30:00.871: E/ACodec(12103): signalError(omxError 0x80001001, internalError -2147483648)
08-23 11:30:00.871: E/MediaCodec(12103): Codec reported err 0x80001001, actionCode 0, while in state 6
08-23 11:30:00.921: E/ACodec(12103): [OMX.google.h264.encoder] ERROR(0x80001001)
08-23 11:30:00.921: E/ACodec(12103): signalError(omxError 0x80001001, internalError -2147483648)
08-23 11:30:00.921: E/MediaCodec(12103): Codec reported err 0x80001001, actionCode 0, while in state 6
08-23 11:30:01.061: E/ACodec(12103): [OMX.qcom.video.encoder.avc] storeMetaDataInBuffers (output) failed w/ err -1010

网上看到是那个service在后台用到它,所以才会报错么,但是我从后台退出程序,再次进入依然保这个错误,我很费解,哪位大神帮我看看,跪求指点。

断点刚到这个方法(还未执行这个方法),摄像头正常工作。

创建MediaRecorder代码如下。

MediaRecorder mMediaRecorder = null;
 protected void encodeWithMediaRecorder() throws IOException {
        Log.d(TAG,"Video encoded using the MediaRecorder API");

        // We need a local socket to forward data output by the camera to the packetizer
        createSockets();

        // Reopens the camera if needed
        destroyCamera();
        createCamera();

        // The camera must be unlocked before the MediaRecorder can use it
        unlockCamera();

        if (mMediaRecorder != null)
        {
            mMediaRecorder.stop();
            mMediaRecorder.release();
            mMediaRecorder = null;
        }
//      try {

            mMediaRecorder = new MediaRecorder();
            //mCamera.unlock();
            mMediaRecorder.setCamera(mCamera);
            mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
            mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            mMediaRecorder.setVideoEncoder(mVideoEncoder);

            mMediaRecorder.setVideoSize(mRequestedQuality.resX,mRequestedQuality.resY);
            mMediaRecorder.setVideoFrameRate(mRequestedQuality.framerate);
            mMediaRecorder.setPreviewDisplay(mSurfaceView.getHolder().getSurface());
            // The bandwidth actually consumed is often above what was requested 
            mMediaRecorder.setVideoEncodingBitRate((int)(mRequestedQuality.bitrate*0.8));//0.8

            // We write the ouput of the camera in a local socket instead of a file !           
            // This one little trick makes streaming feasible quiet simply: data from the camera
            // can then be manipulated at the other end of the socket
            mMediaRecorder.setOutputFile(mSender.getFileDescriptor());

            mMediaRecorder.prepare();
            try{
                mMediaRecorder.start(); 这里抛出异常start failed: -38
            }catch(Exception e)
            {
                Log.e(TAG,"this is Exception start error : "+e); //这里只打印到java.lang.IllegalStateException
            }

//      } catch (Exception e) {
//          Log.e(TAG,"this is Exception error : "+e);
//          throw new ConfNotSupportedException(e.getMessage());
//      }

        // This will skip the MPEG4 header if this step fails we can't stream anything :(
        InputStream is = mReceiver.getInputStream();
        try {
            byte buffer[] = new byte[4];
            // Skip all atoms preceding mdat atom
            while (!Thread.interrupted()) {
                while (is.read() != 'm');
                is.read(buffer,0,3);
                if (buffer[0] == 'd' && buffer[1] == 'a' && buffer[2] == 't') break;
            }
        } catch (IOException e) {
            Log.e(TAG,"Couldn't skip mp4 header :/");
            stop();
            throw e;
        }

        // The packetizer encapsulates the bit stream in an RTP stream and send it over the network
        mPacketizer.setDestination(mDestination, mRtpPort, mRtcpPort);
        mPacketizer.setInputStream(mReceiver.getInputStream());
        mPacketizer.start();

        mStreaming = true;

    }

    protected void createSockets() throws IOException {

        final String LOCAL_ADDR = "net.majorkernelpanic.streaming-";

        for (int i=0;i<10;i++) {
            try {
                mSocketId = new Random().nextInt();
                mLss = new LocalServerSocket(LOCAL_ADDR+mSocketId);
                break;
            } catch (IOException e1) {
                Log.e(TAG, "this is mLss error : " + e1 );
            }
        }

        mReceiver = new LocalSocket();
        mReceiver.connect( new LocalSocketAddress(LOCAL_ADDR+mSocketId));
        mReceiver.setReceiveBufferSize(500000);
        mReceiver.setSoTimeout(3000);
        mSender = mLss.accept();
        mSender.setSendBufferSize(500000);
    }

    protected synchronized void destroyCamera() {
        if (mCamera != null) {
            if (mStreaming) super.stop();
            lockCamera();
            mCamera.stopPreview();
            try {
                mCamera.release();
            } catch (Exception e) {
                Log.e(TAG,e.getMessage()!=null?e.getMessage():"unknown error");
            }
            mCamera = null;
            mCameraLooper.quit();
            mUnlocked = false;
            mPreviewStarted = false;
        }   
    }

    protected boolean mUnlocked = false;
    protected synchronized void createCamera() throws RuntimeException {
        if (mSurfaceView == null)
            throw new InvalidSurfaceException("Invalid surface !");
        if (mSurfaceView.getHolder() == null || !mSurfaceReady) 
            throw new InvalidSurfaceException("Invalid surface !");

        if (mCamera == null) {
            openCamera();
            mUnlocked = false;
            mCamera.setErrorCallback(new Camera.ErrorCallback() {
                @Override
                public void onError(int error, Camera camera) {
                    // On some phones when trying to use the camera facing front the media server will die
                    // Whether or not this callback may be called really depends on the phone
                    if (error == Camera.CAMERA_ERROR_SERVER_DIED) {
                        // In this case the application must release the camera and instantiate a new one
                        Log.e(TAG,"Media server died !");
                        // We don't know in what thread we are so stop needs to be synchronized
                        mCameraOpenedManually = false;
                        stop();
                    } else {
                        Log.e(TAG,"Error unknown with the camera: "+error);
                    }   
                }
            });

            try {

                // If the phone has a flash, we turn it on/off according to mFlashEnabled
                // setRecordingHint(true) is a very nice optimisation if you plane to only use the Camera for recording
                Parameters parameters = mCamera.getParameters();
                if (parameters.getFlashMode()!=null) {
                    parameters.setFlashMode(mFlashEnabled?Parameters.FLASH_MODE_TORCH:Parameters.FLASH_MODE_OFF);
                }
                parameters.setRecordingHint(true);
                parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);//1连续对焦  
                mCamera.setParameters(parameters);
                mCamera.setDisplayOrientation(mOrientation);

                try {
                    if (mMode == MODE_MEDIACODEC_API_2) {
                        mSurfaceView.startGLThread();
                        mCamera.setPreviewTexture(mSurfaceView.getSurfaceTexture());
                    } else {
                        mCamera.setPreviewDisplay(mSurfaceView.getHolder());
                        mCamera.setDisplayOrientation(270);
                    }
                } catch (IOException e) {
                    throw new InvalidSurfaceException("Invalid surface !");
                }

            } catch (RuntimeException e) {
                destroyCamera();
                throw e;
            }

        }
    }

    protected void unlockCamera() {
        if (!mUnlocked) {
            Log.d(TAG,"Unlocking camera");
            try {   
                mCamera.unlock();
            } catch (Exception e) {
                Log.e(TAG,"unlockCamera : "+e.getMessage());
            }
            mUnlocked = true;
        }
    }

如果哪里不清楚,我可以再贴代码。现在我一直弄不懂为什么会出现start failed -38,再次跪求指点。

2个回答

qq_25269835
风鱼_csdn 回复:大哥 mPacketizer.setInputStream(is); mPacketizer是什么啊??
一年多之前 回复
llx2007
凌云志轩 我刚试了下,红米4.2居然可以正常运行,而我华为KIW-AL1 5.1居然不行。大神,你是对的。
3 年多之前 回复
llx2007
凌云志轩 大神,昨晚找了一个解决办法,然而有问题
3 年多之前 回复

我的解决办法来自于http://stackoverflow.com/questions/26990816/mediarecorder-issue-on-android-lollipop

我原来出问题的代码

 protected LocalSocket mReceiver = null, mSender = null;
 private LocalServerSocket mLss = null;
    private int mSocketId, mTTL = 64;
    protected void createSockets() throws IOException {

        final String LOCAL_ADDR = "net.majorkernelpanic.streaming-";

        for (int i=0;i<10;i++) {
            try {
                mSocketId = new Random().nextInt() +i;
                mLss = new LocalServerSocket(LOCAL_ADDR+mSocketId);
                break;
            } catch (IOException e1) {}
        }

        mReceiver = new LocalSocket();
        mReceiver.connect( new LocalSocketAddress(LOCAL_ADDR+mSocketId));
        mReceiver.setReceiveBufferSize(500000);
        mReceiver.setSoTimeout(3000);
        mSender = mLss.accept();
        mSender.setSendBufferSize(500000);
    }

现在改为

 protected void createSockets() throws IOException {

        final String LOCAL_ADDR = "net.majorkernelpanic.streaming-";

        for (int i=0;i<10;i++) {
            try {
                mSocketId = new Random().nextInt() +i;
                mLss = new LocalServerSocket(LOCAL_ADDR+mSocketId);
                break;
            } catch (IOException e1) {}
        }

//      mReceiver = new LocalSocket();
//      mReceiver.connect( new LocalSocketAddress(LOCAL_ADDR+mSocketId));
//      mReceiver.setReceiveBufferSize(500000);
//      mReceiver.setSoTimeout(3000);
//      mSender = mLss.accept();
//      mSender.setSendBufferSize(500000);
         ParcelFileDescriptor[] parcelFileDescriptors =ParcelFileDescriptor.createPipe();
         ParcelFileDescriptor parcelRead = new ParcelFileDescriptor(parcelFileDescriptors[0]);
         ParcelFileDescriptor parcelWrite = new ParcelFileDescriptor(parcelFileDescriptors[1]);
    }

把mPacketizer.setInputStream(mReceiver.getInputStream());改为
InputStream is = null;
try{ is = new ParcelFileDescriptor.AutoCloseInputStream(parcelRead);
}
catch (Exception e){}
mPacketizer.setInputStream(is);
把mMediaRecorder.setOutputFile(mSender.getFileDescriptor()); 改为把mMediaRecorder.setOutputFile(parcelWrite.getFileDescriptor());

然后一切正常了,然而缺出现了一个新问题:就是出现花屏了。以前的代码虽然时儿会报错,但是运行出来结果后是不会出现花屏的,分辨率是1280*720,改后的代码感觉视频效果非常差劲。这是为什么呢?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于Android程序闪退的错误日志
编写了一个包含listview的页面,listview基于另外一个activity可以通过按钮进行操作 但是在打开程序时出现了闪退现象,求大神帮忙解读一下错误日志,感谢 04-13 23:39:21.103: D/ResourcesManager(18150): For user 0 new overlays fetched Null 04-13 23:39:21.113: W/System(18150): ClassLoader referenced unknown path: /data/app/com.example.newrecorder-1/lib/arm64 04-13 23:39:21.173: D/AbsListView(18150): Get MotionRecognitionManager 04-13 23:39:21.183: E/MotionRecognitionManager(18150): mSContextService = android.hardware.scontext.ISContextService$Stub$Proxy@23c9d5e 04-13 23:39:21.183: E/MotionRecognitionManager(18150): motionService = com.samsung.android.motion.IMotionRecognitionService$Stub$Proxy@75d53f 04-13 23:39:21.183: E/MotionRecognitionManager(18150): motionService = com.samsung.android.motion.IMotionRecognitionService$Stub$Proxy@75d53f 04-13 23:39:21.183: I/MediaPlayer(18150): Need to enable context aware info 04-13 23:39:21.183: V/MediaPlayer-JNI(18150): native_setup 04-13 23:39:21.193: E/ExtMediaPlayer-JNI(18150): env->IsInstanceOf fails 04-13 23:39:21.193: E/MediaPlayer-JNI(18150): JNIMediaPlayerFactory: bIsQCMediaPlayerPresent 0 04-13 23:39:21.193: E/ExtMediaPlayer-JNI(18150): env->IsInstanceOf fails 04-13 23:39:21.193: E/MediaPlayer-JNI(18150): JNIMediaPlayerFactory: bIsQCMediaPlayerPresent 0 04-13 23:39:21.193: V/MediaPlayer(18150): constructor 04-13 23:39:21.193: V/MediaPlayer(18150): setListener 04-13 23:39:21.193: D/AndroidRuntime(18150): Shutting down VM 04-13 23:39:21.193: E/AndroidRuntime(18150): FATAL EXCEPTION: main 04-13 23:39:21.193: E/AndroidRuntime(18150): Process: com.example.newrecorder, PID: 18150 04-13 23:39:21.193: E/AndroidRuntime(18150): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.newrecorder/com.example.newrecorder.MainActivity}: java.lang.RuntimeException: setAudioSource failed. 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3254) 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3350) 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.app.ActivityThread.access$1100(ActivityThread.java:223) 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.os.Handler.dispatchMessage(Handler.java:102) 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.os.Looper.loop(Looper.java:148) 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.app.ActivityThread.main(ActivityThread.java:7224) 04-13 23:39:21.193: E/AndroidRuntime(18150): at java.lang.reflect.Method.invoke(Native Method) 04-13 23:39:21.193: E/AndroidRuntime(18150): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 04-13 23:39:21.193: E/AndroidRuntime(18150): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 04-13 23:39:21.193: E/AndroidRuntime(18150): Caused by: java.lang.RuntimeException: setAudioSource failed. 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.media.MediaRecorder._setAudioSource(Native Method) 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.media.MediaRecorder.setAudioSource(MediaRecorder.java:488) 04-13 23:39:21.193: E/AndroidRuntime(18150): at com.example.newrecorder.MainActivity.onCreate(MainActivity.java:57) 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.app.Activity.performCreate(Activity.java:6877) 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1136) 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3207) 04-13 23:39:21.193: E/AndroidRuntime(18150): ... 9 more 04-13 23:39:23.273: I/Process(18150): Sending signal. PID: 18150 SIG: 9
一直报start failed :-19 。求大神指点
![图片说明](https://img-ask.csdn.net/upload/201602/23/1456208952_776704.png)
在android中同时调用多个麦克风报错:android.media.MediaRecorder.start(Native Method)
1.问题描述:<br>在android中同时调用多个麦克风报错: <br>报错位置mr2.strat():第二个麦克风启动操作时报错。<br> 报错内容:<br> **android.media.MediaRecorder.start(Native Method)**<br> 代码如下: ![图片说明](https://img-ask.csdn.net/upload/201905/15/1557913924_439814.png) <br> <br> <br> ![图片说明](https://img-ask.csdn.net/upload/201905/15/1557914045_94388.png) 录音权限和存储权限已授予。 <br> <br> ``` private void startRecord(){ if(mr == null){ File dir = new File(Environment.getExternalStorageDirectory(),"sounds"); if(!dir.exists()){ dir.mkdirs(); } String filename = string1.getText().toString(); SimpleDateFormat df = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");//设置日期格式 File soundFile = new File(dir,filename+df.format(new Date())+"_MIC"+".amr"); File soundFile2 = new File(dir,filename+df.format(new Date())+"_VOICE_COMMUNICATION"+".amr"); if(!soundFile.exists()){ try { soundFile.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } if(!soundFile2.exists()){ try { soundFile2.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } mr = new MediaRecorder(); mr.setAudioSource(MediaRecorder.AudioSource.DEFAULT); mr.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB); //设置输出格式 mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB); //设置编码格式 mr.setOutputFile(soundFile.getAbsolutePath()); mr2 = new MediaRecorder(); mr2.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION); //音频输入源 mr2.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB); mr2.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB); mr2.setOutputFile(soundFile2.getAbsolutePath()); try { mr.prepare(); mr.start();// mr2.prepare(); mr2.start();//**在这个位置报错** } catch (IOException e) { e.printStackTrace(); } } } //停止录制,资源释放 private void stopRecord(){ if(mr != null){ mr.stop(); mr2.stop(); mr.release(); mr2.release(); mr = null; mr2 = null; } } ```
VivoX21 UDA 机型录像执行mediaRecorder.start()崩溃
### 使用Camera+MediaReocrd实现相机录制小视频功能 在 **VivoX21 UDA** 机型上录像执行 ``` mediaRecorder.start() ``` 时**崩溃** 相同的代码, 暂时测试其他机型可以正常录制,没发现问题; **下面是部分点击按钮录像代码:** ``` if (mediaRecorder == null) { mediaRecorder = new MediaRecorder(); } if (mParams == null) { mParams = mCamera.getParameters(); } List<String> focusModes = mParams.getSupportedFocusModes(); if (focusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) { mParams.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); } mCamera.setParameters(mParams); mCamera.unlock(); mediaRecorder.reset(); mediaRecorder.setCamera(mCamera); if (needVoice) { mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); } else { mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); } mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); Camera.Size videoSize; if (mParams.getSupportedVideoSizes() == null) { videoSize = CameraParamUtil.getInstance().getPreviewSize(mParams.getSupportedPreviewSizes(), 400, screenProp); } else { videoSize = CameraParamUtil.getInstance().getPreviewSize(mParams.getSupportedVideoSizes(), 400, screenProp); } if (videoSize.width == videoSize.height) { mediaRecorder.setVideoSize(preview_width, preview_height); } else { //_这里vivoX21 uda 匹配的videoSize 864*480_ mediaRecorder.setVideoSize(videoSize.width, videoSize.height); } if (SELECTED_CAMERA == CAMERA_FRONT_POSITION) { //手机预览处理 if (cameraAngle == 270) { //横屏 if (nowAngle == 0) { mediaRecorder.setOrientationHint(180); } else if (nowAngle == 270) { mediaRecorder.setOrientationHint(270); } else { mediaRecorder.setOrientationHint(90); } } else { if (nowAngle == 90) { mediaRecorder.setOrientationHint(270); } else if (nowAngle == 270) { mediaRecorder.setOrientationHint(90); } else { mediaRecorder.setOrientationHint(nowAngle); } } } else { mediaRecorder.setOrientationHint(nowAngle); } mediaRecorder.setVideoEncodingBitRate(mediaQuality); mediaRecorder.setPreviewDisplay(surface); videoFileName = "video_" + System.currentTimeMillis() + ".mp4"; if (saveVideoPath.equals("")) { saveVideoPath = Environment.getExternalStorageDirectory().getPath(); } videoFileAbsPath = saveVideoPath + File.separator + videoFileName; mediaRecorder.setOutputFile(videoFileAbsPath); try { mediaRecorder.prepare(); mediaRecorder.start(); //这行报错!!!! isRecorder = true; } catch (IllegalStateException e) { e.printStackTrace(); Log.i(TAG, "startRecord IllegalStateException"); } catch (IOException e) { e.printStackTrace(); Log.i(TAG, "startRecord IOException"); if (this.errorLisenter != null) { this.errorLisenter.onError(); } } catch (RuntimeException e) { Log.i(TAG, "startRecord RuntimeException"); } ```
Android录音实现的代码中,setAudioSource()方法出错,程序停止
参照网上这个代码, 代码完全一样,但是 mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 这行代码出错,权限也加了,然而点击录音之后程序停止 04-06 00:00:37.907 2297-2297/com.gabos.tsounds E/AndroidRuntime: FATAL EXCEPTION: main Process: com.gabos.tsounds, PID: 2297 java.lang.RuntimeException: setAudioSource failed. at android.media.MediaRecorder.setAudioSource(Native Method) at com.gabos.tsounds.RecordActivity$startRecordListener.onClick(RecordActivity.java:69) at android.view.View.performClick(View.java:5609) at android.view.View$PerformClick.run(View.java:22259) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) ![图片说明](https://img-ask.csdn.net/upload/201704/06/1491451289_375572.png)
安卓的录音程序,运行时闪退求解
按照教程写了个安卓的录音程序,在点击结束录音时闪退,求大神帮看看代码,感谢 闪退时报错日志 04-08 19:47:29.702: D/ViewRootImpl(11731): ViewPostImeInputStage processPointer 0 04-08 19:47:29.802: D/ViewRootImpl(11731): ViewPostImeInputStage processPointer 1 04-08 19:47:29.802: E/MediaRecorder(11731): stop called in an invalid state: 4 04-08 19:47:29.802: D/AndroidRuntime(11731): Shutting down VM 04-08 19:47:29.802: E/AndroidRuntime(11731): FATAL EXCEPTION: main 04-08 19:47:29.802: E/AndroidRuntime(11731): Process: com.example.recorder, PID: 11731 04-08 19:47:29.802: E/AndroidRuntime(11731): java.lang.IllegalStateException 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.media.MediaRecorder._stop(Native Method) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.media.MediaRecorder.stop(MediaRecorder.java:976) 04-08 19:47:29.802: E/AndroidRuntime(11731): at com.example.recorder.MainActivity.stop(MainActivity.java:102) 04-08 19:47:29.802: E/AndroidRuntime(11731): at com.example.recorder.MainActivity$2.onClick(MainActivity.java:61) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.view.View.performClick(View.java:5698) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.widget.TextView.performClick(TextView.java:10896) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.view.View$PerformClick.run(View.java:22565) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.os.Handler.handleCallback(Handler.java:739) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.os.Handler.dispatchMessage(Handler.java:95) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.os.Looper.loop(Looper.java:148) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.app.ActivityThread.main(ActivityThread.java:7224) 04-08 19:47:29.802: E/AndroidRuntime(11731): at java.lang.reflect.Method.invoke(Native Method) 04-08 19:47:29.802: E/AndroidRuntime(11731): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 04-08 19:47:29.802: E/AndroidRuntime(11731): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 04-08 19:47:32.042: I/Process(11731): Sending signal. PID: 11731 SIG: 9 DEBUG 线程 [main](已暂挂(异常 IllegalStateException)) MediaRecorder._stop() 行: 不可用 [本机方法] MediaRecorder.stop() 行: 976 MainActivity.stop() 行: 102 MainActivity$2.onClick(View) 行: 61 Button(View).performClick() 行: 5698 Button(TextView).performClick() 行: 10896 View$PerformClick.run() 行: 22565 Handler.handleCallback(Message) 行: 739 ViewRootImpl$ViewRootHandler(Handler).dispatchMessage(Message) 行: 95 Looper.loop() 行: 148 ActivityThread.main(String[]) 行: 7224 Method.invoke(Object, Object...) 行: 不可用 [本机方法] ZygoteInit$MethodAndArgsCaller.run() 行: 1230 ZygoteInit.main(String[]) 行: 1120 主程序 package com.example.recorder; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import java.io.IOException; import android.media.MediaRecorder; import android.media.AudioFormat; import android.media.AudioRecord; import android.os.Bundle; import android.os.Environment; import android.app.Activity; import android.util.Log; import android.widget.Button; import java.io.BufferedOutputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class MainActivity extends Activity { MediaRecorder audioRecorder; Button START; Button END; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //creat START=(Button)findViewById(R.id.start); END=(Button)findViewById(R.id.end); START.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { record(); } }); END.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { stop(); } }); } public void record() { if(audioRecorder==null) { audioRecorder=new MediaRecorder(); } String path=Environment.getExternalStorageDirectory().getAbsolutePath()+"/test.mp4"; File file=new File(path); if(file.exists()) file.delete(); try { file.createNewFile(); audioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); audioRecorder.setAudioEncodingBitRate(MediaRecorder.AudioEncoder.AMR_NB); audioRecorder.setOutputFile(path); audioRecorder.prepare(); audioRecorder.start(); } catch(IOException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } START.setText("recording"); } public void stop() { if(audioRecorder!=null) { audioRecorder.stop(); audioRecorder.release(); audioRecorder=null; } START.setText("录音"); } @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; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } MANIFEXT: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.recorder" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Android开发时报错我该怎么查看报错原因
我在开发的时候遇到报错,例如 MediaRecorder:stop fail -1007 我想知道怎么查看这个-1007的错误原因
部分手机录音时setAudioSource为VOICE_CALL会报start failed
在华为P8和mate7等6.0的手机上 mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); 录音来源设置为VOICE_CALL然后启动的时候会报start failed但是设置在MIC就没问题了,为啥有的手机不能通话录音,有什么解决办法吗
MediaRecorder录屏,Socket传输录屏内容报错java.lang.IllegalStateException
用模拟器调试可以运行,用真机测试在 mediaRecorder.prepare();抛异常 ``` package www.xjw.com.mymiracast2.screenrecordservice; import android.app.Notification; import android.app.Service; import android.content.Context; import android.content.Intent; import android.hardware.display.DisplayManager; import android.hardware.display.VirtualDisplay; import android.media.MediaRecorder; import android.media.projection.MediaProjection; import android.media.projection.MediaProjectionManager; import android.os.IBinder; import android.os.ParcelFileDescriptor; import java.net.Socket; /** * Created by dzjin on 2018/1/9. */ public class ScreenRecordService extends Service { private int resultCode; private Intent resultData=null; private MediaProjection mediaProjection=null; private MediaRecorder mediaRecorder=null; private VirtualDisplay virtualDisplay=null; private int mScreenWidth; private int mScreenHeight; private int mScreenDensity; private static String filePathName; private Socket receiver = null; private ParcelFileDescriptor pfd = null; private Context context=null; private String host = null; private int port = 8989; @Override public void onCreate() { super.onCreate(); //startForeground(2, new Notification()); } /** * 每次客户端通过调用startService(Intent)显式启动服务时,系统调用startService(Intent), *提供它提供的参数和表示启动请求的唯一整数标记。 * 不要直接调用这个方法。 * @param intent * @param flags * @param startId * @return */ @Override public int onStartCommand(Intent intent, int flags, int startId) { try{ resultCode=intent.getIntExtra("resultCode",-1); resultData=intent.getParcelableExtra("resultData"); mScreenWidth=intent.getIntExtra("mScreenWidth",0); mScreenHeight=intent.getIntExtra("mScreenHeight",0); mScreenDensity=intent.getIntExtra("mScreenDensity",0); filePathName=intent.getStringExtra("filePathName"); host=intent.getStringExtra("host"); port=intent.getIntExtra("port",8989); receiver = new Socket(host, port); pfd = ParcelFileDescriptor .fromSocket(receiver); mediaProjection=createMediaProjection(); mediaRecorder=createMediaRecorder(); virtualDisplay=createVirtualDisplay(); mediaRecorder.start(); }catch (Exception e) { e.printStackTrace(); } /** * START_NOT_STICKY: *从onStartCommand返回的常量(Intent, int, int):如果这个服务的进程是 *在启动时被杀死(从onStartCommand(Intent, int, int)返回后), *没有新的start意图交付给它,然后将服务从 *启动状态,在以后显式调用Context.startService(Intent)之前不要重新创建。 *服务将不会接收带有空意图的onStartCommand(Intent, int, int)调用 *因为如果没有等待交付的意图,它将不会重新启动。 */ return Service.START_NOT_STICKY; } public MediaProjection createMediaProjection(){ /** *使用getSystemService(类)检索MediaProjectionManager实例 *管理媒体放映会议。 */ return ((MediaProjectionManager)getSystemService(Context.MEDIA_PROJECTION_SERVICE)) .getMediaProjection(resultCode,resultData); /** *检索从成功的屏幕捕获请求中获得的MediaProjection。 *如果startActivityForResult()的结果不是RESULT_OK,则*将为null。 */ } private MediaRecorder createMediaRecorder(){ //用于录制音频和视频。录音控制是基于一个简单的状态机。 MediaRecorder mediaRecorder=new MediaRecorder(); //设置要录音的源。 //mediaRecorder.setAudioSource(MediaRecorder. AudioSource.CAMCORDER); //设置要录制的视频源。 mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); //设置录制过程中产生的输出的格式。 //3GPP媒体文件格式 mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS); //设置录音格式 //mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //设置录像编码比特率。 //param:以比特/秒为单位的视频编码比特率 mediaRecorder.setVideoEncodingBitRate(5*mScreenWidth*mScreenHeight); //设置录像编码器用于录像。 mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); //设置要拍摄的视频的宽度和高度。 mediaRecorder.setVideoSize(mScreenWidth,mScreenHeight); //设置要捕获视频的帧速率。 mediaRecorder.setVideoFrameRate(60); try{ mediaRecorder.setOutputFile(pfd.getFileDescriptor()); //mediaRecorder.setOutputFile(filePathName); **此次抛异常** //准备记录器开始捕捉和编码数据。 mediaRecorder.prepare(); }catch (Exception e){ e.printStackTrace(); } return mediaRecorder; } private VirtualDisplay createVirtualDisplay(){ /** *名称字符串:虚拟显示的名称,必须是非空的。这个值不能为空。 width int:虚拟显示的宽度,以像素为单位。必须大于0。 高度int:虚拟显示器的高度,以像素为单位。必须大于0。 dpi int: dpi中虚拟显示的密度。必须大于0。 标志int:虚拟显示标志的组合。有关标志的完整列表,请参见DisplayManager。 surface surface:虚拟显示内容应该呈现到的表面,如果一开始没有,则为null。 回调virtualdisplay。回调:当虚拟显示的状态改变时调用的回调,如果没有,则为空。 处理程序处理程序:应该在其上调用回调的处理程序,如果应该在调用线程的主循环程序上调用回调,则为null。 */ /** * DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR *虚拟显示标志:当没有显示内容时,允许在私有显示上镜像内容。 */ return mediaProjection.createVirtualDisplay("mediaProjection",mScreenWidth,mScreenHeight,mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,mediaRecorder.getSurface(),null,null); } @Override public void onDestroy() { super.onDestroy(); if(virtualDisplay!=null){ virtualDisplay.release(); virtualDisplay=null; } if(mediaRecorder!=null){ mediaRecorder.stop(); mediaRecorder=null; } if(mediaProjection!=null){ mediaProjection.stop(); mediaProjection=null; } } @Override public IBinder onBind(Intent intent) { System.out.println("==============================="); return null; } } ``` I/MediaRecorder: enter in file frameworks/av/media/libmedia/mediarecorder.cpp, function prepare, line 461 I/IMediaRecorder: prepare (BpMediaRecorder client) in file frameworks/av/media/libmedia/IMediaRecorder.cpp, function prepare, line 249 W/com.mymiracast2: type=1400 audit(0.0:104572): avc: denied { read write } for path="socket:[8870267]" dev="sockfs" ino=8870267 scontext=u:r:mediaserver:s0 tcontext=u:r:untrusted_app:s0:c512,c768 tclass=tcp_socket permissive=0 E/MediaRecorder: prepare failed: -38 W/zygote64: Got a deoptimization request on un-deoptimizable method void android.media.MediaRecorder._prepare() W/System.err: java.lang.IllegalStateException W/System.err: at android.media.MediaRecorder._prepare(Native Method) W/System.err: at android.media.MediaRecorder.prepare(MediaRecorder.java:1017) W/System.err: at www.xjw.com.mymiracast2.screenrecordservice.ScreenRecordService.createMediaRecorder(ScreenRecordService.java:137) W/System.err: at www.xjw.com.mymiracast2.screenrecordservice.ScreenRecordService.onStartCommand(ScreenRecordService.java:79) W/System.err: at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4151) W/System.err: at android.app.ActivityThread.-wrap21(Unknown Source:0) W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2119) W/System.err: at android.os.Handler.dispatchMessage(Handler.java:108) W/System.err: at android.os.Looper.loop(Looper.java:166) W/System.err: at android.app.ActivityThread.main(ActivityThread.java:7529) W/System.err: at java.lang.reflect.Method.invoke(Native Method) W/System.err: at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921) E/MediaRecorder: SurfaceMediaSource could not be initialized! W/System.err: java.lang.IllegalStateException: failed to get surface at android.media.MediaRecorder.getSurface(Native Method) W/System.err: at www.xjw.com.mymiracast2.screenrecordservice.ScreenRecordService.createVirtualDisplay(ScreenRecordService.java:160) at www.xjw.com.mymiracast2.screenrecordservice.ScreenRecordService.onStartCommand(ScreenRecordService.java:80) W/System.err: at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4151) at android.app.ActivityThread.-wrap21(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2119) at android.os.Handler.dispatchMessage(Handler.java:108) W/System.err: at android.os.Looper.loop(Looper.java:166) at android.app.ActivityThread.main(ActivityThread.java:7529) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921) D/StrictMode: StrictMode policy violation; ~duration=7334 ms: android.os.StrictMode$StrictModeNetworkViolation: policy=65543 violation=4 at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1466) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:356) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:201) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:183) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356) at java.net.Socket.connect(Socket.java:616) at java.net.Socket.connect(Socket.java:565) at java.net.Socket.<init>(Socket.java:445) at java.net.Socket.<init>(Socket.java:217) at www.xjw.com.mymiracast2.screenrecordservice.ScreenRecordService.onStartCommand(ScreenRecordService.java:74) at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4151) at android.app.ActivityThread.-wrap21(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2119) at android.os.Handler.dispatchMessage(Handler.java:108) at android.os.Looper.loop(Looper.java:166) at android.app.ActivityThread.main(ActivityThread.java:7529) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921) D/StrictMode: StrictMode policy violation; ~duration=7332 ms: android.os.StrictMode$StrictModeNetworkViolation: policy=65543 violation=4 ``` ```
android 录音功能报错
* 做安卓的录音功能代码如下: mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); File audioFile = null; try { audioFile = File.createTempFile("record_369" , ".amr"); } catch (IOException e) { e.printStackTrace(); } mediaRecorder.setOutputFile(audioFile.getAbsolutePath()); try { mediaRecorder.prepare(); } catch (IOException e) { e.printStackTrace(); } mediaRecorder.start(); 一直会报 java.lang.RuntimeException: setAudioSource failed. 异常 而且添加了权限 <uses-permission android:name="android.permission.RECORD_AUDIO"/> 请问这是怎么回事啊?
关于安卓页面跳转的问题
做了两个页面与页面跳转按钮,二页面想使用ListActivity,但是继承了ListActivity类后闪退 继承Activity时运行正常,但不能看到List效果,请大神帮忙看下代码,感谢 DEBUG 线程 [main](已暂挂(异常 RuntimeException)) ActivityThread.performLaunchActivity(ActivityThread$ActivityClientRecord, Intent) 行: 3254 ActivityThread.handleLaunchActivity(ActivityThread$ActivityClientRecord, Intent) 行: 3350 ActivityThread.access$1100(ActivityThread, ActivityThread$ActivityClientRecord, Intent) 行: 223 ActivityThread$H.handleMessage(Message) 行: 1794 ActivityThread$H(Handler).dispatchMessage(Message) 行: 102 Looper.loop() 行: 148 ActivityThread.main(String[]) 行: 7224 Method.invoke(Object, Object...) 行: 不可用 [本机方法] ZygoteInit$MethodAndArgsCaller.run() 行: 1230 ZygoteInit.main(String[]) 行: 1120 报错日志 04-11 10:03:01.957: E/MotionRecognitionManager(30956): mSContextService = android.hardware.scontext.ISContextService$Stub$Proxy@b530bca 04-11 10:03:01.967: E/MotionRecognitionManager(30956): motionService = com.samsung.android.motion.IMotionRecognitionService$Stub$Proxy@82fc13b 04-11 10:03:01.967: E/MotionRecognitionManager(30956): motionService = com.samsung.android.motion.IMotionRecognitionService$Stub$Proxy@82fc13b 04-11 10:03:01.967: D/AndroidRuntime(30956): Shutting down VM 04-11 10:03:01.967: E/AndroidRuntime(30956): FATAL EXCEPTION: main 04-11 10:03:01.967: E/AndroidRuntime(30956): Process: com.example.audiorecord, PID: 30956 04-11 10:03:01.967: E/AndroidRuntime(30956): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.audiorecord/com.example.audiorecord.Activity02}: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list' 04-11 10:03:01.967: E/AndroidRuntime(30956): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3254) 04-11 10:03:01.967: E/AndroidRuntime(30956): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3350) 04-11 10:03:01.967: E/AndroidRuntime(30956): at android.app.ActivityThread.access$1100(ActivityThread.java:223) 04-11 10:03:01.967: E/AndroidRuntime(30956): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 04-11 10:03:01.967: E/AndroidRuntime(30956): at android.os.Handler.dispatchMessage(Handler.java:102) 04-11 10:03:01.967: E/AndroidRuntime(30956): at android.os.Looper.loop(Looper.java:148) 04-11 10:03:01.967: E/AndroidRuntime(30956): at android.app.ActivityThread.main(ActivityThread.java:7224) 04-11 10:03:01.967: E/AndroidRuntime(30956): at java.lang.reflect.Method.invoke(Native Method) 04-11 10:03:01.967: E/AndroidRuntime(30956): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 04-11 10:03:01.967: E/AndroidRuntime(30956): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 04-11 10:03:01.967: E/AndroidRuntime(30956): Caused by: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list' 04-11 10:03:01.967: E/AndroidRuntime(30956): at android.app.ListActivity.onContentChanged(ListActivity.java:243) 04-11 10:03:01.967: E/AndroidRuntime(30956): at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:479) 04-11 10:03:01.967: E/AndroidRuntime(30956): at android.app.Activity.setContentView(Activity.java:2388) 04-11 10:03:01.967: E/AndroidRuntime(30956): at com.example.audiorecord.Activity02.onCreate(Activity02.java:38) 04-11 10:03:01.967: E/AndroidRuntime(30956): at android.app.Activity.performCreate(Activity.java:6877) 04-11 10:03:01.967: E/AndroidRuntime(30956): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1136) 04-11 10:03:01.967: E/AndroidRuntime(30956): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3207) 04-11 10:03:01.967: E/AndroidRuntime(30956): ... 9 more Activity1: package com.example.audiorecord; import java.io.File; import java.io.IOException; import android.app.Activity; import android.media.MediaPlayer; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.content.Intent; public class RecordActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); super.onCreate(savedInstanceState); /* 设置显示main.xml布局*/ setContentView(R.layout.main); /* findViewById(R.id.button1)取得布局main.xml中的button1 */ Button button = (Button) findViewById(R.id.button1); /* 监听button的事件信息*/ button.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { /* 新建一个Intent对象*/ Intent intent = new Intent(); /* 指定intent要启动的类*/ intent.setClass(RecordActivity.this, Activity02.class); /* 启动一个新的Activity */ startActivity(intent); /* 关闭当前的Activity */ RecordActivity.this.finish(); } }); } } Activity2 package com.example.audiorecord; import java.io.File; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.app.ListActivity; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.TextView; public class Activity02 extends ListActivity{ //声明 private List<String> items = null;//存放名称 private List<String> paths = null;//存放路径 private String rootPath = "/"; private TextView tv; private Button Back; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* 设置显示main2布局*/ setContentView(R.layout.main2); /* findViewById(R.id.button2)取得布局main.xml中的button2 */ /* 监听button的事件信息*/ tv = (TextView) this.findViewById(R.id.TextView); this.getFileDir(rootPath);//获取rootPath目录下的文件. Back = (Button) findViewById(R.id.back); Back.setOnClickListener(new BackListener()); } class BackListener implements OnClickListener { public void onClick(View v) { Intent intent = new Intent(); /* 指定intent要启动的类*/ intent.setClass(Activity02.this, RecordActivity.class); /* 启动一个新的Activity */ startActivity(intent); /* 关闭当前的Activity */ Activity02.this.finish(); } } public void getFileDir(String filePath) { try{ this.tv.setText("当前路径:"+filePath);// 设置当前所在路径 items = new ArrayList<String>(); paths = new ArrayList<String>(); File f = new File(filePath); File[] files = f.listFiles();// 列出所有文件 // 如果不是根目录,则列出返回根目录和上一目录选项 if (!filePath.equals(rootPath)) { items.add("返回根目录"); paths.add(rootPath); items.add("返回上一层目录"); paths.add(f.getParent()); } // 将所有文件存入list中 if(files != null){ int count = files.length;// 文件个数 for (int i = 0; i < count; i++) { File file = files[i]; items.add(file.getName()); paths.add(file.getPath()); } } ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items); this.setListAdapter(adapter); }catch(Exception ex){ ex.printStackTrace(); } } @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); String path = paths.get(position); File file = new File(path); //如果是文件夹就继续分解 if(file.isDirectory()){ this.getFileDir(path); }else{ new AlertDialog.Builder(this).setTitle("提示").setMessage(file.getName()+" 是一个文件!").setPositiveButton("OK", new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialog, int which) { } }).show(); } }} MANIFEST <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.audiorecord" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="4" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".RecordActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".Activity02"></activity> </application> </manifest>
Android关于录制音频时mediaRecorder.setAudioSamplingRate()的大小
mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mediaRecorder.setAudioChannels(1); //采样频率和bit频率有待提高(前提不会导致bug) mediaRecorder.setAudioSamplingRate(8000); mediaRecorder.setAudioEncodingBitRate(8000); 当我把setAudioSamplingRate(8000)的参数调到10000以上的时候,代码就崩溃了。 求大神解惑,谢谢
android mediarecorder 横屏录制的问题
![图片说明](https://img-ask.csdn.net/upload/201702/09/1486606016_610213.png) 怎么拍出来的效果跟图片一样
安卓录制AMR格式音频声音过小怎么办?
android 使用系统MediaRecorder Api录制 16kHz amr_wb音频声音过小,有办法在此基础上调整参数提高录制音量吗?或者播放时候将音量调大一些?![图片说明](https://img-ask.csdn.net/upload/201903/31/1554009788_127247.jpg)![图片说明](https://img-ask.csdn.net/upload/201903/31/1554009800_592741.jpg)
Android 录制视频以流的形式进行传输问题
mediarecorder.setOutputFile(sender.getFileDescriptor()); 这句话,总是出错 。在4.2.2的版本上毫无问题。在5.0以上的系统运行就崩。 下面是代码和贴图。![图片说明](https://img-ask.csdn.net/upload/201602/28/1456623882_18945.png) ![图片说明](https://img-ask.csdn.net/upload/201602/28/1456624027_71182.png)
关于MediaRecorder录制视频的时间问题
MediaRecorder录制视频的时间可以设置为无限制的吗?
使用MediaRecorder录制视频和实时传输
android开发,我要实现的是:在服务器端使用MediaRecorder录制mp4的视频, 同时要把数据流通过rtsp实时传输到客户端。因为MediaRecorder设置setOutputFile时, 只能选择文件或者localsocket的一种方式输出,请问要怎样才能把MediaRecorder输出的 数据流分成两份,一份用来录制视频,一份用来作流媒体的输入流?
使用MediaRecorder录制视频 录完后没有生成文件
代码如下:package com.example.meadiarecorder3; import java.io.File; import java.io.IOException; import android.app.Activity; import android.content.pm.ActivityInfo; import android.graphics.PixelFormat; import android.hardware.Camera; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.view.WindowManager; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity implements SurfaceHolder.Callback{ private SurfaceView mSurfaceView; private SurfaceHolder mSurfaceHolder; private TextView tvTime; private TextView tvSize; private Button btnStart; private Button btnStop; private Button btnCancel; private MediaRecorder recorder; private Handler handler; private Camera camera; private boolean recording; // 记录是否正在录像,fasle为未录像, true 为正在录像 private int minute = 0; private int second = 0; private String time = ""; private String size = ""; private String name; private File viodFile; private Runnable timeRun = new Runnable() { @Override public void run() { long fileLength = viodFile.length(); if (fileLength < 1024 && fileLength > 0) { size = String.format("%dB/10M", fileLength); } else if (fileLength >= 1024 && fileLength < (1024 * 1024)) { fileLength = fileLength / 1024; size = String.format("%dK/10M", fileLength); } else if (fileLength > (1024 * 1024 * 1024)) { fileLength = (fileLength / 1024) / 1024; size = String.format("%dM/10M", fileLength); } second++; if (second == 60) { minute++; second = 0; } time = String.format("%02d:%02d", minute, second); tvSize.setText(viodFile.getAbsolutePath()); tvTime.setText(time); handler.postDelayed(timeRun, 1000); } }; private Button start;// 开始录制按钮 private Button stop;// 停止录制按钮 private MediaRecorder mediarecorder;// 录制视频的类 private SurfaceView surfaceview;// 显示视频的控件 // 用来显示视频的一个接口,我靠不用还不行,也就是说用mediarecorder录制视频还得给个界面看 // 想偷偷录视频的同学可以考虑别的办法。。嗯需要实现这个接口的Callback接口 private SurfaceHolder surfaceHolder; private String fileName; private SurfaceHolder holder; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏 // 设置横屏显示 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); // 选择支持半透明模式,在有surfaceview的activity中使用。 getWindow().setFormat(PixelFormat.TRANSLUCENT); setContentView(R.layout.activity_main); fileName = Environment.getExternalStorageDirectory().getAbsolutePath(); name = "video_" + System.currentTimeMillis() + ".mp4"; fileName += File.separator + File.separator + "Ruanko_Jobseeker" + File.separator + name; name = "video_" + System.currentTimeMillis() + ".mp4"; tvSize = (TextView) findViewById(R.id.tv_video_size); tvTime = (TextView) findViewById(R.id.tv_video_time); handler= new Handler(); init(); } private void init() { start = (Button) this.findViewById(R.id.start); stop = (Button) this.findViewById(R.id.stop); start.setOnClickListener(new TestVideoListener()); stop.setOnClickListener(new TestVideoListener()); surfaceview = (SurfaceView) this.findViewById(R.id.surfaceview); holder = surfaceview.getHolder(); holder.addCallback(this); // holder加入回调接口 // setType必须设置,要不出错. holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } class TestVideoListener implements OnClickListener { private static final String TAG = "MainActivity"; @Override public void onClick(View v) { if (v == start) { try { viodFile = new File(Environment.getExternalStorageDirectory().getCanonicalFile() + "/myvideo.mp4"); if (!Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { Toast.makeText(getApplicationContext(), "SD卡不存在,请插卡", 0).show(); return; }else{ if(!viodFile.exists()){ viodFile.getParentFile().mkdirs(); viodFile.createNewFile(); } } mediarecorder = new MediaRecorder();// 创建mediarecorder对象 // 设置录制视频源为Camera(相机) mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 设置从麦克风采集声音 mediarecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4 mediarecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // 设置录制的视频编码h263 h264 mediarecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mediarecorder.setAudioEncoder(MediaRecorder.VideoEncoder.DEFAULT); // 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错 mediarecorder.setVideoSize(176, 144); // 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错 mediarecorder.setVideoFrameRate(20); mediarecorder.setPreviewDisplay(holder.getSurface()); // 设置视频文件输出的路径 mediarecorder.setOutputFile(viodFile.getAbsolutePath()); System.out.println("viodFile.getAbsolutePath()的值为:"+viodFile.getAbsolutePath()); // 准备录制 mediarecorder.prepare(); // 开始录制 mediarecorder.start(); handler.post(timeRun); } catch (IOException e2) { e2.printStackTrace(); } } if (v == stop) { Log.i(TAG, viodFile.toString()); if (mediarecorder != null) { handler.removeCallbacks(timeRun); // 停止录制 mediarecorder.stop(); // 释放资源 mediarecorder.release(); mediarecorder = null; } } } } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder surfaceHolder = holder; } public void surfaceCreated(SurfaceHolder holder) { // 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder surfaceHolder = holder; } public void surfaceDestroyed(SurfaceHolder holder) { // surfaceDestroyed的时候同时对象设置为null surfaceview = null; holder = null; mediarecorder = null; } } 代码是没问题的 可以运行 可以录制和暂停 设置录制视频地址的代码是 viodFile = new File(Environment.getExternalStorageDirectory().getCanonicalFile() + "/myvideo.mp4"); mediarecorder.setOutputFile(viodFile.getAbsolutePath()); 这两行已经把地址设置好了 按道理来说 录完之后就可以找到文件了 但是没有! 求助各位大神,到底是哪里出了问题,有录制视频的号框架推荐就指点一二,或者有更好的代码就发小弟一份,不胜感激。。
在 MediaRecorder 如何设计时间计算?
我使用 MediaRecorder 创建了程序,我想显示音频记录的时间期限。MediaRecorder 只是用来录制声音。那如何显示时间呢?
130 个相见恨晚的超实用网站,一次性分享出来
相见恨晚的超实用网站 持续更新中。。。
我花了一夜用数据结构给女朋友写个H5走迷宫游戏
起因 又到深夜了,我按照以往在csdn和公众号写着数据结构!这占用了我大量的时间!我的超越妹妹严重缺乏陪伴而 怨气满满! 而女朋友时常埋怨,认为数据结构这么抽象难懂的东西没啥作用,常会问道:天天写这玩意,有啥作用。而我答道:能干事情多了,比如写个迷宫小游戏啥的! 当我码完字准备睡觉时:写不好别睡觉! 分析 如果用数据结构与算法造出东西来呢? ...
对计算机专业来说学历真的重要吗?
我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...
字节跳动视频编解码面经
三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时想着能进去就不错了,管他哪个岗呢,就同意了面试...
win10系统安装教程(U盘PE+UEFI安装)
一、准备工作 u盘,电脑一台,win10原版镜像(msdn官网) 二、下载wepe工具箱 极力推荐微pe(微pe官方下载) 下载64位的win10 pe,使用工具箱制作启动U盘打开软件, 选择安装到U盘(按照操作无需更改) 三、重启进入pe系统 1、关机后,将U盘插入电脑 2、按下电源后,按住F12进入启动项选择(技嘉主板是F12) 选择需要启...
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, ...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Ol4网格生成以及优化
概述 先描述一下大致场景:以0.05为单元格大小生成网格,并在地图上绘制,绘制的时候需要区分海陆。本文以此需求为契机,简单描述一下该需求的实现以及如何来优化。 效果 实现 优化前 var source = new ol.source.Vector({ features: [] }); var vector = new ol.layer.Vector({ source...
11月19日科技资讯|华为明日发布鸿蒙整体战略;京东宣告全面向技术转型;Kotlin 1.3.60 发布
「极客头条」—— 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。扫描上方二维码进入 CSDN App 可以收听御姐萌妹 Style 的人工版音频哟。 一分钟速览新闻点! 6G 专家组成员:速率是 5G 的 10 至 100 倍,预计 2030 年商用 雷军:很多人多次劝我放弃WPS,能坚持下来并不是纯粹的商业决定 ...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n...
iOS Bug 太多,苹果终于坐不住了!
开源的 Android 和闭源的 iOS,作为用户的你,更偏向哪一个呢? 整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 毋庸置疑,当前移动设备操作系统市场中,Android 和 iOS 作为两大阵营,在相互竞争的同时不断演进。不过一直以来,开源的 Android 吸引了无数的手机厂商涌入其中,为其生态带来了百花齐放的盛景,但和神秘且闭源的 iOS 系统相比,不少网友...
Python语言高频重点汇总
Python语言高频重点汇总 GitHub面试宝典仓库 回到首页 目录: Python语言高频重点汇总 目录: 1. 函数-传参 2. 元类 3. @staticmethod和@classmethod两个装饰器 4. 类属性和实例属性 5. Python的自省 6. 列表、集合、字典推导式 7. Python中单下划线和双下划线 8. 格式化字符串中的%和format 9. 迭代器和生成器 10...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip installselenium -ihttps://pypi.tuna.tsinghua.edu.cn/simple/ ...
程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
程序员该看的几部电影
1、骇客帝国(1999) 概念:在线/离线,递归,循环,矩阵等 剧情简介: 不久的将来,网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂,并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?如何...
蓝桥杯知识点汇总:基础知识和常用算法
文章目录基础语法部分:算法竞赛常用API:算法部分数据结构部分 此系列包含蓝桥杯绝大部分所考察的知识点,以及真题题解~ 基础语法部分: 备战蓝桥杯java(一):一般输入输出 和 快速输入输(BufferedReader&amp;BufferedWrite) 备战蓝桥杯java(二):java编程规范和常用数据类型 备战蓝桥杯java(三):常用功能符以及循环结构和分支结构 备战蓝桥杯java(四...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
@程序员,如何花式构建线程?
作者 |曾建责编 | 郭芮出品 | CSDN(ID:CSDNnews)在项目和业务的开发中,我们难免要经常使用线程来进行业务处理,使用线程可以保证我们的业务在相互处理之间可以保证原子性...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
实现简单的轮播图(单张图片、多张图片)
前言 刚学js没多久,这篇博客就当做记录了,以后还会完善的,希望大佬们多多指点。ps:下面出现的都是直接闪动,没有滑动效果的轮播图。 单张图片的替换 · ...
强烈推荐10本程序员在家读的书
很遗憾,这个春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 有些读者私下问我,窝了几天,有点颓丧,能否推荐几本书在家里看看。我花了一天的时间,挑选了 10 本我最喜欢的书,你可以挑选感兴趣的来读一读。读书不仅可以平复恐惧的压力,还可以对未来充满希望,毕竟苦难终将会...
Linux自学篇——linux命令英文全称及解释
man: Manual 意思是手册,可以用这个命令查询其他命令的用法。 pwd:Print working directory 意思是密码。 su:Swith user 切换用户,切换到root用户 cd:Change directory 切换目录 ls:List files 列出目录下的文件 ps:Process Status 进程状态 mkdir:Make directory ...
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。
疫情数据接口api
返回json示例 { "errcode":0,//0标识接口正常 "data":{ "date":"2020-01-30 07:47:23",//实时更新时间 "diagnosed":7736,//确诊人数 "suspect":12167,//疑是病例人数 "death":170,//死亡人数 "cur...
相关热词 c#开发的dll注册 c#的反射 c# grid绑定数据源 c#多线程怎么循环 c# 鼠标左键 c# char占位符 c# 日期比较 c#16进制转换为int c#用递归求顺序表中最大 c#小型erp源代码
立即提问