1,最近遇到個問題,用camera錄制的視頻,在拍攝預覽過程中是全屏的,到文件管理器中播放就不是的了,會比拍攝時看到的寬一些,困擾了很久,不知道怎么解決,懇請大佬指點一下?
2,代碼:
public class MainActivity extends AppCompatActivity {
private SurfaceView surfaceview;
private MediaRecorder mr;
private Button bt_start;
private Button bt_stop;
private boolean isRecording = false;
private Camera mCamera;
private int width;
private int height;
private Camera.Size previewSize;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceview = (SurfaceView) findViewById(R.id.surfaceview);
bt_start = (Button) findViewById(R.id.bt_start);
bt_stop = (Button) findViewById(R.id.bt_stop);
WindowManager wm = (WindowManager) this
.getSystemService(Context.WINDOW_SERVICE);
width = wm.getDefaultDisplay().getWidth();
height = wm.getDefaultDisplay().getHeight();
SurfaceHolder holder = surfaceview.getHolder();
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
holder.setFixedSize(width, height);
surfaceview.setKeepScreenOn(true);
}
public void start(View v){
//實際的權(quán)限申請不應該這么寫
new RxPermissions(this)
.request(Manifest.permission.CAMERA,
Manifest.permission.CAPTURE_SECURE_VIDEO_OUTPUT,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
.subscribe(new Consumer<Boolean>() {
@Override
public void accept(Boolean aBoolean) throws Exception {
if(aBoolean){
Toast.makeText(MainActivity.this,"已授權(quán)",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(MainActivity.this,"未授權(quán)",Toast.LENGTH_SHORT).show();
}
}
});
try {
mCamera = Camera.open();
Camera.Parameters parameters = mCamera.getParameters();
mCamera.setDisplayOrientation(90);
mCamera.setPreviewDisplay(surfaceview.getHolder());
mCamera.startPreview();
List<Camera.Size> mSupportedPreviewSizes = parameters.getSupportedPreviewSizes();
if (mSupportedPreviewSizes != null) {
previewSize = getOptimalPreviewSize(mSupportedPreviewSizes,
Math.max(width, height), Math.min(width, height));
}
Camera.Parameters mParams = mCamera.getParameters();
mParams.setPreviewSize(previewSize.width, previewSize.height);
// mCamera.setDisplayOrientation(90);
List<String> focusModes = mParams.getSupportedFocusModes();
if(focusModes.contains("continuous-video")){
mParams.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
}
mCamera.setParameters(mParams);
mCamera.unlock();
mr = new MediaRecorder();
mr.setCamera(mCamera);
mr.reset();
mr.setPreviewDisplay(surfaceview.getHolder().getSurface());
mr.setVideoSource(MediaRecorder.VideoSource.CAMERA);// 視頻源
mr.setAudioSource(MediaRecorder.AudioSource.MIC);// 音頻源
mr.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);// 視頻輸出格式
mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);// 音頻格式
mr.setVideoSize(previewSize.width,previewSize.height);
mr.setVideoFrameRate(30);
mr.setVideoEncodingBitRate(3*1024*1024);// 設(shè)置幀頻率,然后就清晰了
mr.setOrientationHint(90);// 輸出旋轉(zhuǎn)90度,保持豎屏錄制
mr.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);// 視頻錄制格式
File file = new File(Environment.getExternalStorageDirectory(),"zz"+System.currentTimeMillis()+".mp4");
mr.setOutputFile(file.getAbsolutePath());
mr.setOnErrorListener(new MediaRecorder.OnErrorListener() {
@Override
public void onError(MediaRecorder mr, int what, int extra) {
isRecording = false;
mr.stop();
mr.release();
mr = null;
isRecording = false;
bt_start.setEnabled(true);
bt_stop.setEnabled(false);
Toast.makeText(MainActivity.this,"錄制出錯!",Toast.LENGTH_SHORT).show();
}
});
//設(shè)置預覽顯示
mr.setPreviewDisplay(surfaceview.getHolder().getSurface());
mr.prepare();
mr.start();
bt_start.setEnabled(false);
bt_stop.setEnabled(true);
Toast.makeText(MainActivity.this,"錄制開始!",Toast.LENGTH_SHORT).show();
} catch (Exception e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
public void stop(View v){
mr.stop();
bt_start.setEnabled(true);
bt_stop.setEnabled(false);
}
@Override
protected void onDestroy() {
//TODO Auto-generated method stub
super.onDestroy();
if(mr!= null){
mr.release();
mr = null;
}
}
public Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.1;
double targetRatio = (double) w / h;
if (sizes == null) {
return null;
}
Camera.Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
for (Camera.Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Camera.Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
}
3,圖片:
拍攝圖:
在文件夾中播放的圖:
4,會看到實際上的圖片會寬一些,應該怎么解決這個問題,想做成全屏的。
也就是預覽和實際不相同,你獲取屏幕的寬和高的方法可能存在一定的差距,我沒記錯的話這個數(shù)值和實際有所出入。
不過我自己也沒嘗試過是否因為這個原因,可以參考https://blog.csdn.net/gh86091...
看是否有所幫助
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓領(lǐng)域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。