Android實(shí)現(xiàn)錄屏直播+遠(yuǎn)程控制(二)

前言

前面Android實(shí)現(xiàn)錄屏直播+遠(yuǎn)程控制(一)的文章說(shuō)到Android5.0的錄屏直播實(shí)現(xiàn)方式,今天來(lái)說(shuō)說(shuō)實(shí)現(xiàn)錄屏直播的另外一種方案

1 啟動(dòng)一個(gè)后臺(tái)服務(wù)實(shí)現(xiàn)錄屏

1、服務(wù)的創(chuàng)建這邊就不在贅述了,首先我們創(chuàng)建一個(gè)命名為AgentService的類(lèi),然后繼承Service,并重寫(xiě)他們的實(shí)例

public AgentService() {
    }
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new AgentService.ScreenImageBinder();
    }
    @Override
    public void onCreate() {
        super.onCreate();
        _this = this;
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_NOT_STICKY;

    }

2 獲取一個(gè)錄屏實(shí)例DisplayManager

1、可能有些伙伴覺(jué)得很奇怪,Android實(shí)現(xiàn)錄屏直播+遠(yuǎn)程控制(一)的文章說(shuō)的錄屏實(shí)例并不是這個(gè)呀,那么這個(gè)又是什么鬼呢,
2、你沒(méi)看錯(cuò),其實(shí)通過(guò)Android實(shí)現(xiàn)錄屏直播+遠(yuǎn)程控制(一)的文章”介紹的錄屏實(shí)現(xiàn)方式是沒(méi)問(wèn)題的,
3、通過(guò)DisplayManager也是沒(méi)有問(wèn)題的,因?yàn)槲业某绦蚴怯邢到y(tǒng)權(quán)限的,可以直接繞過(guò)權(quán)限申請(qǐng)的步驟
那么自然而然前面的文章說(shuō)到的實(shí)現(xiàn)錄屏方式就不適合我的場(chǎng)景了,而且我的程序是通過(guò)啟動(dòng)一個(gè)服務(wù)來(lái)運(yùn)行的

// 獲取一個(gè)系統(tǒng)級(jí)的服務(wù)
DisplayManager mManager = _this .getSystemService(DisplayManager.class)

3 通過(guò)DisplayManager獲取VirtualDisplay

1、注意:通過(guò)DisplayManager獲取VirtualDisplay又是另外的一種方式了,請(qǐng)不要驚訝,因?yàn)槲覀儗?shí)現(xiàn)錄屏的方式變了,那么獲取這些實(shí)例的方法自然也就跟著改變啦,只不過(guò)內(nèi)部的實(shí)現(xiàn)機(jī)制都還是一樣的,

Surface surface = MediaCodec.createInputSurface();
            //實(shí)例化VirtualDisplay,這個(gè)類(lèi)的主要作用是用來(lái)獲取屏幕信息并保存在里。
 mVirtualDisplay = mManager.createVirtualDisplay("ScreenRecord", 720, 1280, 1, surface,
                    DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR);

4 MediaCodec編碼,也就是我們獲取屏幕數(shù)據(jù)的關(guān)鍵一員

當(dāng)然這里面也可以使用MediaRecord去實(shí)現(xiàn)錄屏獲取數(shù)據(jù)

public static MediaCodec getVideoMediaCodec() {
        MediaFormat format = MediaFormat.createVideoFormat("video/avc", 720, 1280);
        //設(shè)置顏色格式
        format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
                MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
        //設(shè)置比特率(設(shè)置碼率,通常碼率越高,視頻越清晰)
        format.setInteger(MediaFormat.KEY_BIT_RATE, 1000 * 1024);
        //設(shè)置幀率
        format.setInteger(MediaFormat.KEY_FRAME_RATE, 10);
        //關(guān)鍵幀間隔時(shí)間,通常情況下,你設(shè)置成多少問(wèn)題都不大。
        format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 10);
        // 當(dāng)畫(huà)面靜止時(shí),重復(fù)最后一幀,不影響界面顯示
        format.setLong(MediaFormat.KEY_REPEAT_PREVIOUS_FRAME_AFTER, 1000000 / 45);
        format.setInteger(MediaFormat.KEY_BITRATE_MODE, MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_VBR);
        //設(shè)置復(fù)用模式
        format.setInteger(MediaFormat.KEY_COMPLEXITY, MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CBR);
        MediaCodec mediaCodec = null;
        try {
//            MediaRecorder mediaRecorder = new MediaRecorder();
            mediaCodec = MediaCodec.createEncoderByType("video/avc");
            mediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
        } catch (Exception e) {
            e.printStackTrace();
            if (mediaCodec != null) {
                mediaCodec.reset();
                mediaCodec.stop();
                mediaCodec.release();
                mediaCodec = null;
            }
        }
        return mediaCodec;
    }

Android實(shí)現(xiàn)錄屏直播+遠(yuǎn)程控制之MediaCodec編碼篇

結(jié)束語(yǔ)

以上就是Android 5.0以上屏幕錄制的第二種方案,有不懂的隨時(shí)私信。
PS:轉(zhuǎn)載請(qǐng)注明出處
-- The end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容