日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android PC投屏简单尝试—最终章2

發布時間:2025/3/15 Android 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android PC投屏简单尝试—最终章2 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

源碼地址:https://github.com/deepsadness/AppRemote

上一章中,我們簡單實現了PC的投屏功能。
但是還是存在這一些缺陷。

  • 屏幕的尺寸數據是寫死的
  • 不能通過PC來對手機進行控制
  • 直接在主線程中進行解碼和顯示,存在較大的延遲。
  • 所以這邊文章。我們需要根據上面的需求。來對我們的代碼進行優化。

    1. 屏幕信息發送

    其實在上一章中,我們已經獲取了屏幕信息。只是沒有發送給client端。這邊文章中,我們進行發送。

    • android端
      Android端在Socket連接成功后,就開啟發送
    private static void sendScreenInfo(Size size, ByteBuffer buffer, FileDescriptor fileDescriptor) throws IOException {//將尺寸數據先發送過去int width = size.getWidth();int height = size.getHeight();byte wHigh = (byte) (width >> 8);byte wLow = (byte) (width & 0xff);byte hHigh = (byte) (height >> 8);byte hLow = (byte) (height & 0xff);buffer.put(wHigh);buffer.put(wLow);buffer.put(hHigh);buffer.put(hLow);// System.out.println("發送尺寸 size result = " + write); // int write = Os.write(fileDescriptor, buffer);byte[] buffer_size = new byte[4];buffer_size[0] = (byte) (width >> 8);buffer_size[1] = (byte) (width & 0xff);buffer_size[2] = (byte) (height >> 8);buffer_size[3] = (byte) (height & 0xff);writeFully(fileDescriptor, buffer_size, 0, buffer_size.length);System.out.println("發送尺寸 size result ");buffer.clear();}
    • Client端
      在PC上負責接受,并設置給編碼器
    //從客戶端接受屏幕數據uint8_t size[4];socketConnection->recv_from_(reinterpret_cast<uint8_t *>(size), 4);//這里先寫死,后面從客戶端內接受int width = (size[0] << 8) | (size[1]);int height = (size[2] << 8) | (size[3]);printf("width = %d , height = %d \n", width, height);

    這樣就可以獲得屏幕的尺寸信息,保證不同手機分辨率也能正常使用了。

    • 奇怪的地方

      ?

      有點胖.png

    盡管我們通過這樣獲取了正確的屏幕信息,但是SDL顯示的畫面,還是有些奇怪。比我們預期的胖了一點。

    通過下面的方式,來重新計算窗口的尺寸。這樣才能顯示正常。

    //這里是給四周留空隙。 #define DISPLAY_MARGINS 96 struct size {int width;int height; }; // get the preferred display bounds (i.e. the screen bounds with some margins) static SDL_bool get_preferred_display_bounds(struct size *bounds) {SDL_Rect rect; #if SDL_VERSION_ATLEAST(2, 0, 5) # define GET_DISPLAY_BOUNDS(i, r) SDL_GetDisplayUsableBounds((i), (r)) #else # define GET_DISPLAY_BOUNDS(i, r) SDL_GetDisplayBounds((i), (r)) #endif//獲取顯示的大小if (GET_DISPLAY_BOUNDS(0, &rect)) { // LOGW("Could not get display usable bounds: %s", SDL_GetError());printf("Could not get display usable bounds: %s\n", SDL_GetError());return SDL_FALSE;}//設置大小bounds->width = MAX(0, rect.w - DISPLAY_MARGINS);bounds->height = MAX(0, rect.h - DISPLAY_MARGINS);return SDL_TRUE; }// return the optimal size of the window, with the following constraints: // - it attempts to keep at least one dimension of the current_size (i.e. it crops the black borders) // - it keeps the aspect ratio // - it scales down to make it fit in the display_size static struct size get_optimal_size(struct size current_size, struct size frame_size) {if (frame_size.width == 0 || frame_size.height == 0) {// avoid division by 0return current_size;}struct size display_size;// 32 bits because we need to multiply two 16 bits valuesint w;int h;if (!get_preferred_display_bounds(&display_size)) {// cannot get display bounds, do not constraint the sizew = current_size.width;h = current_size.height;} else {w = MIN(current_size.width, display_size.width);h = MIN(current_size.height, display_size.height);}SDL_bool keep_width = static_cast<SDL_bool>(frame_size.width * h > frame_size.height * w);//縮放之后,保持長寬比if (keep_width) {// remove black borders on top and bottomh = frame_size.height * w / frame_size.width;} else {// remove black borders on left and right (or none at all if it already fits)w = frame_size.width * h / frame_size.height;}// w and h must fit into 16 bitsSDL_assert_release(w < 0x10000 && h < 0x10000);return (struct size) {w, h}; }//調用 void set(){struct size frame_size = {.height=screen_h,.width=screen_w};struct size window_size = get_optimal_size(frame_size, frame_size);//創建windowsdl_window = SDL_CreateWindow(name,SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,window_size.width, window_size.height,SDL_WINDOW_RESIZABLE); }

    這樣才能顯示正常的窗口了。

    ?

    正常的比例.png

    2. 對Android手機進行控制

    我們知道在Android中有幾種方式可以對手機的Android發起模擬按鍵。

  • 通過AccessibilityService的方式。通過注冊該服務,可以捕獲所有的窗口變化,捕獲控鍵,進行模擬點擊。
    但是它需要額外的權限。
  • 通過adb的方式
    我們可以簡單的通過adb shell input方法來完成模擬
  • Usage: input [<source>] <command> [<arg>...]The sources are: dpadkeyboardmousetouchpadgamepadtouchnavigationjoysticktouchscreenstylustrackballThe commands and default sources are:text <string> (Default: touchscreen)keyevent [--longpress] <key code number or name> ... (Default: keyboard)tap <x> <y> (Default: touchscreen)swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)draganddrop <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)press (Default: trackball)roll <dx> <dy> (Default: trackball)

    就可以對屏幕上(100,100)的位置,進行模擬點擊。

  • 通過InputManager實現
    我們這里也是通過這個方式來實現的。
  • InputManager 模擬點擊事件

    當API 15之后,我們使用InputManager。

    • 獲取InputManager
      同樣可以通過Server Manager中就可以進行獲取。
    public InputManager getInputManager() {if (inputManager == null) {IInterface service = getService(Context.INPUT_SERVICE, "android.hardware.input.IInputManager");inputManager = new InputManager(service);}return inputManager;}

    我們知道Android中的按鍵事件對應的是KeyEvent,而手勢事件對應的是MotionEvent。

    • 創建KeyEvent
    public class KeyEventFactory {/*創建一個KeyEvent*/public static KeyEvent keyEvent(int action, int keyCode, int repeat, int metaState) {long now = SystemClock.uptimeMillis();/*** 1. 點擊的時間 The time (in {@link android.os.SystemClock#uptimeMillis}) at which this key code originally went down.* 2. 事件發生的時間 The time (in {@link android.os.SystemClock#uptimeMillis}) at which this event happened.* 3. UP DOWN MULTIPLE 中的一個: either {@link #ACTION_DOWN},{@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.* 4. code The key code. 輸入的鍵盤事件* 5. 重復的事件次數。點出次數? A repeat count for down events (> 0 if this is after the initial down) or event count for multiple events.* 6. metaState Flags indicating which meta keys are currently pressed. 暫時不知道什么意思* 7. The device ID that generated the key event.* 8. Raw device scan code of the event. 暫時不知道什么意思* 9. The flags for this key event 暫時不知道什么意思* 10. The input source such as {@link InputDevice#SOURCE_KEYBOARD}.*/KeyEvent event = new KeyEvent(now, now, action, keyCode, repeat, metaState,KeyCharacterMap.VIRTUAL_KEYBOARD,0,0,InputDevice.SOURCE_KEYBOARD);return event;}/*通過送入一個ACTION_DOWN 和ACTION_UP 來模擬一次點擊的事件*/public static KeyEvent[] clickEvent(int keyCode) {return new KeyEvent[]{keyEvent(KeyEvent.ACTION_DOWN, keyCode, 0, 0), keyEvent(KeyEvent.ACTION_UP, keyCode, 0, 0)};} }
    • 創建MotionEvent
      Android中的手勢事件的觸發。
    private static long lastMouseDown;private static final MotionEvent.PointerCoords[] pointerCoords = {new MotionEvent.PointerCoords()};private static final MotionEvent.PointerProperties[] pointerProperties = {new MotionEvent.PointerProperties()};public static MotionEvent createMotionEvent(int type, int x, int y) {long now = SystemClock.uptimeMillis();int action;if (type == 1) {lastMouseDown = now;action = MotionEvent.ACTION_DOWN;} else {action = MotionEvent.ACTION_UP;}MotionEvent.PointerCoords[] pointerCoords = {new MotionEvent.PointerCoords()};MotionEvent.PointerCoords coords = pointerCoords[0];coords.x = 2 * x;coords.y = 2 * y;MotionEvent.PointerProperties[] pointerProperties = {new MotionEvent.PointerProperties()};MotionEvent.PointerProperties props = pointerProperties[0];props.id = 0;props.toolType = MotionEvent.TOOL_TYPE_FINGER;coords = pointerCoords[0];coords.orientation = 0;coords.pressure = 1;coords.size = 1;return MotionEvent.obtain(lastMouseDown, now,action,1, pointerProperties, pointerCoords,0, 1,1f, 1f,0, 0,InputDevice.SOURCE_TOUCHSCREEN, 0);}
    • 滾動手勢
    public static MotionEvent createScrollEvent(int x, int y, int hScroll, int vScroll) {long now = SystemClock.uptimeMillis();MotionEvent.PointerCoords[] pointerCoords = {new MotionEvent.PointerCoords()};MotionEvent.PointerCoords coords = pointerCoords[0];coords.x = 2 * x;coords.y = 2 * y;MotionEvent.PointerProperties[] pointerProperties = {new MotionEvent.PointerProperties()};MotionEvent.PointerProperties props = pointerProperties[0];props.id = 0;props.toolType = MotionEvent.TOOL_TYPE_FINGER;coords = pointerCoords[0];coords.orientation = 0;coords.pressure = 1;coords.size = 1;coords.setAxisValue(MotionEvent.AXIS_HSCROLL, hScroll);coords.setAxisValue(MotionEvent.AXIS_VSCROLL, vScroll);return MotionEvent.obtain(lastMouseDown, now, MotionEvent.ACTION_SCROLL, 1, pointerProperties, pointerCoords, 0, 0, 1f, 1f, 0,0, InputDevice.SOURCE_MOUSE, 0);}
    • 注入Event
      最后是調用注入該事件
    public boolean injectInputEvent(InputEvent inputEvent, int mode) {try {return (Boolean) injectInputEventMethod.invoke(service, inputEvent, mode);} catch (InvocationTargetException | IllegalAccessException e) {e.printStackTrace();throw new AssertionError(e);}}

    值得注意的是:一次點擊事件是由一個DOWN 和UP事件組成的。

    進行通信

    Client端(PC端)發送事件

    通過SDL2的事件循環來監聽,對輸入的事件進行相應

    開啟事件循環

    需要注意的是:

  • 必須在主線程內(main方法所在的線程內)開啟事件循環
    否則分分鐘給你一個異常。
  • 開啟事件循環后,窗口上就出現按鈕了

    ?

    開啟事件循環前

    ?

    開啟事件循環后出現窗口上的按鈕.png

  • 開啟事件循環代碼

    //開啟Event Loopfor (;;) {SDL_WaitEvent(&event);//這里我們主要相應了if (event.type == SDL_MOUSEBUTTONDOWN) { //點擊事件的DOWNhandleButtonEvent(sc, &event.button);} else if (event.type == SDL_MOUSEBUTTONUP) { //點擊事件的UPhandleButtonEvent(sc, &event.button);} else if (event.type == SDL_KEYDOWN) { //按鍵事件DOWNhandleSDLKeyEvent(sc, &event.key);} else if (event.type == SDL_KEYUP) { //按鍵事件UPhandleSDLKeyEvent(sc, &event.key);} else if (event.type == SDL_MOUSEWHEEL) { // 滾輪事件//處理滑動事件handleScrollEvent(sc, &event.wheel);} else if (event.type == SDL_QUIT) { // 點擊窗口上的關閉按鈕printf("rev event type=SDL_QUIT\n");sc->destroy();break;}

    事件處理代碼
    其實就是將這些事件解析成坐標,然后通過socket發送

    //對應點擊事件 void handleButtonEvent(SDL_Screen *screen, SDL_MouseButtonEvent *event) {int width = screen->screen_w;int height = screen->screen_h;int x = event->x;int y = event->y;//是否超過來邊界bool outside_device_screen = x < 0 || x >= width ||y < 0 || y >= height;if (event->type == SDL_MOUSEBUTTONDOWN) {}printf("outside_device_screen =%d\n", outside_device_screen);if (outside_device_screen) {// ignorereturn;}char buf[6];memset(buf, 0, sizeof(buf));printf("event x =%d\n", event->x);printf("event y =%d\n", event->y);printf("event char size =%zu\n", sizeof(char));buf[0] = 0;if (event->type == SDL_MOUSEBUTTONDOWN) {//發送down 事件buf[1] = 1;} else {// 發送UP事件buf[1] = 0;}//高8位buf[2] = event->x >> 8;//低8位buf[3] = event->x & 0xff;//高8位buf[4] = event->y >> 8;//低8位buf[5] = event->y & 0xff;int result = send(client_event, buf, 6, 0);printf("send result = %d\n", result); }// 對應滑動事件 // Convert window coordinates (as provided by SDL_GetMouseState() to renderer coordinates (as provided in SDL mouse events) // // See my question: // <https://stackoverflow.com/questions/49111054/how-to-get-mouse-position-on-mouse-wheel-event> void handleScrollEvent(SDL_Screen *sc, SDL_MouseWheelEvent *event) {//處理滑動事件int x_c;int y_c;int *x = &x_c;int *y = &y_c;SDL_GetMouseState(x, y);SDL_Rect viewport;float scale_x, scale_y;SDL_RenderGetViewport(sc->sdl_renderer, &viewport);SDL_RenderGetScale(sc->sdl_renderer, &scale_x, &scale_y);*x = (int) (*x / scale_x) - viewport.x;*y = (int) (*y / scale_y) - viewport.y;int width = sc->screen_w;int height = sc->screen_h;//是否超過來邊界bool outside_device_screen = x_c < 0 || x_c >= width ||y_c < 0 || y_c >= height;printf("outside_device_screen =%d\n", outside_device_screen);if (outside_device_screen) {// ignorereturn;}SDL_assert_release(x_c >= 0 && x_c < 0x10000 && y_c >= 0 && y_c < 0x10000);//使用這個來記錄滑動的方向// SDL behavior seems inconsistent between horizontal and vertical scrolling// so reverse the horizontal// <https://wiki.libsdl.org/SDL_MouseWheelEvent#Remarks>// SDL 的滑動情況,兩個方向不一致int mul = event->direction == SDL_MOUSEWHEEL_NORMAL ? 1 : -1;int hs = -mul * event->x;int vs = mul * event->y;char buf[14];memset(buf, 0, sizeof(buf));printf(" x_c =%d\n", x_c);printf(" y_c =%d\n", y_c);printf(" hs =%d\n", hs);printf(" vs =%d\n", vs);buf[0] = 0;//滾動事件buf[1] = 2;//高8位buf[2] = x_c >> 8;//低8位buf[3] = x_c & 0xff;//高8位buf[4] = y_c >> 8;//低8位buf[5] = y_c & 0xff;//繼續滾動距離buf[6] = hs >> 24;//低8位buf[7] = hs >> 16;buf[8] = hs >> 8;buf[9] = hs;//高8位buf[10] = vs >> 24;//低8位buf[11] = vs >> 16;buf[12] = vs >> 8;buf[13] = vs;int result = send(client_event, buf, 14, 0);printf("send result = %d\n", result);}//對應鍵盤上的按鈕事件。 void handleSDLKeyEvent(SDL_Screen *sc, SDL_KeyboardEvent *event) {//分別對應 mac 上的 control option commandint ctrl = event->keysym.mod & (KMOD_LCTRL | KMOD_RCTRL);int alt = event->keysym.mod & (KMOD_LALT | KMOD_RALT);int meta = event->keysym.mod & (KMOD_LGUI | KMOD_RGUI);printf("ctrl = %d,", ctrl);printf("meta = %d,", meta);printf("alt = %d,\n", alt);因為我是mac鍵盤,期望control+ H = home鍵 control+b = back鍵//再去取keycodeSDL_Keycode keycode = event->keysym.sym;printf("keycode = %d, action type = %d\n", keycode, event->type);printf("b = %d, action type = %d\n", SDLK_b, event->type);if (event->type == SDL_KEYDOWN && ctrl != 0) {//這個時候發送的是按下的狀態if (keycode == SDLK_h) {char buf[4];memset(buf, 0, sizeof(buf));buf[0] = 0;//自定義的案件事件buf[1] = 3;//1 是 downbuf[2] = 1;//key code home 鍵對應的是 3buf[3] = 3;int result = send(client_event, buf, 4, 0);printf("send result = %d\n", result);} else if (keycode == SDLK_b) {char buf[4];memset(buf, 0, sizeof(buf));buf[0] = 0;//自定義的案件事件buf[1] = 3;//1 是 downbuf[2] = 1;//key code back 鍵對應的是 4buf[3] = 4;int result = send(client_event, buf, 4, 0);printf("send result = %d\n", result);}}if (event->type == SDL_KEYUP && keycode != 0) {if (keycode == SDLK_h) {char buf[4];memset(buf, 0, sizeof(buf));buf[0] = 0;//自定義的案件事件buf[1] = 3;//1 是 upbuf[2] = 0;//key code home 鍵對應的是 3buf[3] = 3;int result = send(client_event, buf, 4, 0);printf("send result = %d\n", result);} else if (keycode == SDLK_b) {char buf[4];memset(buf, 0, sizeof(buf));buf[0] = 0;//自定義的案件事件buf[1] = 3;//1 是 upbuf[2] = 0;//key code back 鍵對應的是 4buf[3] = 4;int result = send(client_event, buf, 4, 0);printf("send result = %d\n", result);}} }

    這里可以看到,根據每一種事件,都定義了對應的方式進行發送。那Android端,可以通過對應的方式進行接收就可以了~

    • Server端(Android端)接收事件
      接收client端發送的事件。將其解析,注入
    do {//讀到數據int read = Os.read(fileDescriptor, buffer);System.out.println("read=" + read + ",position=" + buffer.position() + "," +"limit=" + buffer.limit() + ",remaining " + buffer.remaining());//當讀到的長度為0,就結束了。if (read == -1 || read == 0) {//如果這個時候read 0 的話。就結束break;} else {buffer.flip();//上面定義的,如果是按鈕事件,第一個必須是0byte b = buffer.get(0);//進入對應的事件if (b == 0 && read > 1) { //如果是0 的話,就當作是Action//第2個是判斷事件的類型byte type = buffer.get(1);//按鍵事件。它發送時定義的長度是6if (type < 2 && read == 6) {//action down 1 down 0 upSystem.out.println("enter key event");buffer.position(1);int x = buffer.get(2) << 8 | buffer.get(3) & 0xff;int y = buffer.get(4) << 8 | buffer.get(5) & 0xff;//接受到事件進行處理boolean key = createKey(serviceManager, type, x, y);buffer.clear();} else if (type == 2 && read == 14) { //滾動事件.定義的長度是14buffer.position(1);//x,y是接觸的點,hs是水平的滑動,vs 是上下的滑動int x = buffer.get(2) << 8 | buffer.get(3) & 0xff;int y = buffer.get(4) << 8 | buffer.get(5) & 0xff;int hs = buffer.get(6) << 24 | buffer.get(7) << 16 | buffer.get(8) <<8 | buffer.get(9);int vs = buffer.get(10) << 24 | buffer.get(11) << 16 | buffer.get(12) <<8 | buffer.get(13);//接受到事件進行處理boolean b1 = injectScroll(serviceManager, x, y, hs, vs);// 處理完,記得清楚bufferbuffer.clear();} else if (type == 3 && read == 4) { //接受按鍵事件,長度是4System.out.println("enter key code event");int action = buffer.get(2) == 1 ? KeyEvent.ACTION_DOWN : KeyEvent.ACTION_UP;int keyCode = buffer.get(3);boolean key = injectKeyEvent(serviceManager, action, keyCode);// 處理完,記得清楚bufferbuffer.clear();}}}} while (!eof);

    這樣就可以進行事件的相應了。

    顯示和處理事件的優化

    梳理優化邏輯

  • 解碼線程異步
    雖然我們已經通過Android的Api實現了按鍵注入,并且定義了Socket兩端對按鍵通信的協議。但是我們之前將解碼的循環已經寫在主線程中了。這樣我們需要將事件的循環加入到主線程中,才能對事件發起響應。
    所以我們需要為我們的解碼循環,創建一個解碼線程,在異步進行解碼。
  • Socket通信異步
    同時,和上一章相同,結合我們豐富的開發經驗知道,我們不能將耗時任務,放在主線程當中。所以事件通信。我們也需要放到異步處理。
  • 隊列操作
    我們知道事件循環會源源不斷的送入,而我們的事件發送只能一個一個的發送。所以我們需要為事件循環加入隊列的緩存。從主線程中接受事件,從發送線程中,對隊列中的事件進行一個一個的處理。
    同時,根據之前的學習,我們也知道,我們的ffmpeg解碼和顯示其實也應該加入隊列顯示。這樣我們就可以防止丟幀的存在。
    但是我們這里為了簡單顯示,只是緩存了兩幀。
    一幀負責送顯。一幀負責接受解碼的幀。
  • 線程模型

    優化后的線程模型如下:

    - client端(PC)- event_loopSDL的EventLoop。復制渲染上屏和分發事件- event_sender(Socket send)接受SDL分發的事件。并把對應的事件通過Socket分發給Android手機。- screen_receiver(Socket recv)通過Socket接受的 H264 Naul,使用FFmpeg進行解碼。- server端(Android)- screen record (Socket InputStream)使用SurfaceControl和MediaCodec進行屏幕錄制,錄制的結果通過Socket發送- event_loop (Socket OutputStream)接受Socket發送過來的事件。并調用對應的API進行事件的注入(InputManager)### 線程通信 - frames 兩塊緩存區域。- decode_frame解碼放置的frame- render_frame渲染需要的frame.使用該frame 進行render 數據流動- 生產的過程screen_receiver 負責生產。- 消費的過程event_loop 負責消費。將兩塊緩存區域進行交換,并把render_frame上屏- event 一個event_queue隊列來接受。可以使用鏈表 數據流動- 生產的過程event_loop 負責生產。并把數據送入隊列當中- 消費的過程event_sender 負責消費。如果隊列不為空,則進行發送

    這里就不詳細說明了。具體可以看代碼就明白了。

    最后的結果

    ?

    最后的結果.gif


    就和Vysor和scrcpy一樣,我們可以通過投屏PC ,并操作手機了。而且在很低的延遲下。

    ?

    源碼地址:https://github.com/deepsadness/AppProcessDemo

    還有更多的細節處理,可以參考scrcpy

    總結

    Android PC投屏簡單嘗試 這一系列文章,終于到了尾聲。總共橫跨了大半年的事件。
    最后分成下面幾個方面來進行一下總結

    數據源

    截屏數據的獲取

  • Android的MediaProjection API
    通過MediaProjection的權限的獲取和調用其API就能創建一個屏幕的錄制屏幕
  • 直接反射調用SurfaceControl的系列方法
    因為在app_process下,我們有較高的權限。所以可以直接通過反射調用SurfaceControl
    的方法,來完成錄制屏幕數據的獲取。(參考adb screenrecord 命令)
  • 截屏數據的處理

  • MediaCodec硬件編碼
    使用MediaCodec結合Surface ,能容易就能得到編碼后的H264數據。
  • 使用ImageReader的方式。
    使用ImageReader 的方式,可以獲取一幀一幀的數據。之后我們可以選擇直接發送Bitmap數據。或者結合自己的軟件解碼器(FFmpeg或者X264)來編碼獲得H264數據。
  • 發送的協議

    自己定義的Socket協議

    就是適合簡單的發送Bitmap。只要接受端能夠解析這個bitmap數據,就可以完成數據的展示。

    RTMP協議

    可以通過在服務端建立RTMP協議,然后通過這個協議進行。使用RTMP協議發送的好處在于,需要播放的端只要支持該協議,就可以輕松的進行拉流播放。

    通過USB和ADB協議進行連接

    這個僅僅適合于PC能夠直接用ADB和手機連接的場景。
    但是在這個場景下,投屏的效果清晰,流暢,延遲很低。
    暫時部分,因為直接發送H264數據,只要進行解碼后,就可以進行播放了。(文章使用了SDL2的方式進行了方便的播放。)

    知識點

    整個過程中
    我們對Media Codec和ImageReader/RTMP協議/FFmpeg/SDL2/Gradle進行了知識點的串聯。
    其實還是挺好玩的。

    另外

    如果是需要改成手機和手機連接。我們要怎么實現呢?
    其實從上面不難看出。如果是手機和手機連接。
    在近距離,我們可以簡單的使用藍牙進行Socket(類似ADB和USB的通信方式)。
    如果是遠距離,就可以通過RMTP的方式,來進行推流和拉流。

    最后,完結撒花?~~

    投屏嘗試系列文章

    • Android PC投屏簡單嘗試- 自定義協議章(Socket+Bitmap)
    • Android PC投屏簡單嘗試(錄屏直播)2—硬解章(MediaCodec+RMTP)
    • Android PC投屏簡單嘗試(錄屏直播)3—軟解章(ImageReader+FFMpeg with X264)

    ?



    作者:deep_sadness
    鏈接:https://www.jianshu.com/p/c2da5174d5f7
    來源:簡書
    簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的Android PC投屏简单尝试—最终章2的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    亚洲少妇激情 | 国产色拍 | 午夜视频免费在线观看 | 91传媒91久久久 | 日韩免费在线视频观看 | 天天夜夜亚洲 | 欧美精品免费一区二区 | 亚洲www天堂com | 天天干天天干 | av电影免费在线看 | 天堂成人在线 | 97免费视频在线播放 | 欧美最新大片在线看 | 国产色视频一区二区三区qq号 | 久操视频在线免费看 | 国产精品黄色av | 久久久久久久久久久综合 | 99国产视频 | 久久综合九九 | 欧美日韩不卡一区二区 | 91精品啪在线观看国产81旧版 | 国产视频在线观看一区 | 在线看成人av | 美女黄视频免费 | 亚洲精品资源在线观看 | 久久久www免费电影网 | 大荫蒂欧美视频另类xxxx | 国产精品夜夜夜一区二区三区尤 | www91在线| 国产h在线观看 | 日日碰夜夜爽 | 特级黄色一级 | 国产精品完整版 | 欧美日韩一二三四区 | 97国产精品 | 丁香婷婷久久久综合精品国产 | 国产一区成人在线 | 91av视频免费在线观看 | 亚洲精品在线看 | 久久久鲁| 日韩精品aaa| 日韩在线网 | 日韩理论在线播放 | 国产亚洲91| 久久久久亚洲精品中文字幕 | 久久久久久久久久久久久久免费看 | 日韩av网站在线播放 | 国产免费a | 麻豆视频在线免费观看 | 97成人精品视频在线播放 | 日本免费久久高清视频 | 成年人在线看视频 | 成人av电影在线播放 | av在线之家电影网站 | 日韩xxxx视频 | 五月天最新网址 | 99热九九这里只有精品10 | 国产午夜精品一区二区三区嫩草 | 99精品久久久久久久 | 三级免费黄色 | 中文在线免费看视频 | 天天操天天舔天天爽 | 精品一区 精品二区 | 91女人18片女毛片60分钟 | 日日干天天 | av九九| 2000xxx影视 | 美女网站视频免费都是黄 | 免费观看性生活大片 | 麻豆91在线 | 国产精品美女久久久久久2018 | 免费看国产视频 | 久久成年人网站 | 91免费试看 | av在线免费网站 | 亚洲一区二区精品3399 | 婷婷福利影院 | 一级黄视频 | 激情av网址| 久久精品男人的天堂 | 欧美日韩三区二区 | 亚洲永久精品国产 | 日韩一区二区三区观看 | 日韩欧美网址 | 深爱激情av | 337p日本欧洲亚洲大胆裸体艺术 | 91精品久久久久久久99蜜桃 | 不卡电影一区二区三区 | 一本色道久久综合亚洲二区三区 | 国产永久网站 | 国产精品va在线播放 | 干av在线| 亚洲三级精品 | 免费网站在线 | 99r在线播放 | 国产一区二区手机在线观看 | 欧美精品v国产精品 | 国产精品免费久久久久久 | 国产高清不卡 | 很黄很色很污的网站 | 丁香六月在线观看 | 免费国产黄线在线观看视频 | 国产91电影在线观看 | 国产群p| 在线国产激情视频 | 特级黄录像视频 | 狠狠干 狠狠操 | 亚洲 欧美 变态 国产 另类 | 视频一区视频二区在线观看 | 91在线国内视频 | 免费国产黄线在线观看视频 | 国产97色在线 | 欧美一区日韩一区 | 亚洲aaa毛片| 午夜精品久久久久久久久久久久 | www.伊人网.com | 国色天香在线 | 天天操天天干天天操天天干 | 日韩高清免费在线 | 欧美黄色特级片 | 日韩女同av | 久久久久看片 | 久久久久久久久久福利 | 四虎天堂| 免费观看视频黄 | 日韩成人免费在线 | 激情喷水 | 日韩69视频| 中文字幕视频播放 | 久久999精品 | 伊人婷婷激情 | 日韩理论在线播放 | 久久久久久久久久久网站 | 久草国产在线 | 黄色免费观看 | 国产成人333kkk | 日韩资源视频 | 国产乱老熟视频网88av | 久久精品五月 | 国产精品久久久久久久av电影 | 狠狠ri| 免费三级大片 | 国产黄色在线网站 | 成年人黄色免费视频 | av性在线| 亚洲精品乱码久久久久久久久久 | 99免费在线观看视频 | 亚洲精品视频在线 | 国产91aaa| 久久久久久久久久亚洲精品 | 一级免费av | 日韩免费区 | 91超碰免费在线 | 日本精品在线看 | 91精品视频观看 | 国产一级片免费播放 | 天天操天天干天天摸 | 一个色综合网站 | 激情欧美一区二区三区 | 日韩在线中文字幕视频 | 在线观看免费91 | 国产精品成人自产拍在线观看 | 激情网色| 国产黄色精品在线 | 99在线热播精品免费99热 | 久久精品久久精品久久39 | 最近字幕在线观看第一季 | av免费网站在线观看 | 成人免费视频免费观看 | 久久久久高清毛片一级 | 亚洲桃花综合 | 久久成人国产精品一区二区 | 蜜臀av性久久久久蜜臀av | 911国产| 日韩va亚洲va欧美va久久 | 久久99久久99精品免观看软件 | 日韩成人在线免费观看 | a级片久久| 久久好看免费视频 | 免费久久网 | 人人爽人人爽人人爽学生一级 | 欧美成a人片在线观看久 | 国产高清视频在线观看 | 久久免费视频这里只有精品 | 粉嫩一区二区三区粉嫩91 | 亚洲成人免费 | 日韩欧美高清在线观看 | 国产又粗又硬又爽的视频 | 中文超碰字幕 | 日本婷婷色 | 国产看片免费 | 中文字幕在线一区观看 | 成人夜晚看av| 国产一级免费在线 | 91精品视频免费看 | 日日干天天爽 | 久久综合婷婷国产二区高清 | 国产精品正在播放 | 91成人免费看片 | 91色在线观看视频 | 亚洲国产小视频在线观看 | 亚洲欧美视频网站 | 中文字幕在线观看视频一区 | 亚洲高清久久久 | 久久久久色 | 久久九九影院 | www色网站 | 国产精品第一视频 | 免费视频一二三 | 在线成人欧美 | 人人cao| 免费不卡中文字幕视频 | 区一区二在线 | 最新中文在线视频 | 欧美大香线蕉线伊人久久 | 草久在线观看视频 | 1024手机看片国产 | 精品视频999 | 成在线播放 | 亚洲自拍自偷 | av片中文 | 黄色最新网址 | 天堂在线v | 免费看成人av | av一区二区三区在线观看 | 99精品热视频只有精品10 | 在线视频一二区 | 不卡视频在线 | 91最新视频在线观看 | 国产成人久久精品亚洲 | 欧美日韩不卡在线 | 成年美女黄网站色大片免费看 | 一区二区三区 中文字幕 | 综合精品在线 | 在线国产日本 | 亚州日韩中文字幕 | 日韩一级片网址 | 欧美成a人片在线观看久 | 麻豆影视网 | 成人性生交大片免费观看网站 | 国产日韩av在线 | 成人黄色大片在线免费观看 | 色a综合 | 在线视频 亚洲 | 在线观看精品 | 特级大胆西西4444www | 97日日碰人人模人人澡分享吧 | 中文字幕日本特黄aa毛片 | 亚洲一区二区三区毛片 | 五月婷婷六月丁香激情 | 九月婷婷综合网 | 国产成人免费观看 | 国产精品高潮在线观看 | 99视频精品全部免费 在线 | 91视频免费看片 | 中文永久免费观看 | 91精品国产91热久久久做人人 | 香蕉视频91| 欧美aaa视频 | 欧美美女视频在线观看 | 亚洲一区视频免费观看 | 伊人影院得得 | 一级一片免费观看 | 92av视频| a午夜电影 | 99久在线精品99re8热视频 | 国产呻吟在线 | 免费视频xnxx com | 欧美a级在线免费观看 | 欧美日韩国产伦理 | 日本中文字幕一二区观 | 五月天网页 | 国产婷婷精品av在线 | 久草精品视频在线播放 | 亚洲国产成人av网 | 91看片麻豆 | 亚洲精品免费在线 | 亚洲天天看 | av网址最新 | 久久好看 | av字幕在线 | 激情视频91| 国产在线不卡一区 | 免费观看成年人视频 | 91成人精品国产刺激国语对白 | 久草网站在线 | 国产日韩欧美在线播放 | 6699私人影院 | 97精品视频在线 | 天天操夜夜叫 | 久久99久久99久久 | 国产精品露脸在线 | 夜夜澡人模人人添人人看 | 国产一区二区手机在线观看 | 亚洲黄色在线观看 | 精品视频区| 黄色毛片视频免费 | 久久免费精品一区二区三区 | 玖玖视频网 | 国产xx在线 | 五月综合色婷婷 | 婷婷精品在线视频 | 丝袜美腿在线视频 | 特级黄色片免费看 | 99久久99久久精品免费 | 亚洲精品日韩一区二区电影 | 激情小说网站亚洲综合网 | 日韩精品视频在线免费观看 | 91在线资源 | 99精品国产免费久久久久久下载 | 免费观看视频黄 | 香蕉视频在线播放 | 色婷婷av国产精品 | 在线免费黄色av | 色天天综合网 | 成人资源在线 | 亚洲天天草 | av免费网站 | 亚洲久在线 | 国产美女被啪进深处喷白浆视频 | 国产特级毛片aaaaaa | 久久尤物电影视频在线观看 | 99在线高清视频在线播放 | 欧美午夜视频在线 | 免费在线黄网 | 日韩免费视频网站 | 夜夜躁日日躁狠狠久久av | 国产精品欧美一区二区三区不卡 | 成人午夜电影免费在线观看 | 97视频免费观看2区 亚洲视屏 | 天天操天天拍 | 麻豆一精品传二传媒短视频 | 久久五月天婷婷 | 狠狠天天 | 97在线观| 中文在线天堂资源 | 99久久激情| 999视频网站 | www久久国产| 国际精品久久久久 | 国产 视频 高清 免费 | 日日夜精品 | 日韩精品中文字幕一区二区 | 欧美做受高潮电影o | 日日操夜 | 91麻豆高清视频 | 91九色视频在线观看 | 99热 精品在线 | 国产一区二区网址 | 亚洲精品理论 | 黄色美女免费网站 | 成人av高清 | 又湿又紧又大又爽a视频国产 | 色精品视频 | 奇米影视四色8888 | 国产一区欧美日韩 | 亚洲国产精品va在线看黑人 | 天天操天天射天天爽 | 欧美精品一区二区三区一线天视频 | 日日操日日操 | 欧美a级片免费看 | 日本一区二区免费在线观看 | 国产精品午夜在线观看 | 欧美性久久久久久 | 人人爱天天操 | 在线观看日本高清mv视频 | 精品亚洲va在线va天堂资源站 | 久久国产精品一国产精品 | 超碰免费在线公开 | 日本黄色黄网站 | 久久久久久久福利 | 日韩欧美精品在线观看 | 999久久久免费视频 午夜国产在线观看 | 免费看成年人 | 日韩专区在线观看 | 久久成人精品电影 | 国产黑丝一区二区 | 在线观看午夜av | 在线电影 一区 | 日韩欧美高清一区二区三区 | 黄色大片日本免费大片 | 黄色av电影在线 | 综合网婷婷 | 最近日本中文字幕 | 日本色小说视频 | 狂野欧美激情性xxxx | 久久综合九色欧美综合狠狠 | 久久久国产精品一区二区三区 | 亚洲精品合集 | 成人午夜精品久久久久久久3d | 国产91大片 | 不卡av电影在线 | 亚洲欧美成人在线 | 五月婷婷黄色 | 国产精品无| 五月婷婷在线播放 | 在线观看国产日韩欧美 | 欧美一区二区在线免费观看 | 久久不见久久见免费影院 | 一区二区三区四区精品视频 | 亚洲成人免费在线观看 | a在线免费观看视频 | 狠狠插天天干 | 久久久国产影视 | bbbb操bbbb | 精品一区二区在线看 | 精品a级片| 久久草草影视免费网 | 午夜精品电影 | zzijzzij日本成熟少妇 | 欧美日韩久 | 欧美一级小视频 | 91免费日韩| 麻豆精品传媒视频 | 国产成人一区二区三区在线观看 | 97超碰免费在线观看 | 欧美午夜a | 日韩免费b| 欧美精品在线观看 | av线上免费观看 | 国产精品嫩草69影院 | 日日噜噜噜噜夜夜爽亚洲精品 | 天天在线视频色 | 91人人网 | 高清av网| 久久麻豆视频 | 久久久精品网站 | 97免费在线视频 | 亚洲国产日韩精品 | 日韩欧美v | 亚洲精品久久久蜜桃 | 国产精品免费看久久久8精臀av | 激情久久五月 | 免费看国产一级片 | 永久免费观看视频 | 青青射 | 精品亚洲免费 | av不卡免费看| 激情五月在线观看 | 天天色天天操综合 | 最新一区二区三区 | 亚洲成人精品在线观看 | 成人黄色国产 | 成人免费在线视频观看 | 国产综合香蕉五月婷在线 | 天堂av在线网站 | 欧美日韩国产精品一区二区亚洲 | 四虎成人av | 色五月成人 | 国产裸体无遮挡 | 国产成人久久av免费高清密臂 | 夜夜爽88888免费视频4848 | 天天射天天爱天天干 | 国产精品成人自产拍在线观看 | 亚洲高清视频在线观看免费 | 国产精品久久久久国产a级 激情综合中文娱乐网 | av免费观看网址 | 婷婷开心久久网 | 国产精品久久久久久高潮 | 91精品色 | 日日操操 | 在线观看深夜视频 | 亚洲精品免费在线视频 | 久久av一区二区三区亚洲 | 五月婷婷精品 | 中文av一区二区 | 99c视频在线 | 97国产精品亚洲精品 | 国产精品美女久久久网av | www免费在线观看 | 国产流白浆高潮在线观看 | 91人人爱| 福利一区在线视频 | 国产精品免费一区二区三区 | 国产美女精品视频 | 婷婷伊人网 | 91成人短视频在线观看 | 91丨九色丨蝌蚪丰满 | 国产亚洲va综合人人澡精品 | 日本中文字幕视频 | 999亚洲国产996395 | 国产国语在线 | 国产精品毛片一区二区 | 九九九热精品 | 国产麻豆果冻传媒在线观看 | 日本久久影视 | 国产免费叼嘿网站免费 | 欧美日韩激情视频8区 | 国产毛片在线 | 欧美性网站 | 精品一区二区久久久久久久网站 | 91传媒免费观看 | 午夜的福利 | 免费在线激情电影 | 国产xxxxx在线观看 | 中文资源在线观看 | 成人午夜电影在线播放 | 婷婷福利影院 | 午夜私人影院久久久久 | 91高清一区| 777久久久 | 欧美一区中文字幕 | 在线观看日韩av | 波多野结衣动态图 | 亚洲精选在线观看 | 黄色国产大片 | 亚洲无毛专区 | 五月激情亚洲 | 91网站观看 | 久久久精品久久日韩一区综合 | 99久久精品免费看 | 亚洲乱亚洲乱亚洲 | 99国产视频 | 久草免费福利在线观看 | 黄色小说在线免费观看 | 日韩精品免费一区二区在线观看 | 久草视频在线新免费 | 成人在线视频在线观看 | av福利在线导航 | 久久免费视频精品 | 国产精品黄色 | 国产综合视频在线观看 | 国产黄色在线观看 | 国产婷婷色 | 97在线视频免费观看 | av在线官网 | 久久久久久久久久久精 | 国产视频日韩 | 九九热在线观看 | 国产一级在线观看视频 | 国产裸体视频网站 | 免费福利视频导航 | 99久久99视频只有精品 | 国产亚洲视频在线 | 97香蕉视频 | 玖玖玖影院 | av久久在线 | 欧美 日韩 国产 中文字幕 | 美女视频免费精品 | 天天干一干| 免费在线黄色av | 天天插天天爱 | 不卡的av片 | 欧美午夜a | 国产一在线精品一区在线观看 | 国产经典 欧美精品 | a在线观看国产 | 人人干人人爽 | 欧美日韩性 | 国产手机av | 国产精品美女毛片真酒店 | 欧美日韩一区久久 | 久久免费试看 | 日韩伦理片一区二区三区 | 久久成人午夜视频 | 久草在线免费在线观看 | 狠狠色伊人亚洲综合成人 | 国产精品18久久久 | 国产视频不卡一区 | 在线日韩一区 | 久久国内视频 | 伊人色**天天综合婷婷 | 黄色a视频免费 | 一区二区三区 中文字幕 | 国产精品一区二区av麻豆 | 日韩中文字幕视频在线观看 | 日韩在线观看av | 国产三级午夜理伦三级 | 亚洲日韩欧美一区二区在线 | 欧美久久久一区二区三区 | 成人h视频在线播放 | 日韩一级片观看 | 久久综合九色综合久99 | 成av人电影| 亚洲成人精品影院 | 亚洲有 在线 | 国产黄色精品在线 | 在线观看成人网 | 亚洲免费一级 | 精品伦理一区二区三区 | 91女子私密保健养生少妇 | 欧美一区二区三区不卡 | 96精品视频| 日韩二区在线播放 | 亚洲精品人人 | www.久久久 | 精品久久久久久久久久久久久 | 免费的成人av | 狠狠色香婷婷久久亚洲精品 | 免费能看的黄色片 | 精品国产免费一区二区三区五区 | 91成人免费观看视频 | 中文字幕一区二区三区乱码不卡 | 久久99国产综合精品 | 国产精品自产拍 | 超碰97网站| 国语精品久久 | 亚洲影音先锋 | 69绿帽绿奴3pvideos | 久久精品国产免费看久久精品 | 日韩三级视频在线观看 | 亚洲成人资源在线观看 | 91人人澡| 亚洲午夜精品一区二区三区电影院 | 亚洲精品女人 | 99热九九这里只有精品10 | 国产精品夜夜夜一区二区三区尤 | 亚洲最大av| 日本中文乱码卡一卡二新区 | 999久久久久久久久 69av视频在线观看 | 国产精品久久嫩一区二区免费 | 精品中文字幕在线播放 | 欧美日韩国产在线观看 | 中文字幕在线观看不卡 | 欧美最猛性xxxx | 国产激情久久久 | 中文字幕一二三区 | 狠狠操狠狠 | 欧美一级特黄高清视频 | 日本久久免费视频 | 久久精品首页 | 久久9999久久免费精品国产 | 精品久久久久久亚洲综合网 | 一区二区三区四区不卡 | 日韩日韩日韩日韩 | 91在线免费观看国产 | 亚洲 综合 专区 | 国产一区二区精品 | 亚洲综合色激情五月 | 97成人资源站 | 国偷自产中文字幕亚洲手机在线 | 天天色欧美 | 青青啪| 久久久久久久久久亚洲精品 | 中文字幕一区在线观看视频 | 国产成人av一区二区三区在线观看 | 国产va精品免费观看 | 日日操天天爽 | 久久免费视频网站 | www.天天色 | 免费男女羞羞的视频网站中文字幕 | 国产精品影音先锋 | 国产亚洲在| 免费日韩一区二区 | 一区二区 精品 | 亚洲美女视频网 | 亚洲精品美女免费 | 婷婷日| www.夜夜干.com| 国产vs久久 | 成人午夜免费福利 | 国内精品视频在线 | 亚洲欧美怡红院 | 97av在线 | 在线观看日韩专区 | 成人午夜电影免费在线观看 | 国产一级视频 | 天天做天天爱天天综合网 | 91免费视频国产 | 色哟哟国产精品 | 伊人久久国产精品 | 欧美性春潮| 人人澡人摸人人添学生av | 色香蕉在线| 日韩爱爱片 | 色噜噜在线观看视频 | 午夜成人免费电影 | 99在线视频播放 | 日韩在线观看视频中文字幕 | 亚洲伊人色 | 久久精品视频免费播放 | 久久久久在线 | av久久在线 | 亚洲欧美视频在线播放 | 天天操狠狠操网站 | 色偷偷人人澡久久超碰69 | 国产亚洲欧美一区 | 久久久精品 | 亚洲国产一区av | 欧美成年人在线观看 | 探花视频在线观看免费 | 色婷婷激情网 | 香蕉手机在线 | 久久好看免费视频 | 91亚色在线观看 | 中国精品一区二区 | 99久久久国产精品免费99 | 最近日本字幕mv免费观看在线 | 一本之道乱码区 | 欧美特一级 | 国产一二三区在线观看 | 国产资源在线免费观看 | 伊人国产在线播放 | 美女激情影院 | 精品国产一区二区三区男人吃奶 | 亚洲 欧美 成人 | 黄色福利网站 | 涩涩网站在线观看 | 在线视频精品播放 | 黄色av网站在线观看免费 | 超碰99在线 | 偷拍区另类综合在线 | 午夜91视频| 久久精品综合视频 | 国产日本亚洲 | 欧美孕妇与黑人孕交 | 日韩在线视频在线观看 | 综合网五月天 | 久久99国产综合精品免费 | 在线成人性视频 | 日韩视频1 | 在线免费精品视频 | 日韩最新中文字幕 | 免费午夜网站 | 久久亚洲影视 | 麻豆91精品视频 | 国产性xxxx | 午夜精品一区二区三区四区 | 久久再线视频 | 黄色一级免费 | 成人欧美亚洲 | 成人全视频免费观看在线看 | 日韩视频专区 | 国产视频日韩 | 99久久久国产精品免费99 | 成人黄色av免费在线观看 | 欧美激情视频一区 | 久久婷婷影视 | 精品成人久久 | 亚洲国产日韩av | 日韩欧美一区视频 | 婷婷激情综合五月天 | 黄色小说视频网站 | 国产黄色视 | 久久一区91 | 美女黄频网站 | 在线观看av黄色 | 毛片网站在线观看 | 97日日碰人人模人人澡分享吧 | 国产精品免费在线观看视频 | 日日夜夜噜 | 日韩特级片 | 日本特黄一级片 | 久久久久一区二区三区四区 | 国产精品免费在线播放 | 四虎影视成人精品 | 欧美日韩不卡一区二区三区 | 天天操天天干天天 | 超碰97在线看 | 久av在线 | 又爽又黄又刺激的视频 | 欧洲亚洲精品 | 国产精品免费观看网站 | 麻豆一区二区三区视频 | 亚洲精品美女久久久久网站 | 日韩精品一区二区三区不卡 | 少妇18xxxx性xxxx片 | 超碰在线94 | 中文字幕不卡在线88 | 国产在线免费观看 | 97小视频 | 成年人视频免费在线 | 中文字幕日本在线观看 | 又粗又长又大又爽又黄少妇毛片 | 国产精品视频永久免费播放 | 精品久久久久久久久久久久 | 亚洲精品小视频在线观看 | 中文字幕日韩免费视频 | 99精品视频免费 | 日韩av电影免费观看 | 精品一区二区免费视频 | 久久久久久久久黄色 | 在线观看mv的中文字幕网站 | 欧洲精品在线视频 | 精品国产免费久久 | 五月婷婷一级片 | 中文字幕网址 | 亚洲最新视频在线播放 | 69人人| 国产免费xvideos视频入口 | 午夜精品一区二区三区可下载 | 超碰在线官网 | 亚洲 中文字幕av | 久久久婷 | 久久女同性恋中文字幕 | 成人免费视频网址 | 日韩中文字幕免费视频 | 亚洲成人影音 | 91丨九色丨蝌蚪丨老版 | 天天天天爱天天躁 | 天天干天天射天天插 | 国产日产欧美在线观看 | 亚洲精品国产精品乱码不99热 | 99热在线这里只有精品 | 国产精品美女在线 | 天天操导航 | 美女国产在线 | 日本黄色a级大片 | 69国产精品成人在线播放 | 91免费高清观看 | 天天操综 | 日韩三级免费观看 | 91传媒免费观看 | 精品久久网站 | 97精品国产91久久久久久久 | 久草精品视频 | 92中文资源在线 | 日韩电影在线一区 | 五月婷婷开心中文字幕 | 精品96久久久久久中文字幕无 | av一本久道久久波多野结衣 | 98涩涩国产露脸精品国产网 | 99热只有精品在线观看 | 婷婷中文字幕综合 | 国产一级视频在线 | 国产精品久久电影网 | 激情偷乱人伦小说视频在线观看 | 亚洲国产欧美在线人成大黄瓜 | 亚洲国产午夜精品 | 午夜精品久久久久99热app | 狠狠色狠狠色综合日日92 | 国产盗摄精品一区二区 | 九九免费在线观看 | 久久免费电影网 | 一二三四精品 | 一区二区三区 中文字幕 | 97伊人网 | 99久久免费看 | 国产精品视频app | 亚洲黄色成人av | 免费www视频 | 亚洲精品在线免费观看视频 | 精品毛片久久久久久 | 深夜福利视频在线观看 | 99爱这里只有精品 | 国产色在线,com| 国产午夜精品一区二区三区嫩草 | 韩国一区二区三区在线观看 | 亚洲第一av在线 | 在线涩涩 | 国产一区福利 | 成人黄色免费观看 | 六月激情丁香 | 97超碰精品 | 六月久久婷婷 | 日韩mv欧美mv国产精品 | 国产一级黄色av | 一级精品视频在线观看宜春院 | 精品视频在线免费 | 久久久精品国产免费观看一区二区 | 在线看v片 | 日韩狠狠操 | 久久视频一区二区 | 婷婷色在线| 久久精品8 | 色香蕉在线 | 国产在线不卡精品 | 97超碰人人爱 | 免费又黄又爽的视频 | 久久免费视频7 | 欧美整片sss | 日本不卡一区二区 | 国产精品观看 | 青青久草在线 | 黄色影院在线免费观看 | 久久免费精彩视频 | 成人va天堂 | 亚洲国产中文字幕在线观看 | av色影院| 日韩欧美一区二区三区视频 | av成人黄色 | 国产一级黄色免费看 | 日韩一区二区在线免费观看 | 国产手机av | 中文字幕在线视频国产 | 国产中文字幕大全 | 精品极品在线 | 日日夜夜综合 | 国产成人一级电影 | 色偷偷88欧美精品久久久 | 亚洲国产大片 | 男女激情片在线观看 | 精品国产一区二区久久 | 免费看亚洲毛片 | 天天操天天干天天玩 | 国产视频二区三区 | 成人午夜剧场在线观看 | 国产精品1区2区3区 久久免费视频7 | 日本aaaa级毛片在线看 | 婷婷激情网站 | 色网站国产精品 | 一区二区精品在线视频 | 欧美天天综合 | 亚洲成人网在线 | 欧美日韩国产在线一区 | 久久电影中文字幕视频 | 最近中文国产在线视频 | 一区二区三区国 | 日韩精品观看 | 超碰电影在线观看 | 99国产高清| 国产高清精品在线观看 | 人人爽人人爽人人片av | 精品一区二区在线免费观看 | 中文字幕在线日亚洲9 | 久久久久女人精品毛片九一 | 日韩视频图片 | 人人射av | 在线看小早川怜子av | 蜜臀av性久久久久av蜜臀三区 | 视频一区二区国产 | 日韩一区二区三区高清在线观看 | 国产精品九九九 | 天天综合操 | 久久亚洲人 | 亚洲人成综合 | 久久久天天操 | 绯色av一区 | 亚洲人av免费网站 | 99国产精品久久久久老师 | 久操视频在线免费看 | 亚色视频在线观看 | 天堂在线成人 | 国产视频在线观看免费 | 亚洲欧美日韩精品久久久 | 久久综合电影 | 欧美一级片在线免费观看 | 午夜私人影院 | 爱情影院aqdy鲁丝片二区 | 日韩欧美在线视频一区二区三区 | 色狠狠一区二区 | 91精品在线免费观看视频 | 免费看的黄色网 | 久久一区二区三区国产精品 | 中文字幕麻豆 | 欧美电影黄色 | 欧洲视频一区 | 中日韩欧美精彩视频 | 日韩精品亚洲专区在线观看 | 最近中文字幕mv免费高清在线 | 精品视频免费 | 欧美日韩亚洲一 | 久久久久久久久久伊人 | 九九在线国产视频 | 六月丁香激情网 | 久久国产精品久久久 | 区一区二区三在线观看 | 色综合久 | 99久久久久久久 | 国产亚洲片 | av网站在线观看免费 | 欧美一级黄色片 | 久久国产露脸精品国产 | 国产精品第一 | 国产精品视频专区 | 日本aaa在线观看 | 欧美另类tv | 伊人伊成久久人综合网小说 | 国产日韩三级 | 国产精品青草综合久久久久99 | 免费成人结看片 | 国产一级在线观看视频 | 日本午夜在线亚洲.国产 | 国产最新视频在线观看 | 国产成人精品一区二区三区福利 | 亚洲手机天堂 | 日韩在线观看不卡 | 国产日韩在线一区 | 成+人+色综合 | 亚洲国产中文字幕 | 视频一区二区视频 | 毛片网站免费在线观看 | 韩日电影在线免费看 | 久久九九精品久久 | 日本mv大片欧洲mv大片 | 日韩有码第一页 | 亚洲区视频在线观看 | 九九热在线播放 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 粉嫩av一区二区三区四区在线观看 | 久草视频在线观 | 久久国产精彩视频 | 天天狠狠操 | 日韩在线看片 | 国产第一页在线观看 | 99热精品视 | 欧美午夜性生活 | 国产成人精品一区二三区 | 999抗病毒口服液 | 韩国av免费在线 | 亚洲色图美腿丝袜 | 亚洲一区 av| 99精品视频免费观看视频 | 天天天天天天操 | 日韩av影视在线观看 | 成人观看 | 国产69精品久久99不卡的观看体验 | 婷婷在线看 |