android錄制視頻源碼
❶ Android實現錄屏MediaProjection以及相關異常解決
需要實現一個手機的錄屏功能,於是從網上找了些相關資料和源碼,發現跑不起來,於是開始bug,發現坑還是很多的,這里記錄一下實現過程和一些些遇到的異常以及一個我調整完可以跑的Demo。
首先在AndroidManifest中靜態配置許可權:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
然後在Activity中動態申請
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_REQUEST_CODE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.RECORD_AUDIO)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[] {Manifest.permission.RECORD_AUDIO}, AUDIO_REQUEST_CODE);
}
因為項目中需要用到一個自定義的Application,所以要需要配置一個全局的Application,同樣在AndroidManiest中在application添加自定義的類名,如果在裡面啟動服務了也要一並配置。
<application
android:name=".RecordApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</application>
然後可以使用封裝好的實現其錄屏功能的service,這個封裝類是網上找的,看很多人在用,我解決了一些異常,並根據自己需求修改了一下。
其中主要異常有:
1.mediaRecorder報空指針,解決方案,在聲明的時候聲明為靜態
private static MediaRecorder mediaRecorder;
2.mediaRecorder.start()方法異常,在每次調用stop時要先調用
mediaRecorder.stop();
mediaRecorder.release();
兩個方法,並將
mediaRecorder = null。
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC)異常,這里是設置音頻源,可嘗試將參數改為
MediaRecorder.AudioSource.DEFAULT
4.stop方法異常,如果是running狀態不正常,可能是其狀態丟失,需要將聲明的running也改為靜態的
0.增加需求,在生成視頻時大部分人都會根據mediaRecorder.setVideoSize(width, height);方法來定死視頻大小,導致一些手機會解析不了,或者是視頻比屏幕小,這里提供一種根據屏幕大小動態設置視頻大小的方法。
這里就要用到我們之前定義的全局的Application,然後調用getInstance()獲取其實例,
然後通過
DisplayMetrics dm = RecordApplication.getInstance().getResources().getDisplayMetrics();
private int width = dm.widthPixels;
private int height = dm.heightPixels;
private int dpi = dm.densityDpi;
來獲取屏幕的長、寬和dpi的值,這里不用WindowsManager方法是因為我是在非Activity去獲取屏幕長寬的,所以用了getDisplayMetrics();
這樣這個功能基本就是實現了。
Demo地址: https://github.com/han103070/Screencap
❷ android 錄制屏幕怎麼實現
第一步:
下載 ADB工具包,並將其解壓縮到任意硬碟根目錄。由於屏幕錄制功能默認是隱藏的,因此需要 ADB 工具予以協助。
第二步:
在手機設置中的「開發人員選項」中開啟「USB調試」,而後使用USB線將手機連接電腦。部分設備還需要允許 USB 調試授權。
第三步:
按下「WIN鍵+R」,輸入「cmd」並回車,打開cmd命令符工具。
輸入你的存放根目錄的盤符(例如E:),回車。
輸入cd adb,切換到ADB工具文件夾。
輸入adb shell,測試是否可以正常連接手機。若顯示 shell@XX:/ $(XX為你的機型名),則連接正常,按「Ctrl鍵+C」退出測試。
輸入命令後若提示 error:device not found ,可在電腦下載豌豆莢 ,打開USB調試後連接手機安裝驅動即可。
第四步:
輸入 adb shell screenrecord /sdcard/XXX.mp4 (XXX為視頻文件名,可自定義),開始錄制手機屏幕,視頻格式為 mp4,存放到手機sd卡中,默認錄制時間為180s,中途可按「Ctrl鍵+C」停止錄制。
注意事項:
輸入 --time-limit N:限制視頻錄制時間為N秒。如果不限制,默認180秒。
輸入 --size N*N:限制錄制視頻解析度為N*N。如果未指定,默認使用手機的解析度。
輸入 --bit-rate:指定視頻的比特率為6Mbps。如果不指定,默認為4Mbps。
某些設備可能無法直接錄制,原因是解析度太高。如果遇到此類問題,系統將自行指定較低的解析度。
不支持錄制過程中屏幕旋轉,如果錄制過程中旋轉,有可能畫面被切斷。
無法同步錄制音頻。
❸ Android錄制視頻,可限制時長,限大小
Android 錄制視頻:
public static voidrecordVideo(Context context, intlimit_time, intsize) {
Intent intent =newIntent();
intent.setAction(MediaStore. ACTION_VIDEO_CAPTURE );
intent.putExtra(MediaStore. EXTRA_VIDEO_QUALITY ,1);
intent.addCategory(Intent. CATEGORY_DEFAULT );
if(size !=0) {
//大小限制是long型,int 型無效,所以後邊要寫一個L
intent.putExtra(MediaStore. EXTRA_SIZE_LIMIT ,size *1024*1024L);//限制錄制大小(10M=10 * 1024 * 1024L)
}
if(limit_time !=0) {
intent.putExtra(MediaStore. EXTRA_DURATION_LIMIT ,limit_time);//限制錄制時間(10秒=10)
}
File videoFile =createVideoFile(context);
if(videoFile !=null) {
intent.putExtra(MediaStore. EXTRA_OUTPUT ,Uri.fromFile(videoFile));
context.startActivityForResult(intent, CAPTURE_VIDEO_CODE );
}
}
❹ Android調用系統相機實現拍照和視頻錄制
(1)申請許可權
(2)設置布局
這里做了一個簡單的布局:添加了一個按鈕和一個ImageView控制項用於顯示拍攝的圖像。
(3)為按鈕添加點擊事件監聽
點擊按鈕時,調用系統相機進行拍照,並在確定後將圖像顯示在ImageView控制項中。
(1)申請許可權
(2)設置布局
添加了一個按鈕和一個VideoView控制項用於顯示錄制的視頻。
(3)為按鈕添加點擊事件監聽
同前面一樣,點擊按鈕後調用系統相機進行錄制視頻,錄制完成後點擊確定即可將錄制的視頻顯示在VideoView控制項中。
對於Android11.0的版本,在調用系統相近進行視頻錄制的時候,即使在AndroidMenifest.xml中申請了CAMERA許可權,還是會在程序運行時報錯: Permission Denial , . .... .... with revoked permission android.permission.CAMERA
解決方法是在程序中動態申請許可權:
寫在最後:文章是在學習過程中做的學習筆記,同時與志同道合者分享,文章內容均經過我自己實驗證實可行,如有問題歡迎留言,很高興一起交流討論,共同進步!
❺ android 錄像,每隔30秒自動存一下視頻 代碼如何實現謝謝!
需要實時錄得話,中間會有延遲的,就是錄制完一段,再錄另一段的時候中間會卡頓下,然後你把mediaRecorder設置上錄制監聽器setOnInfoListener,它會回調的,然後你重新初始化錄制器,再錄制唄,強調一點:中間一定會有延遲,除非你重寫錄制器,底層文件存儲自己搞。
❻ 現在 做了個 android 視頻錄制的程序 ,後置攝像頭總是旋轉90度,如何用代碼實現正常。
MediaRecorder 中一個方法setCamera();所以可以先設置好攝像頭的參數,然後再設置到MediaRecorder 中(但是錄制前需要解鎖)。
部分關鍵的代碼如果下:
//初始化相機信息
Camera mCamera = Camera.open();
Camera.Parameters params = mCamera.getParameters();
mCamera.setDisplayOrientation(90);//旋轉了90度,最好先判斷下JDK的版本號,再決定旋轉不
mCamera.setParameters(params);
mCamera.stopPreview();
mCamera.unlock();//解鎖
videoMediaRecorder.setCamera(mCamera);
❼ ADB錄制視頻 Android 視頻錄制命令 screenrecord
在Android 4.4(Kitkat - API level 19)上集成了一個比較好用的視頻(.mp4格式)錄制功能 – screenrecord 。
使用方法
1. 基本用法
$ adb shell screenrecord /sdcard/myscreenrecord.mp4
/sdcard/myscreenrecord.mp4 為視頻錄制文件路徑
錄制默認解析度,默認4Mbps,默認180s的視頻,保存到sdcard上名為myscreenrecord.mp4
2. 旋轉(參數:–rotate)
$ adb shell screenrecord --rotate /sdcard/myscreenrecord.mp4
旋轉90度
3. 指定解析度(參數:–size)
$adb shell screenrecord --size 112x112 /sdcard/myscreenrecord.mp4
解析度為112x112,建議不要指定解析度,使用默認解析度效果最佳;
注意,解析度不是完全可以隨意定製的,比如在我手機上錄制100x100的會提示錯誤:
The max width/height supported by codec is1920x1088
100x100is not supported by codec, suggest to set it as112x112
4. 指定比特率(參數:–bit-rate)
$adb shell screenrecord --bit -rate 8000000 /sdcard/myscreenrecord.mp4
設置比特率為8Mbps,比特率越大,文件越大,畫面越清晰;
5. 限制錄制時間 (參數: –time-limit)
$adb shell screenrecord --time -limit 10 /sdcard/myscreenrecord.mp4
限制視頻錄制時間為10s,如果不限制,默認180s
6. 導出視頻
$adb pull /sdcard/myscreenrecord.mp4
7. 注意
請關注視頻文件生成大小,根據自身情況而定;
暫不支持聲音;
咱時不支持模擬器錄制( 模擬器錄制看這里 ),出現如下提示:Unable to get output buffers (err=-38)
Encoder failed (err=-38),可認為是此原因;
8. 命令查看
adb shell screenrecord --help
Usage: screenrecord [options]
Records the device's display to a .mp4 file.
Options:
--size WIDTHxHEIGHT
Set the video size, e.g."1280x720". Default is the device's main
display resolution (if supported), 1280x720if not. For best
results,use a size supported by the AVC encoder.
--bit -rate RATE
Set the video bit rate, in megabits per second. Default4Mbps.
--time -limit TIME
Set the maximum recording time, in seconds. Default / maximum is180.
--rotate
Rotate the output90 degrees.
--verbose
Display interesting information on stdout.
--help
Showthis message.
Recording continues until Ctrl-C is hit or the time limit is reached.