android中mediaPlayer+surfaceView播放视频如何实现控制video的大小

现在我使用了mediaPlayer与surfaceView播放视频,但是需要实现视频显示全屏和非全屏的切换,我想的一个办法是通过动态改变surfaceView的大小,然后
在surfaceChanged()函数中调用mSurfaceHolder.setSizeFromLayout();使得surface的大小也随之改变了,但是现在问题是:mediaPlayer.getVideoHeight()获取的video的大小一直没有改变,其一直等于播放的视频源的分辨率。请教下如何才能实现改变video的大小。

1个回答

没人嘛,其实也是想问下如何改变mediaPlayer播放比例:视频源为4:3的标清源,想让其显示为16:9的格式显示

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
android中mediaPlayer+surfaceView播放视频如何实现控制video的大小
现在我使用了mediaPlayer与surfaceView播放视频,但是需要实现视频显示全屏和非全屏的切换,我想的一个办法是通过动态改变surfaceView的大小,然后 在surfaceChanged()函数中调用mSurfaceHolder.setSizeFromLayout();使得surface的大小也随之改变了,但是现在问题是:mediaPlayer.getVideoHeight()获取的video的大小一直没有改变,其一直等于播放的视频源的分辨率。请教下如何才能实现改变video的大小。
android使用MediaPlayer和SurfaceView播放视频怎样设置按原始比例播放
现在的情况是,视频大小总是铺满SurfaceView,怎样可以在SurfaceView中按照视频本身的比例播放呢
Android 使用MediaPlayer+SurfaceView播放视频变形
全屏播放怎么可以让网络获取来的视频原比例填充在SurfaceView中,就像imageView里的scaleType="centerCrop"这个属性一样那样把视频填充在SurfaceView上
Android mediaPlayer怎样实现视频缓冲?
mediaPlayer加上SurfaceView怎样实现视频缓冲?
android surfaceView+mediaplayer播放视频,实现半屏与全屏切换
当视频全屏播放时,界面转为横屏,但会重新执行oncreate方法,所以视频部分没有全 屏播放;只有再次点击全屏时,视频才变为全屏;如何实现现在的播放器如:优酷、爱 奇艺等一样,点击全屏就可以横屏直接全屏呢?那位朋友做过啊,指点指点吧!
关于MediaPlayer+SurfaceView播放本地视频
如下代码报错prepareAsync called in state 1 java.lang.IllegalStateException at android.media.MediaPlayer._prepare(Native Method) at android.media.MediaPlayer.prepare(MediaPlayer.java:1184) at sangfei.android.com.audiotestapk.VideoMainActivity.startPlayFirstVideo(VideoMainActivity.java:165) at sangfei.android.com.audiotestapk.VideoMainActivity.initFirstPlayer(VideoMainActivity.java:159) at sangfei.android.com.audiotestapk.VideoMainActivity.surfaceCreated(VideoMainActivity.java:129) `` @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { // TODO 自动生成的方法存根 } @Override public void surfaceCreated(SurfaceHolder arg0) { //surfaceView创建完毕后,首先获取该直播间所有视频分段的url // getVideoUrls(); //然后初始化播放手段视频的player对象 initFirstPlayer(); } @Override public void surfaceDestroyed(SurfaceHolder arg0) { // TODO 自动生成的方法存根 } /* * 初始化播放首段视频的player */ private void initFirstPlayer() { firstPlayer = new MediaPlayer(); firstPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); firstPlayer.setDisplay(surfaceHolder); firstPlayer .setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { onVideoPlayCompleted(mp); } }); //设置cachePlayer为该player对象 cachePlayer = firstPlayer; initNexttPlayer(); //player对象初始化完成后,开启播放 startPlayFirstVideo(); } private void startPlayFirstVideo() { try { firstPlayer.setDataSource(String.valueOf(getList().get(currentVideoIndex))); } catch (IOException e) { e.printStackTrace(); } try { firstPlayer.prepare(); } catch (IOException e) { e.printStackTrace(); } firstPlayer.start(); }` ```
android 双surfaceView分别播放视频及显示图片的方法?
1. surfaceView1 显示图片5秒 2. surfaceView2 播放视频文件(用MediaPlayer方法) 3. surfaceView1 再次显示图片5秒 4. surfaceView2 再次播放视频文件 ,........., surfaceView1, surfaceView2是同一屏幕位置,重叠. 如何实现上面的功能? 需要注意那些问题?
android surfaceView+mediaPlayer 自定义视频播放器
播放M3U8为什么不回调setOnPrepareListener
android surfaceview+mediaplayer 和imageview替换问题
我现在是用 surfaceview+mediaplayer播放视频,用imageview显示图片 ,一个视频,一组照片交替播放,播放视频的时候imageview是不可见的。但是图片播放完,设置为不可见,播放视频的时候,会先显示之前视频的最后一帧,然后再播放视频,这种情况要怎么解决呢
请教一下,android视频播放器操作菜单的实现思路
在做一个简单的android视频播放器练手,使用的MediaPlayer+SurfaceView。现在实现了播放,在着手于播放时的操作界面。 实现目标就是很常见的那种,点击一下视频,就会浮现在正在播放的视频上面,两秒木有操作自动隐藏。 我能想到的就是放在fragment里,然后监听SurfaceView的点击情况,来控制fragment的显示和隐藏。 请教各位指点我这个思路有没有缺陷,或者有没有其他更好的思路。谢谢
android mediaPlayer播放了1.4G的MP4 抛出 传输量过大异常
package com.example.zyc.surfaceview; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.Surface; import android.view.SurfaceView; import android.view.View; import android.widget.Button; import android.widget.Toast; import java.io.File; import java.io.IOException; public class MainActivity extends AppCompatActivity { private MediaPlayer mediaPlayer; private SurfaceView surfaceView; private File file; private Button playButton; private Button pauseButton; private Button stopButton; private boolean isPlay; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //实现各种控件 mediaPlayer = new MediaPlayer(); surfaceView = (SurfaceView)findViewById(R.id.surfaceView1); playButton = (Button)findViewById(R.id.play); pauseButton = (Button)findViewById(R.id.pause); stopButton = (Button)findViewById(R.id.stop); //初始化一些变量 isPlay = false; file = new File(Environment.getExternalStorageDirectory().getPath()+"/aa.mp4"); pauseButton.setEnabled(false); //surfaceView.setBackgroundResource(R.drawable.bg); //实现三个按钮的方法 playButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mediaPlayer.reset(); //重置MediaPlay对象 try { mediaPlayer.setDataSource(file.getAbsolutePath()); //读取视频文件地址 }catch(IOException e){ e.printStackTrace(); } mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDisplay(surfaceView.getHolder()); //将视频画面输出到surface上 //确保视屏加载完毕才能够播放 mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { Log.i("TAG","准备完毕开始播放"); mediaPlayer.start(); //开始播放 pauseButton.setText("暂停"); //pause此时为暂停 pauseButton.setEnabled(true); //pause按钮此时可用 isPlay = true; } }); try { mediaPlayer.prepareAsync(); //让视频加载,加载完后自动执行onPrepared() }catch(Exception e){ Log.i("TAG","加载发生错误"); } } }); pauseButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isPlay == true) { pauseButton.setText("继续"); mediaPlayer.pause(); isPlay = false; } else { mediaPlayer.start(); pauseButton.setText("暂停"); isPlay = true; } } }); stopButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(isPlay==true){ mediaPlayer.stop(); Toast.makeText(MainActivity.this,"已停止",Toast.LENGTH_LONG).show(); pauseButton.setEnabled(false); } } }); } @Override protected void onDestroy() { if(isPlay==true){ mediaPlayer.stop(); } mediaPlayer.release(); super.onDestroy(); } } 以上是代码 用来播放小的MP4文件是没有什么问题。 但是我后来用来尝试播放一个1.4G的MP4文件后报出TransactionTooLargeException异常,原因是.prepareAsync()不能加载视频文件(文件过于大,不能被加载),我想解决,但是没有什么思路,不知道有什么办法。
Android学习surfaceView遇到问题。可能很简单,希望有人指点迷津
我这几天用surfaceView来做视频播放的时候,file文件读取是没有问题的,但是在之后setDataSource()和.prepare()这两个方法的其中一个(抱歉,我实在不能确定问题到底出在这两个中的哪一个)抛出了IO异常。具体代码如下,我都做注释 package com.example.zyc.surfaceview; import android.media.MediaPlayer; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Surface; import android.view.SurfaceView; import android.view.View; import android.widget.Button; import android.widget.Toast; import java.io.File; import java.io.IOException; public class MainActivity extends AppCompatActivity { private MediaPlayer mediaPlayer; private SurfaceView surfaceView; private File file; private Button playButton; private Button pauseButton; private Button stopButton; private boolean isPlay; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //实现各种控件 mediaPlayer = new MediaPlayer(); surfaceView = (SurfaceView)findViewById(R.id.surfaceView1); playButton = (Button)findViewById(R.id.play); pauseButton = (Button)findViewById(R.id.pause); stopButton = (Button)findViewById(R.id.stop); //初始化一些变量 isPlay = false; file = new File(Environment.getExternalStorageDirectory().getPath()+"/ss.mp4"); pauseButton.setEnabled(false); //用来检查file是否读取正确 if(file.exists()){ Toast.makeText(MainActivity.this,"文件已经被获取 文件长度为"+file.length(),Toast.LENGTH_LONG).show(); }else{ Toast.makeText(MainActivity.this,"文件没有获得",Toast.LENGTH_LONG).show(); } //实现三个按钮的方法 playButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mediaPlayer.reset(); //重置MediaPlay对象 try { mediaPlayer.setDataSource(file.getAbsolutePath()); //读取视频文件地址 mediaPlayer.prepare(); //预加载视频 mediaPlayer.setDisplay(surfaceView.getHolder()); //将视频画面输出到surface上 mediaPlayer.start(); //开始播放 pauseButton.setText("暂停"); //pause此时为暂停 pauseButton.setEnabled(true); //pause按钮此时可用 isPlay = true; }catch (IOException e){ Toast.makeText(MainActivity.this,"发生错误",Toast.LENGTH_LONG).show(); } } }); pauseButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isPlay == true) { pauseButton.setText("继续"); mediaPlayer.pause(); isPlay = false; } else { mediaPlayer.start(); pauseButton.setText("暂停"); isPlay = true; } } }); stopButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(isPlay==true){ mediaPlayer.stop(); Toast.makeText(MainActivity.this,"已停止",Toast.LENGTH_LONG).show(); pauseButton.setEnabled(false); } } }); } } 用的android studio,三星真机模拟 运行后的截图,(我还没点播放) ![图片说明](https://img-ask.csdn.net/upload/201602/14/1455463294_362010.png) 可以看到,文件长度。说明file的没有问题的 但是点击播放以后 ![图片说明](https://img-ask.csdn.net/upload/201602/14/1455463407_548795.png) 实在是不明白这怎么能错,其他人貌似也没有我这毛病啊
android mediaPlayer播放标清ts流是4:3的比例显示的
如题,现在使用surfaceView+mediaPlayer播放标清ts流,在机顶盒上视频是以4:3的比例显示,全屏的时候左右两端有一块黑屏,无法全屏显示;请问下如何设置使视频能够以16:9的比例显示。我用了mSurfaceHolder.setFixedSize(surfaceHeight, surfaceWidth)方法设置surface的大小,还是没用
android webview加载HTML5网站,监听HTML5视频播放?
如题:在android盒子上面自己做了一个apk,布局是一个webview和一个SurfaceView, webview加载一个HTML网站网站代码为: <!DOCTYPE HTML> <html> <body> <video width="1280" height="720" src="/vod/yuenan.avi" controls="controls" autoplay="autoplay" loop="loop"> your browser does not support the video tag </video> </body> </html> 里面播放的是一个avi格式的视频,视频可以播放。 我现在因为要修改视频输出的声道设置,本人有SDK源码,源码的Mediaplayer有设置声道的接口,所以只要得到Mediaplayer就可以设置声道,现在在webview中无法得到Mediaplayer,我新new Mediaplayer,但是播放的视频不会经过Mediaplayer,哪位大神对webview播放视频熟悉的,教教小弟如何得到这个视频的Mediaplayer呢?
android 视频播放旋转270度黑屏
android 咋做视频播放时,需要将视频旋转270度播放, 采用textureView+mediaPlayer来做,在手机上可以正常旋转并且正常播放, 但是将app放在android6.0系统的小米4A电视上时。 视频播放则是只有声音,没有画面 path = detail.getLocalUrl(); if (path == "") { // Tell the user to provide a media file URL. /* Toast.makeText( MediaPlayerDemo_setSurface.this, "Please edit MediaPlayerDemo_setSurface Activity, " + "and set the path variable to your media file path." + " Your media file must be stored on sdcard.", Toast.LENGTH_LONG).show();*/ return; } mMediaPlayer = new MediaPlayer(); mMediaPlayer.setDataSource(path); if (surf == null) { surf = new Surface(surfaceTexture); } mMediaPlayer.setSurface(surf); mMediaPlayer.prepareAsync(); int videoHeight = mMediaPlayer.getVideoHeight(); int videoWidth = mMediaPlayer.getVideoWidth(); //获取SurfaceHolder 可以通过该接口来操作SurfaceView中的Surface mMediaPlayer.setOnBufferingUpdateListener(this); mMediaPlayer.setOnCompletionListener(this); mMediaPlayer.setOnPreparedListener(this); 这是主要代码,求解决方案
跪求大神指教Android下播放RTSP实时流问题!
小弟在做一个Android客户端,用于监控电脑端摄像头传过来的流,就是能在Android客户端看到电脑摄像头看到的东西。 现在遇到了问题不会解决。 1.先用了DarWin来充当流服务器,然后它里面有配置一个端口和地址,然后调用rtsp://218.192.127.43:554/live.sdp 电脑上安装一个VLC。然后就可以看到摄像头传来的画面了。 ![图片说明](https://img-ask.csdn.net/upload/201504/14/1428997966_728869.jpg) 2.我想在Android端也实现这样的功能。我用SurfaceView,Mediaplayer来播放。但是播放不了。 我查了网上说是可以播放的(不知道是否可以。) 然后就报错了。下面是我的代码 ``` public class LiveViewFragment extends Fragment implements OnClickListener { Context context; SurfaceView sfv_liveview; Button btn_connect; MediaPlayer mediaPlayer; Boolean needResume; String rtspUrl = "rtsp://218.192.127.43:554/live.sdp";//这里从服务器得到实时视频播放地址; @SuppressWarnings("deprecation") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { context = getActivity(); View view = LayoutInflater.from(context).inflate(R.layout.activity_liveview, container, false); sfv_liveview = (SurfaceView) view.findViewById(R.id.sfv_liveview); btn_connect = (Button) view.findViewById(R.id.btn_connect); sfv_liveview.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); sfv_liveview.getHolder().addCallback(new Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { //程序创建的执行的 } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { //播放界面改变了 } @Override public void surfaceDestroyed(SurfaceHolder holder) { //程序销毁的执行 } }); btn_connect.setOnClickListener(this); return view; } @Override public void onClick(View v) { /*vv_liveview.setVideoURI(Uri.parse(rtspUrl)); vv_liveview.requestFocus(); vv_liveview.start();*/ switch (v.getId()) { case R.id.btn_connect: Play(); btn_connect.setEnabled(false); break; default: break; } } private void Play() { try { mediaPlayer = new MediaPlayer(); System.out.println("mediaPlayer创建了~!"); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDisplay(sfv_liveview.getHolder()); System.out.println(rtspUrl); mediaPlayer.setDataSource(rtspUrl); /*mediaPlayer.setOnInfoListener(new OnInfoListener() { @Override public boolean onInfo(MediaPlayer mp, int what, int extra) { switch (what) { case MediaPlayer.MEDIA_INFO_BUFFERING_START: if (mediaPlayer.isPlaying()) { mediaPlayer.stop(); needResume = true; } break; case MediaPlayer.MEDIA_INFO_BUFFERING_END: if (needResume) { mediaPlayer.start(); } default: break; } return false; } });*/ System.out.println("跑到准备前面了"); mediaPlayer.prepare(); System.out.println("跑到start前面了~!"); mediaPlayer.start(); /*mediaPlayer.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { System.out.println("跑到start前面了~!"); mediaPlayer.start(); } });*/ mediaPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { mp.release(); btn_connect.setEnabled(true); } }); } catch (Exception e) { Toast.makeText(context, "播放失败",Toast.LENGTH_SHORT).show(); e.printStackTrace(); } } } ``` 3.这样一直播放不了。请大神指点。下面是logcat里面的东西 04-14 16:01:50.360: E/MediaPlayer-JNI(21089): QCMediaPlayer mediaplayer NOT present 04-14 16:01:50.360: I/System.out(21089): mediaPlayer创建了~! 04-14 16:01:50.360: I/System.out(21089): rtsp://218.192.127.43:554/live.sdp 04-14 16:01:50.360: I/System.out(21089): 跑到准备前面了 04-14 16:01:50.370: W/MediaPlayer(21089): info/warning (701, 0) 04-14 16:01:50.400: E/MediaPlayer(21089): error (1, -2147483648) 04-14 16:01:50.410: W/System.err(21089): java.io.IOException: Prepare failed.: status=0x1 04-14 16:01:50.410: W/System.err(21089): at android.media.MediaPlayer.prepare(Native Method) 04-14 16:01:50.410: W/System.err(21089): at com.du.monitorclient.LiveViewFragment.Play(LiveViewFragment.java:132) 04-14 16:01:50.410: W/System.err(21089): at com.du.monitorclient.LiveViewFragment.onClick(LiveViewFragment.java:83) 04-14 16:01:50.410: W/System.err(21089): at android.view.View.performClick(View.java:4444) 04-14 16:01:50.410: W/System.err(21089): at android.view.View$PerformClick.run(View.java:18440) 04-14 16:01:50.410: W/System.err(21089): at android.os.Handler.handleCallback(Handler.java:733) 04-14 16:01:50.410: W/System.err(21089): at android.os.Handler.dispatchMessage(Handler.java:95) 04-14 16:01:50.410: W/System.err(21089): at android.os.Looper.loop(Looper.java:136) 04-14 16:01:50.410: W/System.err(21089): at android.app.ActivityThread.main(ActivityThread.java:5050) 04-14 16:01:50.410: W/System.err(21089): at java.lang.reflect.Method.invokeNative(Native Method) 04-14 16:01:50.410: W/System.err(21089): at java.lang.reflect.Method.invoke(Method.java:515) 04-14 16:01:50.410: W/System.err(21089): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:807) 04-14 16:01:50.410: W/System.err(21089): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:623) 04-14 16:01:50.410: W/System.err(21089): at dalvik.system.NativeStart.main(Native Method) 4.....................请问有没有大神了的,指点一下小弟。怎么修改。或者有没有别的办法可以实现。
关于mediaplay遇到一些问题,急求
代码如下 package org.lxh.demo; import java.io.IOException; import android.app.Activity; import android.content.Intent; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Bundle; import android.view.KeyEvent; 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.ImageButton; public class PlayVideoActivity extends Activity { private ImageButton play = null; private ImageButton stop = null; private ImageButton back = null; private MediaPlayer media = null; private SurfaceView sufaceView = null; private SurfaceHolder surfaceHolder = null; private String filepath = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.requestWindowFeature(Window.FEATURE_NO_TITLE); // 不显示标题 super.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); super.getWindow().addFlags( WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // 高亮的风格显示 super.setContentView(R.layout.play); this.filepath = super.getIntent().getStringExtra("filepath") ; this.play = (ImageButton) super.findViewById(R.id.play); this.stop = (ImageButton) super.findViewById(R.id.stop); this.back = (ImageButton) super.findViewById(R.id.back); this.sufaceView = (SurfaceView) super.findViewById(R.id.surfaceView) ; this.surfaceHolder = this.sufaceView.getHolder() ; this.surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS) ; this.media =new MediaPlayer() ; this.media.reset() ; try { this.media.setDataSource(this.filepath) ; } catch (Exception e) { } this.play.setOnClickListener(new PlayOnClickListenerImpl()); this.stop.setOnClickListener(new StopOnClickListenerImpl()); this.back.setOnClickListener(new BackOnClickListenerImpl()); } private class PlayOnClickListenerImpl implements OnClickListener { @Override public void onClick(View v) { PlayVideoActivity.this.media.setAudioStreamType(AudioManager.STREAM_MUSIC) ; PlayVideoActivity.this.media.setDisplay(PlayVideoActivity.this.surfaceHolder) ; try { PlayVideoActivity.this.media.prepare() ; PlayVideoActivity.this.media.start() ; } catch (Exception e) { } } } private class StopOnClickListenerImpl implements OnClickListener { @Override public void onClick(View v) { PlayVideoActivity.this.media.stop() ; } } private class BackOnClickListenerImpl implements OnClickListener { @Override public void onClick(View v) { Intent it = new Intent(PlayVideoActivity.this, BroswerActivity.class); PlayVideoActivity.this.startActivity(it); } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { this.media.stop() ; this.media.release() ; super.finish() ; } return false ; } } 编译的时候报错为 ![图片说明](https://img-ask.csdn.net/upload/201704/19/1492592903_728846.png)
android OPENGLES 截屏显示问题
先上代码 public class MainActivity extends AppCompatActivity implements GLSurfaceView.Renderer, SurfaceTexture.OnFrameAvailableListener { private MediaProjectionManager mediaProjectionManager; private GLSurfaceView surfaceview; private LinearLayout linearLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); linearLayout = ((LinearLayout) findViewById(R.id.linearlayout)); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); } /** * 初始化摄像头 */ private void initCamera() { surfaceview = new GLSurfaceView(this); linearLayout.addView(surfaceview); surfaceview.setEGLContextClientVersion(2); surfaceview.setRenderer(this); } private MediaProjection mediaProjection; @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); mediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE); startActivityForResult(mediaProjectionManager.createScreenCaptureIntent(), 0); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data); initCamera(); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { setupGraphics(); setupVertexBuffer(); setupTexture(); // } private int width=1080; private int height=1920; private MediaPlayer mediaPlayer; @Override public void onSurfaceChanged(GL10 gl, int width, int height) { this.width = width; this.height = height; // if (mediaPlayer == null) { // mediaPlayer = new MediaPlayer(); // mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { // @Override // public void onPrepared(MediaPlayer mp) { // mp.start(); // } // }); // Surface surface = new Surface(videoTexture); // mediaPlayer.setSurface(surface); // surface.release(); // try { // mediaPlayer.setDataSource(Environment.getExternalStorageDirectory().getAbsolutePath()+"/1.mp4"); // mediaPlayer.prepareAsync(); // } catch (IOException e) { // e.printStackTrace(); // } // } else { // mediaPlayer.start(); // } Surface surface = new Surface(videoTexture); VirtualDisplay display = mediaProjection.createVirtualDisplay("aa", 1080, 1920, 32, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, surface, null, null); } private float[] videoTextureTransform = new float[16]; @Override public void onDrawFrame(GL10 gl) { synchronized (this) { if (frameAvailable) { videoTexture.updateTexImage(); videoTexture.getTransformMatrix(videoTextureTransform); frameAvailable = false; } } GLES20.glActiveTexture(GLES20.GL_TEXTURE0); // GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, textures[0]); // Draw a rectangle and render the video frame as a texture on it. GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); // GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); // GLES20.glViewport(0, 0, width, height); this.drawTexture(); } private int shaderProgram; int textureParamHandle; int textureCoordinateHandle; int positionHandle; int textureTranformHandle; private static short drawOrder[] = {0, 1, 2, 0, 2, 3}; private FloatBuffer vertexBuffer; private ShortBuffer drawListBuffer; private static float squareSize = 0.5f; private static float squareCoords[] = { -squareSize, squareSize, // top left -squareSize, -squareSize, // bottom left squareSize, -squareSize, // bottom right squareSize, squareSize}; // top right private FloatBuffer textureBuffer; private float textureCoords[] = { 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f}; private int[] textures = new int[1]; private SurfaceTexture videoTexture; private void setupGraphics() { final String vertexShader = RawResourceReader.readTextFileFromRawResource(this, R.raw.vetext_sharder); final String fragmentShader = RawResourceReader.readTextFileFromRawResource(this, R.raw.fragment_sharder); final int vertexShaderHandle = ShaderHelper.compileShader(GLES20.GL_VERTEX_SHADER, vertexShader); final int fragmentShaderHandle = ShaderHelper.compileShader(GLES20.GL_FRAGMENT_SHADER, fragmentShader); shaderProgram = ShaderHelper.createAndLinkProgram(vertexShaderHandle, fragmentShaderHandle, new String[]{"texture", "vPosition", "vTexCoordinate", "textureTransform"}); GLES20.glUseProgram(shaderProgram); textureParamHandle = GLES20.glGetUniformLocation(shaderProgram, "texture"); textureCoordinateHandle = GLES20.glGetAttribLocation(shaderProgram, "vTexCoordinate"); positionHandle = GLES20.glGetAttribLocation(shaderProgram, "vPosition"); textureTranformHandle = GLES20.glGetUniformLocation(shaderProgram, "textureTransform"); } private void setupVertexBuffer() { // Draw list buffer ByteBuffer dlb = ByteBuffer.allocateDirect(drawOrder.length * 2); dlb.order(ByteOrder.nativeOrder()); drawListBuffer = dlb.asShortBuffer(); drawListBuffer.put(drawOrder); drawListBuffer.position(0); // Initialize the texture holder ByteBuffer bb = ByteBuffer.allocateDirect(squareCoords.length * 4); bb.order(ByteOrder.nativeOrder()); vertexBuffer = bb.asFloatBuffer(); vertexBuffer.put(squareCoords); vertexBuffer.position(0); } private void setupTexture() { ByteBuffer texturebb = ByteBuffer.allocateDirect(textureCoords.length * 4); texturebb.order(ByteOrder.nativeOrder()); textureBuffer = texturebb.asFloatBuffer(); textureBuffer.put(textureCoords); textureBuffer.position(0); // Generate the actual texture GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glGenTextures(1, textures, 0); // checkGlError("Texture generate"); GLES20.glBindTexture(GLES20.GL_TEXTURE_BINDING_2D, textures[0]); GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); // checkGlError("Texture bind"); videoTexture = new SurfaceTexture(textures[0]); videoTexture.setOnFrameAvailableListener(this); } private boolean frameAvailable = false; @Override public void onFrameAvailable(SurfaceTexture surfaceTexture) { synchronized (this) { Log.e("---", "onFrameAvailable: "); frameAvailable = true; } } private void drawTexture() { // Draw texture GLES20.glEnableVertexAttribArray(positionHandle); GLES20.glVertexAttribPointer(positionHandle, 2, GLES20.GL_FLOAT, false, 0, vertexBuffer); GLES20.glEnableVertexAttribArray(textureCoordinateHandle); GLES20.glVertexAttribPointer(textureCoordinateHandle, 4, GLES20.GL_FLOAT, false, 0, textureBuffer); GLES20.glUniformMatrix4fv(textureTranformHandle, 1, false, videoTextureTransform, 0); GLES20.glDrawElements(GLES20.GL_TRIANGLES, drawOrder.length, GLES20.GL_UNSIGNED_SHORT, drawListBuffer); } } fragment_shader #extension GL_OES_EGL_image_external : require precision mediump float; uniform samplerExternalOES texture; varying vec2 v_TexCoordinate; void main () { vec4 color = texture2D(texture, v_TexCoordinate); gl_FragColor = color; } vetext_shader attribute vec4 vPosition; attribute vec4 vTexCoordinate; uniform mat4 textureTransform; varying vec2 v_TexCoordinate; void main () { v_TexCoordinate = (textureTransform * vTexCoordinate).xy; gl_Position = vPosition; } 视频可以播放,截屏就无法正常显示了,不知道为何求大神指教![图片说明](https://img-ask.csdn.net/upload/201703/07/1488876551_179145.png)
动态规划入门到熟悉,看不懂来打我啊
持续更新。。。。。。 2.1斐波那契系列问题 2.2矩阵系列问题 2.3跳跃系列问题 3.1 01背包 3.2 完全背包 3.3多重背包 3.4 一些变形选讲 2.1斐波那契系列问题 在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n&gt;=2,n∈N*)根据定义,前十项为1, 1, 2, 3...
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
对计算机专业来说学历真的重要吗?
我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
防劝退!数据结构和算法难理解?可视化动画带你轻松透彻理解!
大家好,我是 Rocky0429,一个连数据结构和算法都不会的蒟蒻… 学过数据结构和算法的都知道这玩意儿不好学,没学过的经常听到这样的说法还没学就觉得难,其实难吗?真难! 难在哪呢?当年我还是个小蒟蒻,初学数据结构和算法的时候,在忍着枯燥看完定义原理,之后想实现的时候,觉得它们的过程真的是七拐八绕,及其难受。 在简单的链表、栈和队列这些我还能靠着在草稿上写写画画理解过程,但是到了数论、图...
【搞定 Java 并发面试】面试最常问的 Java 并发基础常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star!【Java学习 面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。欢迎 Star!)。 另外推荐一篇原创:终极推荐!可能是最适合你的Java学习路线 方法 网站 书籍推荐! Java 并发基础常见面试题总结 1. 什么是线程和进程? 1.1. 何为进程? 进程是程...
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给
shell脚本:备份数据库、代码上线
备份MySQL数据库 场景: 一台MySQL服务器,跑着5个数据库,在没有做主从的情况下,需要对这5个库进行备份 需求: 1)每天备份一次,需要备份所有的库 2)把备份数据存放到/data/backup/下 3)备份文件名称格式示例:dbname-2019-11-23.sql 4)需要对1天以前的所有sql文件压缩,格式为gzip 5)本地数据保留1周 6)需要把备份的数据同步到远程备份中心,假如...
iOS Bug 太多,苹果终于坐不住了!
开源的 Android 和闭源的 iOS,作为用户的你,更偏向哪一个呢? 整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 毋庸置疑,当前移动设备操作系统市场中,Android 和 iOS 作为两大阵营,在相互竞争的同时不断演进。不过一直以来,开源的 Android 吸引了无数的手机厂商涌入其中,为其生态带来了百花齐放的盛景,但和神秘且闭源的 iOS 系统相比,不少网友...
神经⽹络可以计算任何函数的可视化证明
《Neural Networks and Deep Learning》读书笔记第四篇本章其实和前面章节的关联性不大,所以大可将本章作为小短文来阅读,当然基本的深度学习基础还是要有的。主要介绍了神经⽹络拥有的⼀种普遍性,比如说不管目标函数是怎样的,神经网络总是能够对任何可能的输入,其值(或者说近似值)是网络的输出,哪怕是多输入和多输出也是如此,我们大可直接得出一个结论:不论我们想要计算什么样的函数,...
聊聊C语言和指针的本质
坐着绿皮车上海到杭州,24块钱,很宽敞,在火车上非正式地聊几句。 很多编程语言都以 “没有指针” 作为自己的优势来宣传,然而,对于C语言,指针却是与生俱来的。 那么,什么是指针,为什么大家都想避开指针。 很简单, 指针就是地址,当一个地址作为一个变量存在时,它就被叫做指针,该变量的类型,自然就是指针类型。 指针的作用就是,给出一个指针,取出该指针指向地址处的值。为了理解本质,我们从计算机模型说起...
为什么你学不过动态规划?告别动态规划,谈谈我的经验
动态规划难吗?说实话,我觉得很难,特别是对于初学者来说,我当时入门动态规划的时候,是看 0-1 背包问题,当时真的是一脸懵逼。后来,我遇到动态规划的题,看的懂答案,但就是自己不会做,不知道怎么下手。就像做递归的题,看的懂答案,但下不了手,关于递归的,我之前也写过一篇套路的文章,如果对递归不大懂的,强烈建议看一看:为什么你学不会递归,告别递归,谈谈我的经验 对于动态规划,春招秋招时好多题都会用到动态...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序消费,我整理了一下
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
如何安装 IntelliJ IDEA 最新版本——详细教程
IntelliJ IDEA 简称 IDEA,被业界公认为最好的 Java 集成开发工具,尤其在智能代码助手、代码自动提示、代码重构、代码版本管理(Git、SVN、Maven)、单元测试、代码分析等方面有着亮眼的发挥。IDEA 产于捷克,开发人员以严谨著称的东欧程序员为主。IDEA 分为社区版和付费版两个版本。 我呢,一直是 Eclipse 的忠实粉丝,差不多十年的老用户了。很早就接触到了 IDEA...
面试还搞不懂redis,快看看这40道面试题(含答案和思维导图)
Redis 面试题 1、什么是 Redis?. 2、Redis 的数据类型? 3、使用 Redis 有哪些好处? 4、Redis 相比 Memcached 有哪些优势? 5、Memcache 与 Redis 的区别都有哪些? 6、Redis 是单进程单线程的? 7、一个字符串类型的值能存储最大容量是多少? 8、Redis 的持久化机制是什么?各自的优缺点? 9、Redis 常见性...
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
为什么要推荐大家学习字节码?
配套视频: 为什么推荐大家学习Java字节码 https://www.bilibili.com/video/av77600176/ 一、背景 本文主要探讨:为什么要学习 JVM 字节码? 可能很多人会觉得没必要,因为平时开发用不到,而且不学这个也没耽误学习。 但是这里分享一点感悟,即人总是根据自己已经掌握的知识和技能来解决问题的。 这里有个悖论,有时候你觉得有些技术没用恰恰是...
互联网公司的裁员,能玩出多少种花样?
裁员,也是一门学问,可谓博大精深!以下,是互联网公司的裁员的多种方法:-正文开始-135岁+不予续签的理由:千禧一代网感更强。95后不予通过试用期的理由:已婚已育员工更有责任心。2通知接下来要过苦日子,让一部分不肯同甘共苦的员工自己走人,以“兄弟”和“非兄弟”来区别员工。3强制996。员工如果平衡不了工作和家庭,可在离婚或离职里二选一。4不布置任何工作,但下班前必须提交千字工作日报。5不给活干+...
【超详细分析】关于三次握手与四次挥手面试官想考我们什么?
在面试中,三次握手和四次挥手可以说是问的最频繁的一个知识点了,我相信大家也都看过很多关于三次握手与四次挥手的文章,今天的这篇文章,重点是围绕着面试,我们应该掌握哪些比较重要的点,哪些是比较被面试官给问到的,我觉得如果你能把我下面列举的一些点都记住、理解,我想就差不多了。 三次握手 当面试官问你为什么需要有三次握手、三次握手的作用、讲讲三次三次握手的时候,我想很多人会这样回答: 首先很多人会先讲下握...
新程序员七宗罪
当我发表这篇文章《为什么每个工程师都应该开始考虑开发中的分析和编程技能呢?》时,我从未想到它会对读者产生如此积极的影响。那些想要开始探索编程和数据科学领域的人向我寻求建议;还有一些人问我下一篇文章的发布日期;还有许多人询问如何顺利过渡到这个职业。我非常鼓励大家继续分享我在这个旅程的经验,学习,成功和失败,以帮助尽可能多的人过渡到一个充满无数好处和机会的职业生涯。亲爱的读者,谢谢你。 -罗伯特。 ...
活到老,学到老,程序员也该如此
全文共2763字,预计学习时长8分钟 图片来源:Pixabay 此前,“网传阿里巴巴要求尽快实现P8全员35周岁以内”的消息闹得沸沸扬扬。虽然很快被阿里辟谣,但苍蝇不叮无缝的蛋,无蜜不招彩蝶蜂。消息从何而来?真相究竟怎样?我们无从而知。我们只知道一个事实:不知从何时开始,程序猿也被划在了“吃青春饭”行业之列。 饱受“996ICU”摧残后,好不容易“头秃了变强了”,即将步入为“高...
Vue快速实现通用表单验证
本文开篇第一句话,想引用鲁迅先生《祝福》里的一句话,那便是:“我真傻,真的,我单单知道后端整天都是CRUD,我没想到前端整天都是Form表单”。这句话要从哪里说起呢?大概要从最近半个月的“全栈工程师”说起。项目上需要做一个城市配载的功能,顾名思义,就是通过框选和拖拽的方式在地图上完成配载。博主选择了前后端分离的方式,在这个过程中发现:首先,只要有依赖jQuery的组件,譬如Kendoui,即使使用...
2019年Spring Boot面试都问了什么?快看看这22道面试题!
Spring Boot 面试题 1、什么是 Spring Boot? 2、Spring Boot 有哪些优点? 3、什么是 JavaConfig? 4、如何重新加载 Spring Boot 上的更改,而无需重新启动服务器? 5、Spring Boot 中的监视器是什么? 6、如何在 Spring Boot 中禁用 Actuator 端点安全性? 7、如何在自定义端口上运行 Sprin...
【图解】记一次手撕算法面试:字节跳动的面试官把我四连击了
字节跳动这家公司,应该是所有秋招的公司中,对算法最重视的一个了,每次面试基本都会让你手撕算法,今天这篇文章就记录下当时被问到的几个算法题,并且每个算法题我都详细着给出了最优解,下面再现当时的面试场景。看完一定让你有所收获 一、小牛试刀:有效括号 大部分情况下,面试官都会问一个不怎么难的问题,不过你千万别太开心,因为这道题往往可以拓展出更多有难度的问题,或者一道题看起来很简单,但是给出最优解,确实很...
关于裁员几点看法及建议
最近网易裁员事件引起广泛关注,昨天网易针对此事,也发了声明,到底谁对谁错,孰是孰非?我们作为吃瓜观众实在是知之甚少,所以不敢妄下定论。身处软件开发这个行业,近一两年来,对...
面试官:关于Java性能优化,你有什么技巧
通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化。 一般有两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。 下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAVA程序的性能,而经常采用的一些方法和技巧。 1.对象的生成和大小的调整。 J...
【图解算法面试】记一次面试:说说游戏中的敏感词过滤是如何实现的?
版权声明:本文为苦逼的码农原创。未经同意禁止任何形式转载,特别是那些复制粘贴到别的平台的,否则,必定追究。欢迎大家多多转发,谢谢。 小秋今天去面试了,面试官问了一个与敏感词过滤算法相关的问题,然而小秋对敏感词过滤算法一点也没听说过。于是,有了下下事情的发生… 面试官开怼 面试官:玩过王者荣耀吧?了解过敏感词过滤吗?,例如在游戏里,如果我们发送“你在干嘛?麻痹演员啊你?”,由于“麻痹”是一个敏感词,...
程序员需要了解的硬核知识之汇编语言(一)
之前的系列文章从 CPU 和内存方面简单介绍了一下汇编语言,但是还没有系统的了解一下汇编语言,汇编语言作为第二代计算机语言,会用一些容易理解和记忆的字母,单词来代替一个特定的指令,作为高级编程语言的基础,有必要系统的了解一下汇编语言,那么本篇文章希望大家跟我一起来了解一下汇编语言。 汇编语言和本地代码 我们在之前的文章中探讨过,计算机 CPU 只能运行本地代码(机器语言)程序,用 C 语言等高级语...
相关热词 c# id读写器 c#俄罗斯方块源码 c# linq原理 c# 装箱有什么用 c#集合 复制 c# 一个字符串分组 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图
立即提问