在 MediaRecorder 如何设计时间计算?

我使用 MediaRecorder 创建了程序,我想显示音频记录的时间期限。MediaRecorder 只是用来录制声音。那如何显示时间呢?

2个回答

在记录开始的 System.currentTimeMillis(); 方法中设置 start_time 方法。
然后使用 Runnable 可以执行一个循环,直到停止记录。

final Handler handler = new Handler();
Runnable update_runnable = new Runnable() {
    public void run() {
        updateTextView();
    }
};
Then with the updateTextView() you'd do something like this:

long duration = (int) ((System.currentTimeMillis() - start_time) / 1000);
// ... set TextView with duration value
handler.postDelayed(update_runnable, 1000); /

我觉得在启动start()之后即开始记时操作
可开启个线程刷新时间记录
当点击停止就将记时的run里的while(iFlag)设为false就行了,不知是你想的意思不
注意模拟器上不方便测试,以下代码供参考

@Override  //test code
    public void onClick(View v) {        
        switch (v.getId()) {  
        case R.id.btnStart:       
            System.out.println("---开始录音---");                 
            if (!Environment.getExternalStorageState().equals(  
                    Environment.MEDIA_MOUNTED)) {  
                Toast.makeText(RecordSoundDemoActivity.this, "SD卡不存在",  
                        Toast.LENGTH_LONG).show();  
                return;  
            }        
            try {  
                mediaRecorder = new MediaRecorder();  
                // 创建音频输出路径  
                soundFile = new File(Environment.getExternalStorageDirectory()  
                        .getCanonicalPath() + File.separator + "sound.3gp");  
                // 设置录音的来源
                mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);  
                // 设置录制的声音输出格式  
                mediaRecorder  
                        .setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);  
                // 设置声音的编码格式  
                mediaRecorder  
                        .setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);  
                // 设置录音的输出文件路径  
                mediaRecorder.setOutputFile(soundFile.getAbsolutePath());      
                // 做预期准备  
                mediaRecorder.prepare();  
                // 开始录音  
                mediaRecorder.start();  
                //start new thread here...
            } catch (Exception e) {  
                // TODO: handle exception  
            }       
            break;      
        case R.id.btnStop:        
            System.out.println("---停止录音---");  
            if (soundFile != null && soundFile.exists()) {  
                mediaRecorder.stop();  
                // 释放资源  
                mediaRecorder.release();  
                mediaRecorder = null;  
            }  
            break;  
        default:  
            break;  
        }       
    } 
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于MediaRecorder录制视频的时间问题
MediaRecorder录制视频的时间可以设置为无限制的吗?
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以上的时候,代码就崩溃了。 求大神解惑,谢谢
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"); } ```
使用MediaRecorder录制视频和实时传输
android开发,我要实现的是:在服务器端使用MediaRecorder录制mp4的视频, 同时要把数据流通过rtsp实时传输到客户端。因为MediaRecorder设置setOutputFile时, 只能选择文件或者localsocket的一种方式输出,请问要怎样才能把MediaRecorder输出的 数据流分成两份,一份用来录制视频,一份用来作流媒体的输入流?
android mediarecorder 和 LocalSocket 的问题
android mediarecorder 和 LocalSocket 和 LocalServerSocket的问题 在设置mediarecorder的setOutputFile(参数)参数中,为什么要用LocalServerSocket.accept();所返回的LocalSocket对象,而不使用new LocalSocket对象
MediaRecorder.VideoSource.SURFACE怎么那用
5.0以上API里面得 MediaRecorder.VideoSource.SURFACE怎么用,SURFACE怎么设定,谁能给段代码么
mediaRecorder通过localsocket保存MP4文件
mediaRecorder抓取屏幕图像,使用localsocket,其中 mediaRecorder.setOutputFile(sender.getFileDescriptor()); 现在可以从localsocket获取到数据,想要保存到本地文件,怎样进行h264编码?
Android 使用mediarecorder能录制wav的录音文件吗?
我使用AuidoRecorder录制,发现使用单声道录制后的声音像是变声了的,所有想使用mediarecorder录制,他能录制wav格式的文件吗?
使用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()); 这两行已经把地址设置好了 按道理来说 录完之后就可以找到文件了 但是没有! 求助各位大神,到底是哪里出了问题,有录制视频的号框架推荐就指点一二,或者有更好的代码就发小弟一份,不胜感激。。
在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; } } ```
android 用MediaRecorder 录制时改变预览的界面?
请问一下,用MediaRecorder 录制视频时,当开始录制之后,我想改变预览界面的大小,有什么方法吗?(我通过 LayoutParams 来改变,虽然预览显示的界面是变化了,可是当我录制结后之后,视频播出来是在我设置LayoutParams 之后的视频画面是静止的了,只有声音,画面停住了)。。。。请问,这又是什么问题导致的呢?
MediaRecorder通过localsocket怎样实现录屏发送到流媒体并保存一份本地文件?
如题,用MediaRecorder录屏,现在的需求是能够发送流媒体的同时还能保存为一份本地文件,该如何实现?
android MediaRecorder录像,请问怎么实现每隔30秒自动存一下文件 ?
android MediaRecorder录像,请问怎么实现每隔30秒自动存一下文件 ?在代码中加入mediaRecorder.setMaxDuration(30000);,只是30秒后停止录像,不能继续录,请问如循环的录,直到我点击停止按钮录像才停止?请问大家如何实现呢?谢谢!
Android调用mediarecorder录制视频,只能录十秒,这个怎么解决
我用Eclipse做了一个视频录制软件,但是这个最多只能录制十秒的视频,调用了mediarecorder方法, public void recorder() { try { myRecAudioFile = File.createTempFile("video", ".3gp",dir); //创建临时文件 recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); //视频源 recorder.setPreviewDisplay(mSurfaceHolder.getSurface()); //预览 recorder.setAudioSource(MediaRecorder.AudioSource.MIC); //录音源为麦克风 recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //输出格式为3gp recorder.setVideoSize(720, 540); //视频尺寸 recorder.setVideoFrameRate(15); //视频帧频率 recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); //视频编码 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //音频编码 recorder.setMaxDuration(10000); //最大期限 recorder.setOutputFile(myRecAudioFile.getAbsolutePath()); //保存路径 recorder.prepare(); recorder.start(); } catch (IOException e) { e.printStackTrace(); } }
Android 中MediaRecorder+SurfaceView 录制视频的时图像变形
项目需要一个能录制十分钟左右自动停止的功能,找SDK发现满足不了需求,没办法就自己写了 基本都写完了,但是在录制的时候图像会拉伸变形,查了好多资料一直也没有一个好办法,现在 我解决了预览变形的,下面不知道怎么弄了,请教那位大神帮助一下 MediaRecorder配置类 if (!isRecorder && mMediaRecorder == null) { mMediaRecorder = new MediaRecorder(); try { mMediaRecorder.setCamera(mCamera); // 设置从摄像头采集图像 mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 设置从麦克风采集声音(或来自录像机的声音AudioSource.CAMCORDER) mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置视频文件的输出格式 // 必须在设置声音编码格式、图像编码格式之前设置 mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // mMediaRecorder.setMaxDuration(1000); // 设置图像编码的格式 mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); //mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); //Use myVideoSize from above mMediaRecorder.setVideoSize(320, 240); // 设置声音编码的格式 mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); // mMediaRecorder.setOrientationHint(180);// 输出旋转90度,保持竖屏录制 /* * mMediaRecorder.setAudioChannels(1);//1单声道 2 多声道 * mMediaRecorder.setAudioSamplingRate(12500); * //设置录制的音频采样率——频率越高,音质越好 * mMediaRecorder.setAudioEncodingBitRate(16); // 设置录制的音频编码比特率 */ // mMediaRecorder.setOrientationHint(180);// 输出旋转90度,保持竖屏录制 // 每秒 4帧 mMediaRecorder.setVideoFrameRate(30); mMediaRecorder.setVideoEncodingBitRate(10 * 1024 * 1024); // 文件输出路劲 mMediaRecorder.setOutputFile(mVecordFile.getAbsolutePath()); mMediaRecorder.setPreviewDisplay(mHolder.getSurface()); mMediaRecorder.prepare(); // mCamera.startPreview(); mMediaRecorder.start(); } 设置照相机 if (mCamera != null) { freeCameraResource(); } try { mCamera = Camera.open(); if(mCamera != null && isOpenCamera) setCameraParams(); mCamera.startPreview(); mCamera.setDisplayOrientation(0); mCamera.setPreviewDisplay(mHolder); mCamera.unlock(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 设置照相机 private void setCameraParams() { // TODO Auto-generated method stub if (mCamera != null) { params = mCamera.getParameters(); WindowManager manager = (WindowManager) VideotTranscribe.this.getSystemService(VideotTranscribe.this.WINDOW_SERVICE); Display display = manager.getDefaultDisplay(); // Point screenResolution = new Point(display.getWidth(), display.getHeight()); //Point p = getBestCameraResolution(params, screenResolution); params.setPreviewSize(display.getWidth(),display.getHeight());//防止录制预览图像变形 mCamera.setParameters(params); params = mCamera.getParameters(); } 跪求大神指导
Android 利用mediarecorder录制视频后用ThumbnailUtils类切图返回空
如题,因为兼容性问题,将录制时候的MediaRecorder参数如下: recorder = new MediaRecorder(); recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); //指定OutputFormat,我们选择默认 //其他格式,视频编码格式和音频编码格式都是默认 recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); recorder.setVideoSize(640, 480); //设置选择角度,顺时针方向,因为默认是逆向90度的,这样图像就是正常显示了,这里设置的是观看保存后的视频的角度 recorder.setOrientationHint(90); 其他手机正常,当用华为4.04的系统和vivo4.02使用自己写的代码录制视频以后,采用ThumbnailUtils截取视频截图返回为空,但是选取本地的其他视频截图返回正常,可能是什么原因?求大牛指导!
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录制视频,socket传送数据,接收后的数据不能播放
我是使用了mediarecorder录制数据, mediarecorder.setOutputFile(sender.getFileDescriptor());在使用socket传输数据。接收数据后没有对数据进行回写,视频数据不能播放,有哪位大神能指点一下!怎么对收到的数据进行回写,变成能够播放的MP4视频文件。
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,再次跪求指点。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、PDF搜索网站推荐 对于大部
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
Vue + Spring Boot 项目实战(十四):用户认证方案与完善的访问拦截
本篇文章主要讲解 token、session 等用户认证方案的区别并分析常见误区,以及如何通过前后端的配合实现完善的访问拦截,为下一步权限控制的实现打下基础。
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入  假设现有4个人
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。 这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。 用知识改变命运,让我们的家人过上更好的生活。 目录一、杨辉三角的介绍二、杨辉三角的算法思想三、代码实现1.第一种写法2.第二种写法 一、杨辉三角的介绍 百度
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
SQL-小白最佳入门sql查询一
一 说明 如果是初学者,建议去网上寻找安装Mysql的文章安装,以及使用navicat连接数据库,以后的示例基本是使用mysql数据库管理系统; 二 准备前提 需要建立一张学生表,列分别是id,名称,年龄,学生信息;本示例中文章篇幅原因SQL注释略; 建表语句: CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // dosho
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。 码农:你知道get和post请求到底有什么区别? 程序员:你看这篇就知道了。 码农:你月薪三万了? 程序员:嗯。 码农:你是怎么做到的? 程序员:
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
      11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员
Android 9.0系统新特性,对刘海屏设备进行适配
其实Android 9.0系统已经是去年推出的“老”系统了,这个系统中新增了一个比较重要的特性,就是对刘海屏设备进行了支持。一直以来我也都有打算针对这个新特性好好地写一篇文章,但是为什么直到拖到了Android 10.0系统都发布了才开始写这篇文章呢?当然,一是因为我这段时间确实比较忙,今年几乎绝大部分的业余时间都放到写新书上了。但是最主要的原因并不是这个,而是因为刘海屏设备的适配存在一定的特殊性
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI 算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下
日均350000亿接入量,腾讯TubeMQ性能超过Kafka
整理 | 夕颜出品 | AI科技大本营(ID:rgznai100) 【导读】近日,腾讯开源动作不断,相继开源了分布式消息中间件TubeMQ,基于最主流的 OpenJDK8开发的
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车? 某胡同口的煎饼摊一年能卖出多少个煎饼? 深圳有多少个产品经理? 一辆公交车里能装下多少个乒乓球? 一
相关热词 c# plc s1200 c#里氏转换原则 c# 主界面 c# do loop c#存为组套 模板 c# 停掉协程 c# rgb 读取图片 c# 图片颜色调整 最快 c#多张图片上传 c#密封类与密封方法
立即提问