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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

直播技术原理讲解

發布時間:2024/2/28 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 直播技术原理讲解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉:http://blog.csdn.net/huaxun66/article/details/53427771

最近一段時間,視頻直播可謂大火。在視頻直播領域,有不同的商家提供各種的商業解決方案,包括軟硬件設備,攝像機,編碼器,流媒體服務器等。本文要講解的是如何使用一系列免費工具,打造一套視頻直播方案。

視頻直播流程

視頻直播的流程可以分為如下幾步:?
采集 —>處理—>編碼和封裝—>推流到服務器—>服務器流分發—>播放器流播放

1.采集

采集是整個視頻推流過程中的第一個環節,它從系統的采集設備中獲取原始視頻數據,將其輸出到下一個環節。視頻的采集涉及兩方面數據的采集:音頻采集和圖像采集,它們分別對應兩種完全不同的輸入源和數據格式。

  • 音頻采集?
    音頻數據既能與圖像結合組合成視頻數據,也能以純音頻的方式采集播放,后者在很多成熟的應用場景如在線電臺和語音電臺等起著非常重要的作用。音頻的采集過程主要通過設備將環境中的模擬信號采集成 PCM 編碼的原始數據,然后編碼壓縮成 MP3 等格式的數據分發出去。常見的音頻壓縮格式有:MP3,AAC,HE-AAC,Opus,FLAC,Vorbis (Ogg),Speex 和 AMR等。?
    音頻采集和編碼主要面臨的挑戰在于:延時敏感、卡頓敏感、噪聲消除(Denoise)、回聲消除(AEC)、靜音檢測(VAD)和各種混音算法等。

  • 圖像采集?
    將圖像采集的圖片結果組合成一組連續播放的動畫,即構成視頻中可肉眼觀看的內容。圖像的采集過程主要由攝像頭等設備拍攝成 YUV 編碼的原始數據,然后經過編碼壓縮成 H.264 等格式的數據分發出去。常見的視頻封裝格式有:MP4、3GP、AVI、MKV、WMV、MPG、VOB、FLV、SWF、MOV、RMVB 和 WebM 等。?
    圖像由于其直觀感受最強并且體積也比較大,構成了一個視頻內容的主要部分。圖像采集和編碼面臨的主要挑戰在于:設備兼容性差、延時敏感、卡頓敏感以及各種對圖像的處理操作如美顏和水印等。

視頻采集的采集源主要有 攝像頭采集、屏幕錄制和從視頻文件推流。

2.處理

視頻或者音頻完成采集之后得到原始數據,為了增強一些現場效果或者加上一些額外的效果,我們一般會在將其編碼壓縮前進行處理,比如打上時間戳或者公司 Logo 的水印,祛斑美顏和聲音混淆等處理。在主播和觀眾連麥場景中,主播需要和某個或者多個觀眾進行對話,并將對話結果實時分享給其他所有觀眾,連麥的處理也有部分工作在推流端完成。

如上圖所示,處理環節中分為音頻和視頻處理,音頻處理中具體包含混音、降噪和聲音特效等處理,視頻處理中包含美顏、水印、以及各種自定義濾鏡等處理。

3.編碼和封裝

(1)編碼

如果把整個流媒體比喻成一個物流系統,那么編解碼就是其中配貨和裝貨的過程,這個過程非常重要,它的速度和壓縮比對物流系統的意義非常大,影響物流系統的整體速度和成本。同樣,對流媒體傳輸來說,編碼也非常重要,它的編碼性能、編碼速度和編碼壓縮比會直接影響整個流媒體傳輸的用戶體驗和傳輸成本。

  • 視頻編碼的意義?
    原始視頻數據存儲空間大,一個 1080P 的 7 s 視頻需要 817 MB?
    原始視頻數據傳輸占用帶寬大,10 Mbps 的帶寬傳輸上述 7 s 視頻需要 11 分鐘?
    而經過 H.264 編碼壓縮之后,視頻大小只有 708 k ,10 Mbps 的帶寬僅僅需要 500 ms ,可以滿足實時傳輸的需求,所以從視頻采集傳感器采集來的原始視頻勢必要經過視頻編碼。

  • 基本原理?
    為什么巨大的原始視頻可以編碼成很小的視頻呢?這其中的技術是什么呢?核心思想就是去除冗余信息:?
    1)空間冗余:圖像相鄰像素之間有較強的相關性?
    2)時間冗余:視頻序列的相鄰圖像之間內容相似?
    3)編碼冗余:不同像素值出現的概率不同?
    4)視覺冗余:人的視覺系統對某些細節不敏感?
    5)知識冗余:規律性的結構可由先驗知識和背景知識得到

  • 編碼器的選擇?
    視頻編碼器經歷了數十年的發展,已經從開始的只支持幀內編碼演進到現如今的 H.265 和 VP9 為代表的新一代編碼器,下面是一些常見的視頻編碼器:?
    1)H.264/AVC?
    2)HEVC/H.265?
    3)VP8?
    4)VP9?
    5)FFmpeg?
    注:音頻編碼器有Mp3, AAC等。

(2)封裝?
沿用前面的比喻,封裝可以理解為采用哪種貨車去運輸,也就是媒體的容器。?
所謂容器,就是把編碼器生成的多媒體內容(視頻,音頻,字幕,章節信息等)混合封裝在一起的標準。容器使得不同多媒體內容同步播放變得很簡單,而容器的另一個作用就是為多媒體內容提供索引,也就是說如果沒有容器存在的話一部影片你只能從一開始看到最后,不能拖動進度條,而且如果你不自己去手動另外載入音頻就沒有聲音。下面是幾種常見的封裝格式:?
1)AVI 格式(后綴為 .avi)?
2)DV-AVI 格式(后綴為 .avi)?
3)QuickTime File Format 格式(后綴為 .mov)?
4)MPEG 格式(文件后綴可以是 .mpg .mpeg .mpe .dat .vob .asf .3gp .mp4等)?
5)WMV 格式(后綴為.wmv .asf)?
6)Real Video 格式(后綴為 .rm .rmvb)?
7)Flash Video 格式(后綴為 .flv)?
8)Matroska 格式(后綴為 .mkv)?
9)MPEG2-TS 格式 (后綴為 .ts)?
目前,我們在流媒體傳輸,尤其是直播中主要采用的就是 FLV 和 MPEG2-TS 格式,分別用于 RTMP/HTTP-FLV 和 HLS 協議。

4.推流到服務器

推流是直播的第一公里,直播的推流對這個直播鏈路影響非常大,如果推流的網絡不穩定,無論我們如何做優化,觀眾的體驗都會很糟糕。所以也是我們排查問題的第一步,如何系統地解決這類問題需要我們對相關理論有基礎的認識。?
推送協議主要有三種:

  • RTSP(Real Time Streaming Protocol):實時流傳送協議,是用來控制聲音或影像的多媒體串流協議, 由Real Networks和Netscape共同提出的;
  • RTMP(Real Time Messaging Protocol):實時消息傳送協議,是Adobe公司為Flash播放器和服務器之間音頻、視頻和數據傳輸 開發的開放協議;
  • HLS(HTTP Live Streaming):是蘋果公司(Apple Inc.)實現的基于HTTP的流媒體傳輸協議;

RTMP協議基于 TCP,是一種設計用來進行實時數據通信的網絡協議,主要用來在 flash/AIR 平臺和支持 RTMP 協議的流媒體/交互服務器之間進行音視頻和數據通信。支持該協議的軟件包括 Adobe Media Server/Ultrant Media Server/red5 等。?
它有三種變種:

  • RTMP工作在TCP之上的明文協議,使用端口1935;
  • RTMPT封裝在HTTP請求之中,可穿越防火墻;
  • RTMPS類似RTMPT,但使用的是HTTPS連接;

RTMP 是目前主流的流媒體傳輸協議,廣泛用于直播領域,可以說市面上絕大多數的直播產品都采用了這個協議。?
RTMP協議就像一個用來裝數據包的容器,這些數據可以是AMF格式的數據,也可以是FLV中的視/音頻數據。一個單一的連接可以通過不同的通道傳輸多路網絡流。這些通道中的包都是按照固定大小的包傳輸的。?

5.服務器流分發

流媒體服務器的作用是負責直播流的發布和轉播分發功能。?
流媒體服務器有諸多選擇,如商業版的Wowza。但我選擇的是Nginx,它是一款優秀的免費Web服務器,后面我會詳細介紹如何搭建Nginx服務器。

6.播放器流播放

主要是實現直播節目在終端上的展現。因為我這里使用的傳輸協議是RTMP, 所以只要支持 RTMP 流協議的播放器都可以使用,譬如:

  • 電腦端:VLC等
  • 手機端:Vitamio以及ijkplayer等

一般情況下我們把上面流程的前四步稱為第一部分,即視頻主播端的操作。視頻采集處理后推流到流媒體服務器,第一部分功能完成。第二部分就是流媒體服務器,負責把從第一部分接收到的流進行處理并分發給觀眾。第三部分就是觀眾啦,只需要擁有支持流傳輸協議的播放器即可。?

第一部分:采集推流SDK

目前市面上集視頻采集、編碼、封裝和推流于一體的SDK已經有很多了,例如商業版的NodeMedia,但NodeMedia SDK按包名授權,未授權包名應用使用有版權提示信息。?
我這里使用的是別人分享在github上的一個免費SDK,下載地址。

下面我就代碼分析一下直播推流的過程吧:?
先看入口界面:?
?

很簡單,一個輸入框讓你填寫服務器的推流地址,另外一個按鈕開啟推流。


public class StartActivity extends Activity {public static final String RTMPURL_MESSAGE = "rtmppush.hx.com.rtmppush.rtmpurl";private Button _startRtmpPushButton = null;private EditText _rtmpUrlEditText = null;private View.OnClickListener _startRtmpPushOnClickedEvent = new View.OnClickListener() {@Overridepublic void onClick(View arg0) {Intent i = new Intent(StartActivity.this, MainActivity.class);String rtmpUrl = _rtmpUrlEditText.getText().toString();i.putExtra(StartActivity.RTMPURL_MESSAGE, rtmpUrl);StartActivity.this.startActivity(i);}};private void InitUI(){_rtmpUrlEditText = (EditText)findViewById(R.id.rtmpUrleditText);_startRtmpPushButton = (Button)findViewById(R.id.startRtmpButton);_rtmpUrlEditText.setText("rtmp://192.168.1.104:1935/live/12345");_startRtmpPushButton.setOnClickListener(_startRtmpPushOnClickedEvent);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_start);InitUI();} }

主要的推流過程在MainActivity里面,同樣,先看界面:?
?
布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/cameraRelative"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:theme="@android:style/Theme.NoTitleBar.Fullscreen"><SurfaceViewandroid:id="@+id/surfaceViewEx"android:layout_width="match_parent"android:layout_height="match_parent"/><Buttonandroid:id="@+id/SwitchCamerabutton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBottom="@+id/surfaceViewEx"android:text="@string/SwitchCamera" /> </RelativeLayout>

其實就是用一個SurfaceView顯示攝像頭拍攝畫面,并提供了一個按鈕切換前置和后置攝像頭。從入口函數看起:

@Overrideprotected void onCreate(Bundle savedInstanceState) {requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);Intent intent = getIntent();_rtmpUrl = intent.getStringExtra(StartActivity.RTMPURL_MESSAGE);InitAll();PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);_wakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");}

首先設置全屏顯示,常亮,豎屏,獲取服務器的推流url,再初始化所有東西。

private void InitAll() {WindowManager wm = this.getWindowManager();int width = wm.getDefaultDisplay().getWidth();int height = wm.getDefaultDisplay().getHeight();int iNewWidth = (int) (height * 3.0 / 4.0);RelativeLayout rCameraLayout = (RelativeLayout) findViewById(R.id.cameraRelative);RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.MATCH_PARENT);int iPos = width - iNewWidth;layoutParams.setMargins(iPos, 0, 0, 0);_mSurfaceView = (SurfaceView) this.findViewById(R.id.surfaceViewEx);_mSurfaceView.getHolder().setFixedSize(HEIGHT_DEF, WIDTH_DEF);_mSurfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);_mSurfaceView.getHolder().setKeepScreenOn(true);_mSurfaceView.getHolder().addCallback(new SurceCallBack());_mSurfaceView.setLayoutParams(layoutParams);InitAudioRecord();_SwitchCameraBtn = (Button) findViewById(R.id.SwitchCamerabutton);_SwitchCameraBtn.setOnClickListener(_switchCameraOnClickedEvent);RtmpStartMessage();//開始推流}

首先設置屏幕比例3:4顯示,給SurfaceView設置一些參數并添加回調,再初始化AudioRecord,最后執行開始推流。音頻在這里初始化了,那么相機在哪里初始化呢?其實在SurfaceView的回調函數里。

@Overridepublic void surfaceCreated(SurfaceHolder holder) {_iDegrees = getDisplayOritation(getDispalyRotation(), 0);if (_mCamera != null) {InitCamera(); //初始化相機return;}//華為i7前后共用攝像頭if (Camera.getNumberOfCameras() == 1) {_bIsFront = false;_mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);} else {_mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);}InitCamera();}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {}}

相機的初始化就在這里啦:

public void InitCamera() {Camera.Parameters p = _mCamera.getParameters();Size prevewSize = p.getPreviewSize();showlog("Original Width:" + prevewSize.width + ", height:" + prevewSize.height);List<Size> PreviewSizeList = p.getSupportedPreviewSizes();List<Integer> PreviewFormats = p.getSupportedPreviewFormats();showlog("Listing all supported preview sizes");for (Camera.Size size : PreviewSizeList) {showlog(" w: " + size.width + ", h: " + size.height);}showlog("Listing all supported preview formats");Integer iNV21Flag = 0;Integer iYV12Flag = 0;for (Integer yuvFormat : PreviewFormats) {showlog("preview formats:" + yuvFormat);if (yuvFormat == android.graphics.ImageFormat.YV12) {iYV12Flag = android.graphics.ImageFormat.YV12;}if (yuvFormat == android.graphics.ImageFormat.NV21) {iNV21Flag = android.graphics.ImageFormat.NV21;}}if (iNV21Flag != 0) {_iCameraCodecType = iNV21Flag;} else if (iYV12Flag != 0) {_iCameraCodecType = iYV12Flag;}p.setPreviewSize(HEIGHT_DEF, WIDTH_DEF);p.setPreviewFormat(_iCameraCodecType);p.setPreviewFrameRate(FRAMERATE_DEF);showlog("_iDegrees="+_iDegrees);_mCamera.setDisplayOrientation(_iDegrees);p.setRotation(_iDegrees);_mCamera.setPreviewCallback(_previewCallback);_mCamera.setParameters(p);try {_mCamera.setPreviewDisplay(_mSurfaceView.getHolder());} catch (Exception e) {return;}_mCamera.cancelAutoFocus();//只有加上了這一句,才會自動對焦。_mCamera.startPreview();}

還記得之前初始化完成之后開始推流函數嗎?

private void RtmpStartMessage() {Message msg = new Message();msg.what = ID_RTMP_PUSH_START;Bundle b = new Bundle();b.putInt("ret", 0);msg.setData(b);mHandler.sendMessage(msg);}

Handler處理:

public Handler mHandler = new Handler() {public void handleMessage(android.os.Message msg) {Bundle b = msg.getData();int ret;switch (msg.what) {case ID_RTMP_PUSH_START: {Start();break;}}}};

真正的推流實現原來在這里:

private void Start() {if (DEBUG_ENABLE) {File saveDir = Environment.getExternalStorageDirectory();String strFilename = saveDir + "/aaa.h264";try {if (!new File(strFilename).exists()) {new File(strFilename).createNewFile();}_outputStream = new DataOutputStream(new FileOutputStream(strFilename));} catch (Exception e) {e.printStackTrace();}}//_rtmpSessionMgr.Start("rtmp://192.168.0.110/live/12345678");_rtmpSessionMgr = new RtmpSessionManager();_rtmpSessionMgr.Start(_rtmpUrl); //------point 1int iFormat = _iCameraCodecType;_swEncH264 = new SWVideoEncoder(WIDTH_DEF, HEIGHT_DEF, FRAMERATE_DEF, BITRATE_DEF);_swEncH264.start(iFormat); //------point 2_bStartFlag = true;_h264EncoderThread = new Thread(_h264Runnable);_h264EncoderThread.setPriority(Thread.MAX_PRIORITY);_h264EncoderThread.start(); //------point 3_AudioRecorder.startRecording();_AacEncoderThread = new Thread(_aacEncoderRunnable);_AacEncoderThread.setPriority(Thread.MAX_PRIORITY);_AacEncoderThread.start(); //------point 4}

里面主要的函數有四個,我分別標出來了,現在我們逐一看一下。首先是point 1,這已經走到SDK里面了

public int Start(String rtmpUrl){int iRet = 0;_rtmpUrl = rtmpUrl;_rtmpSession = new RtmpSession();_bStartFlag = true;_h264EncoderThread.setPriority(Thread.MAX_PRIORITY);_h264EncoderThread.start();return iRet;}

其實就是啟動了一個線程,這個線程稍微有點復雜

private Thread _h264EncoderThread = new Thread(new Runnable() {private Boolean WaitforReConnect(){for(int i=0; i < 500; i++){try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}if(_h264EncoderThread.interrupted() || (!_bStartFlag)){return false;}}return true;}@Overridepublic void run() {while (!_h264EncoderThread.interrupted() && (_bStartFlag)) {if(_rtmpHandle == 0) {_rtmpHandle = _rtmpSession.RtmpConnect(_rtmpUrl);if(_rtmpHandle == 0){if(!WaitforReConnect()){break;}continue;}}else{if(_rtmpSession.RtmpIsConnect(_rtmpHandle) == 0){_rtmpHandle = _rtmpSession.RtmpConnect(_rtmpUrl);if(_rtmpHandle == 0){if(!WaitforReConnect()){break;}continue;}}}if((_videoDataQueue.size() == 0) && (_audioDataQueue.size()==0)){try {Thread.sleep(30);} catch (InterruptedException e) {e.printStackTrace();}continue;}//Log.i(TAG, "VideoQueue length="+_videoDataQueue.size()+", AudioQueue length="+_audioDataQueue.size());for(int i = 0; i < 100; i++){byte[] audioData = GetAndReleaseAudioQueue();if(audioData == null){break;}//Log.i(TAG, "###RtmpSendAudioData:"+audioData.length);_rtmpSession.RtmpSendAudioData(_rtmpHandle, audioData, audioData.length);}byte[] videoData = GetAndReleaseVideoQueue();if(videoData != null){//Log.i(TAG, "$$$RtmpSendVideoData:"+videoData.length);_rtmpSession.RtmpSendVideoData(_rtmpHandle, videoData, videoData.length);}try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}_videoDataQueueLock.lock();_videoDataQueue.clear();_videoDataQueueLock.unlock();_audioDataQueueLock.lock();_audioDataQueue.clear();_audioDataQueueLock.unlock();if((_rtmpHandle != 0) && (_rtmpSession != null)){_rtmpSession.RtmpDisconnect(_rtmpHandle);}_rtmpHandle = 0;_rtmpSession = null;}});

看18行,主要就是一個while循環,每隔一段時間去_audioDataQueue和_videoDataQueue兩個緩沖數組中取數據發送給服務器,發送方法_rtmpSession.RtmpSendAudioData和_rtmpSession.RtmpSendVideoData都是Native方法,通過jni調用so庫文件的內容,每隔一段時間,這個時間是多少呢?看第4行,原來是5秒鐘,也就是說我們的視頻數據會在緩沖中存放5秒才被取出來發給服務器,所有直播會有5秒的延時,我們可以修改這塊來控制直播延時。?
上面說了我們會從_audioDataQueue和_videoDataQueue兩個Buffer里面取數據,那么數據是何時放進去的呢?看上面的point 2,3,4。首先是point 2,同樣走進了SDK:

public boolean start(int iFormateType){int iType = OpenH264Encoder.YUV420_TYPE;if(iFormateType == android.graphics.ImageFormat.YV12){iType = OpenH264Encoder.YUV12_TYPE;}else{iType = OpenH264Encoder.YUV420_TYPE;}_OpenH264Encoder = new OpenH264Encoder();_iHandle = _OpenH264Encoder.InitEncode(_iWidth, _iHeight, _iBitRate, _iFrameRate, iType);if(_iHandle == 0){return false;}_iFormatType = iFormateType;return true;}

其實這是初始化編碼器,具體的初始化過程也在so文件,jni調用。point 3,4其實就是開啟兩個線程,那我們看看線程中具體實現吧。

private Thread _h264EncoderThread = null;private Runnable _h264Runnable = new Runnable() {@Overridepublic void run() {while (!_h264EncoderThread.interrupted() && _bStartFlag) {int iSize = _YUVQueue.size();if (iSize > 0) {_yuvQueueLock.lock();byte[] yuvData = _YUVQueue.poll();if (iSize > 9) {Log.i(LOG_TAG, "###YUV Queue len=" + _YUVQueue.size() + ", YUV length=" + yuvData.length);}_yuvQueueLock.unlock();if (yuvData == null) {continue;}if (_bIsFront) {_yuvEdit = _swEncH264.YUV420pRotate270(yuvData, HEIGHT_DEF, WIDTH_DEF);} else {_yuvEdit = _swEncH264.YUV420pRotate90(yuvData, HEIGHT_DEF, WIDTH_DEF);}byte[] h264Data = _swEncH264.EncoderH264(_yuvEdit);if (h264Data != null) {_rtmpSessionMgr.InsertVideoData(h264Data);if (DEBUG_ENABLE) {try {_outputStream.write(h264Data);int iH264Len = h264Data.length;//Log.i(LOG_TAG, "Encode H264 len="+iH264Len);} catch (IOException e1) {e1.printStackTrace();}}}}try {Thread.sleep(1);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}_YUVQueue.clear();}};

也是一個循環線程,第9行,從_YUVQueue中取出攝像頭獲取的數據,然后進行視頻旋轉,第24行,對數據進行編碼,然后執行26行,InsertVideoData:

public void InsertVideoData(byte[] videoData){if(!_bStartFlag){return;}_videoDataQueueLock.lock();if(_videoDataQueue.size() > 50){_videoDataQueue.clear();}_videoDataQueue.offer(videoData);_videoDataQueueLock.unlock();}

果然就是插入之前提到的_videoDataQueue的Buffer。這里插入的是視頻數據,那么音頻數據呢?在另外一個線程,內容大致相同

private Runnable _aacEncoderRunnable = new Runnable() {@Overridepublic void run() {DataOutputStream outputStream = null;if (DEBUG_ENABLE) {File saveDir = Environment.getExternalStorageDirectory();String strFilename = saveDir + "/aaa.aac";try {if (!new File(strFilename).exists()) {new File(strFilename).createNewFile();}outputStream = new DataOutputStream(new FileOutputStream(strFilename));} catch (Exception e1) {e1.printStackTrace();}}long lSleepTime = SAMPLE_RATE_DEF * 16 * 2 / _RecorderBuffer.length;while (!_AacEncoderThread.interrupted() && _bStartFlag) {int iPCMLen = _AudioRecorder.read(_RecorderBuffer, 0, _RecorderBuffer.length); // Fill bufferif ((iPCMLen != _AudioRecorder.ERROR_BAD_VALUE) && (iPCMLen != 0)) {if (_fdkaacHandle != 0) {byte[] aacBuffer = _fdkaacEnc.FdkAacEncode(_fdkaacHandle, _RecorderBuffer);if (aacBuffer != null) {long lLen = aacBuffer.length;_rtmpSessionMgr.InsertAudioData(aacBuffer);//Log.i(LOG_TAG, "fdk aac length="+lLen+" from pcm="+iPCMLen);if (DEBUG_ENABLE) {try {outputStream.write(aacBuffer);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}} else {Log.i(LOG_TAG, "######fail to get PCM data");}try {Thread.sleep(lSleepTime / 10);} catch (InterruptedException e) {e.printStackTrace();}}Log.i(LOG_TAG, "AAC Encoder Thread ended ......");}};private Thread _AacEncoderThread = null;

這就是通過循環將音頻數據插入_audioDataQueue這個Buffer。?
以上就是視頻采集和推流的代碼分析,Demo中并沒有對視頻進行任何處理,只是攝像頭采集,編碼后推流到服務器端。

第二部分:Nginx服務器搭建

流媒體服務器有諸多選擇,如商業版的Wowza。但我選擇的是免費的Nginx(nginx-rtmp-module)。Nginx本身是一個非常出色的HTTP服務器,它通過nginx的模塊nginx-rtmp-module可以搭建一個功能相對比較完善的流媒體服務器。這個流媒體服務器可以支持RTMPHLS。?
Nginx配合SDK做流媒體服務器的原理是: Nginx通過rtmp模塊提供rtmp服務, SDK推送一個rtmp流到Nginx, 然后客戶端通過訪問Nginx來收看實時視頻流。 HLS也是差不多的原理,只是最終客戶端是通過HTTP協議來訪問的,但是SDK推送流仍然是rtmp的。?
下面是一款已經集成rtmp模塊的windows版本的Nginx。下載后,即可直接使用?
下載鏈接:https://github.com/illuspas/nginx-rtmp-win32

1、rtmp端口配置?
配置文件在/conf/nginx.conf?
RTMP監聽 1935 端口,啟用live 和hls 兩個application?
?
所以你的流媒體服務器url可以寫成:rtmp://(服務器IP地址):1935/live/xxx?或?rtmp://(服務器IP地址):1935/hls/xxx?
例如我們上面寫的 rtmp://192.168.1.104:1935/live/12345

HTTP監聽 8080 端口,

  • :8080/stat 查看stream狀態
  • :8080/index.html 為一個直播播放與直播發布測試器
  • :8080/vod.html 為一個支持RTMP和HLS點播的測試器

2、啟動nginx服務?
雙擊nginx.exe文件或者在dos窗口下運行nginx.exe,即可啟動nginx服務:?

1)啟動任務管理器,可以看到nginx.exe進程?

2)打開網頁輸入http://localhot:8080,出現如下畫面:?
?
顯示以上界面說明啟動成功。

第三部分:直播流的播放

主播界面:?

上面說過了只要支持RTMP流傳輸協議的播放器都可以收看到我們的直播。下面舉兩個例子吧:?
(1)window端播放器VLC?

(2)Android端播放器ijkplayer?
ijkplayer的使用請參考Android ijkplayer的使用解析

private void initPlayer() {player = new PlayerManager(this);player.setFullScreenOnly(true);player.setScaleType(PlayerManager.SCALETYPE_FILLPARENT);player.playInFullScreen(true);player.setPlayerStateListener(this);player.play("rtmp://192.168.1.104:1935/live/12345");}


總結

以上是生活随笔為你收集整理的直播技术原理讲解的全部內容,希望文章能夠幫你解決所遇到的問題。

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

久久超级碰视频 | 欧美久久久久久久久中文字幕 | 色av色av色av| 天天操狠狠干 | 日韩欧在线 | 丁香婷五月 | 中文字幕日韩伦理 | 国产123区在线观看 国产精品麻豆91 | 亚洲激情 在线 | 久久人人97超碰精品888 | 天天操偷偷干 | 久草干 | 久久国产精品精品国产色婷婷 | 伊人电影天堂 | 久久久精品欧美一区二区免费 | 久久av中文字幕片 | 成人在线观看免费视频 | 色综合久久五月天 | av中文资源在线 | 一区二区精品在线视频 | 色综合色综合久久综合频道88 | 日韩欧美黄色网址 | 西西www4444大胆视频 | 99久久精品国产毛片 | 国产成人精品综合久久久久99 | 亚洲精品午夜aaa久久久 | 欧美日韩亚洲国产一区 | 久久免费国产视频 | 在线91精品 | 国产成本人视频在线观看 | 国产精品国产三级在线专区 | 久久免费视频1 | 人人爱人人做人人爽 | 久久夜靖品 | 综合婷婷丁香 | 亚洲成av| 天天操月月操 | 欧美成人猛片 | 久久99热国产 | 国产精品丝袜久久久久久久不卡 | 日韩av片无码一区二区不卡电影 | 91高清免费看 | 色综合久久综合 | 国产不卡网站 | 国产麻豆成人传媒免费观看 | 美女视频国产 | 婷婷丁香在线 | 日韩精品在线免费观看 | 亚洲专区欧美专区 | 亚洲免费精品一区二区 | 成年人免费看片网站 | 97视频在线观看免费 | 韩日电影在线免费看 | 亚洲最新av在线网址 | 高清av免费一区中文字幕 | 国产日女人| 欧美一级性生活片 | 91漂亮少妇露脸在线播放 | 久99久中文字幕在线 | 精品国产乱码久久久久 | 在线观看国产 | 天天曰天天曰 | 高清久久久久久 | 人成午夜视频 | 久久精品艹 | 国内精品久久久久久中文字幕 | 成人黄色资源 | 天天射天天舔天天干 | 日韩mv欧美mv国产精品 | 一区二区三区久久精品 | 在线视频精品播放 | 久久国产精品99久久人人澡 | 九色琪琪久久综合网天天 | 亚洲首页 | 黄色小说视频网站 | 最新中文字幕在线观看视频 | 久久www免费视频 | av黄色一级片 | 超碰久热 | 西西大胆免费视频 | 久草在线官网 | 日韩欧美高清在线观看 | 一区二区三区三区在线 | 色 免费观看 | 色的网站在线观看 | 日韩国产精品久久 | a v在线视频 | 亚洲一区二区三区四区在线视频 | 麻豆视频免费在线 | 国产婷婷一区二区 | 在线观看精品一区 | 在线高清av | 天天干夜夜干 | 99精品黄色 | 久久婷亚洲五月一区天天躁 | 国产永久免费高清在线观看视频 | 亚洲开心色 | 久久9精品 | 欧美激情综合五月 | 国产日韩精品一区二区 | 日韩视频一区二区三区 | 黄色av电影一级片 | 国产在线不卡 | 国产中文自拍 | 免费涩涩网站 | 欧美激情视频一区 | 人人干人人草 | 国产精国产精品 | 婷婷5月激情5月 | 一区二区三区四区五区在线 | 97福利| 日韩国产精品一区 | 美女视频黄是免费的 | 成人av一区二区在线观看 | 超碰97av在线 | 激情久久综合 | 日韩在线色视频 | 免费电影一区二区三区 | 丁香激情综合 | www激情com| 日韩av一区二区三区在线观看 | 国产一级在线看 | 国产精品免费一区二区三区 | 久久久网址 | 天天操欧美 | 天天草天天干天天射 | 久久av在线| 91av社区| 日韩午夜电影 | 蜜臀aⅴ国产精品久久久国产 | 欧美激情在线网站 | 成人一区电影 | 青草视频在线播放 | 中文字幕欧美日韩va免费视频 | a天堂最新版中文在线地址 久久99久久精品国产 | 在线观看视频你懂得 | 久久久国产精品视频 | 91一区啪爱嗯打偷拍欧美 | 国产欧美精品一区二区三区四区 | 精品久久网站 | 亚洲视频每日更新 | 亚洲国产精品500在线观看 | 国产欧美最新羞羞视频在线观看 | 丁香九月婷婷 | 午夜国产福利在线 | 97超碰国产精品女人人人爽 | 国产精品高潮久久av | 99久久爱| 国产精品久久久免费 | 国产一级片在线播放 | 精品9999 | 香蕉精品视频在线观看 | 国产精品美女久久久久久久 | 九九九九热精品免费视频点播观看 | 国产成人91 | 国产人免费人成免费视频 | 日韩免费电影网站 | h动漫中文字幕 | 亚洲三级黄色 | 美女在线免费观看视频 | 日韩在线三级 | 91精品国产成人观看 | 中文字幕欧美日韩va免费视频 | 天天操天天操天天操天天操天天操天天操 | 9在线观看免费高清完整版在线观看明 | 99视频免费在线观看 | 狠狠撸电影 | 激情小说久久 | 亚洲黄色一级视频 | 午夜精品一区二区国产 | 国产伦精品一区二区三区… | 91av视频在线观看免费 | 日韩欧美视频一区二区 | 91日韩精品视频 | 人人澡av| 黄色动态图xx | 99精品在线免费视频 | 人人插人人| 国产一区二区三区高清播放 | 久草在线免费电影 | 久久久麻豆视频 | 欧美99久久 | 成年人免费在线 | 久久婷婷五月综合色丁香 | 中文字幕2021 | 91在线操 | 九色精品在线 | 最新成人在线 | 欧洲精品二区 | 免费久久久久久 | 日韩影视精品 | 天天翘av| 午夜999 | 在线不卡的av | a在线一区 | 午夜精品福利一区二区三区蜜桃 | 五月天六月婷婷 | a黄色片在线观看 | 久久66热这里只有精品 | 国产美女视频网站 | 欧美日韩精品综合 | 成人av网站在线观看 | 久久精品国产精品亚洲 | 国产999久久久 | 色综合在| 亚洲国产欧美一区二区三区丁香婷 | 天天做天天爱夜夜爽 | 黄色免费视频在线观看 | 欧美在线视频日韩 | avwww在线| 麻豆传媒视频在线播放 | av在线网站观看 | 在线播放 日韩专区 | 亚洲永久精品国产 | 最近免费中文字幕 | 精品国产电影一区二区 | 欧美日韩高清 | 日韩中文幕 | 日韩在线观看免费 | 国产精品中文字幕在线 | 国产女教师精品久久av | 久久婷婷色 | 日韩理论在线视频 | 韩国精品在线 | 在线成人免费电影 | 黄色网免费 | 精品黄色在线观看 | 综合网伊人 | 日韩精品中文字幕有码 | 免费av网址在线观看 | 亚洲激情 欧美激情 | 国产精品白丝jk白祙 | 综合网中文字幕 | 久草在线视频网站 | 色婷婷国产在线 | 黄色av一区二区三区 | 久久久官网| 免费视频 你懂的 | 久久久久久国产精品999 | 久久成人一区 | 日本久久精品视频 | 天天插日日操 | 我要色综合天天 | 欧美精品999 | 久草在线资源网 | 久久久免费 | 91精选 | 午夜av色| 久色 网 | 永久免费毛片 | 91日本在线播放 | 国内精品久久久久久久久久久久 | 成人黄色在线 | 一区免费观看 | 国产精品xxxx18a99| 一区二区视频播放 | 狠狠色伊人亚洲综合网站色 | 精品a在线| 超碰日韩在线 | 亚洲永久免费av | 婷婷色综合色 | 黄色日本片| 中文字幕一区二区三区乱码不卡 | 色小说av| 超碰夜夜| 九月婷婷人人澡人人添人人爽 | 日韩av资源在线观看 | av天天澡天天爽天天av | 免费在线观看视频一区 | av在线播放网址 | 日韩深夜在线观看 | 精品久久精品久久 | 午夜精品久久久久 | 亚洲色五月| 欧美日韩在线精品 | 久久久www成人免费毛片 | 成年人在线免费看片 | 成人一区二区在线观看 | 亚洲国产三级在线观看 | 日精品在线观看 | 毛片一级免费一级 | 国产网红在线观看 | 91久久电影| 国产精品99久久久精品免费观看 | 国产一区高清在线观看 | 亚洲精品小视频 | 在线草| 欧美精品久久久久久久久久久 | 久久亚洲影院 | 欧洲亚洲女同hd | 久草久草久草久草 | 亚洲精品美女免费 | 免费看久久 | 韩国av电影网 | 黄色电影在线免费观看 | 国产日韩三级 | 天天干天天干天天射 | 国产精品人成电影在线观看 | 俺要去色综合狠狠 | av在线h| 精品爱爱 | 13日本xxxxxⅹxxx20 | 国产精品国产三级国产不产一地 | 韩国三级在线一区 | 色噜噜日韩精品欧美一区二区 | 国产一区二区在线免费播放 | 亚洲欧洲精品视频 | 婷婷丁香激情综合 | 中文字幕av在线不卡 | 成人毛片一区二区三区 | 日韩91精品 | 日韩在线免费视频 | 黄色电影在线免费观看 | 精品999久久久 | 成人app在线播放 | 中文字幕亚洲综合久久五月天色无吗'' | 最近日韩中文字幕中文 | 最近乱久中文字幕 | 中文在线字幕观看电影 | 91香蕉视频在线下载 | 亚洲国产精品第一区二区 | 欧美精品中文 | 伊人影院得得 | 色瓜 | 狠狠操夜夜操 | 中日韩免费视频 | 麻豆视传媒官网免费观看 | 欧美与欧洲交xxxx免费观看 | 在线视频一区二区 | 国产午夜在线观看视频 | 狠狠干免费 | 开心婷婷色 | 区一区二区三在线观看 | 色婷婷色 | 18国产精品福利片久久婷 | 欧美电影在线观看 | 欧美日韩中文在线视频 | 91视频在线免费下载 | 色鬼综合网| 97超碰资源 | 久久久久久欧美二区电影网 | 国产乱码精品一区二区蜜臀 | 国产va在线 | av韩国在线 | 久久久综合色 | 午夜电影久久 | 激情黄色av | 久久涩视频 | 日本精品视频一区二区 | 国产特级毛片aaaaaa高清 | av在线a| 午夜av剧场 | 天天插天天操天天干 | 精品国产一区二区三区久久久蜜月 | 在线观看深夜视频 | 日韩欧美一区二区在线 | 人人爽久久久噜噜噜电影 | 国产人成看黄久久久久久久久 | 99高清视频有精品视频 | 国产九九精品视频 | 91精彩在线视频 | 开心综合网 | 狠狠色丁香婷婷综合视频 | 亚洲免费一级电影 | 久久久久久免费毛片精品 | 草免费视频 | 粉嫩一二三区 | 日韩久久精品一区二区三区 | 久久精品这里都是精品 | 成年人视频在线免费观看 | 韩日av一区二区 | 久久国产一区 | 久久天天操 | 九九久久在线看 | 日日夜夜网 | 国产精品6999成人免费视频 | 97精品国产91久久久久久 | 国产不卡在线视频 | 在线免费观看羞羞视频 | 亚洲成人资源网 | 欧美另类xxxxx | 五月在线 | 中文 一区二区 | 精品特级毛片 | 免费男女羞羞的视频网站中文字幕 | 四虎在线视频 | 精品视频久久 | 亚洲综合色丁香婷婷六月图片 | 一本一道久久a久久精品 | 中文不卡视频在线 | 免费观看9x视频网站在线观看 | 天天干天天摸 | 亚洲一区动漫 | 在线日韩亚洲 | 免费a视频在线观看 | 免费在线播放视频 | 日日干美女 | 97精品在线视频 | 成人免费在线视频观看 | 四虎成人精品在永久免费 | 免费在线91| 日日夜夜干 | 久久96国产精品久久99软件 | 亚洲国产精品久久久久婷婷884 | 又黄又爽又刺激视频 | 2023年中文无字幕文字 | 久久久人人爽 | 亚洲a色 | 日产乱码一二三区别在线 | 在线播放你懂 | 日韩美在线 | 久久avav | 久久久久久久久久久成人 | 婷婷色中文 | 天干啦夜天干天干在线线 | 看av在线| 日韩色综合网 | 免费电影一区二区三区 | 国产在线91精品 | 黄色福利网站 | 激情深爱 | 99riav1国产精品视频 | 日韩av三区 | 久久亚洲综合色 | 国产 日韩 在线 亚洲 字幕 中文 | 中文字幕一区二区三区四区 | 国产精品一区二区久久精品爱微奶 | 99久久综合精品五月天 | 中午字幕在线观看 | 在线观看视频在线 | 伊人天天综合 | 精品国产乱码久久久久久浪潮 | 97超碰成人在线 | 久久免费在线视频 | 亚洲精品在线观看网站 | 亚洲aⅴ乱码精品成人区 | 在线观看日本高清mv视频 | 黄色大全在线观看 | 国产成人精品一区二区三区免费 | 免费看色视频 | 狠狠色香婷婷久久亚洲精品 | 亚洲欧美视频网站 | 99视频在线观看视频 | 欧美国产日韩中文 | 国产成人99久久亚洲综合精品 | 国产在线a | 日韩高清在线一区二区 | 黄在线免费观看 | 国产成人精品免费在线观看 | 国产免费黄色 | www.eeuss影院av撸 | 日韩精品免费专区 | 婷婷日韩| 亚洲欧洲美洲av | 欧美日韩精品国产 | 免费成人在线视频网站 | 国产日韩欧美在线一区 | 色 中文字幕 | 一区在线观看 | 一级黄色片网站 | 亚洲视频999 | 日韩一级成人av | 三级av中文字幕 | 色偷偷888欧美精品久久久 | 国产一线在线 | 麻豆果冻剧传媒在线播放 | 草久久久久久 | 色爱区综合激月婷婷 | 日韩欧美国产精品 | 亚洲一区二区三区毛片 | 国产中文字幕一区二区 | 日本精品视频一区 | 欧美日韩国产亚洲乱码字幕 | 97网在线观看 | 在线观看免费av网 | 亚洲在线激情 | 久久艹99| 精品极品在线 | 操操操人人 | 夜夜摸夜夜爽 | 另类五月激情 | 久久国产精品视频免费看 | 99国产免费网址 | 欧美一二三区在线播放 | 综合久久久久久久久 | 国产中文欧美日韩在线 | 亚洲精品国产精品乱码在线观看 | 久精品在线观看 | 国产欧美中文字幕 | 免费视频91蜜桃 | 亚洲婷婷丁香 | 91在线视频免费 | 美女免费黄网站 | 99精品国产aⅴ | 成人av在线资源 | 97福利 | 精品综合久久久 | 国产二级视频 | 麻豆视频在线观看 | 欧美激情va永久在线播放 | av激情五月| 国产日韩欧美在线播放 | 麻豆传媒在线视频 | 高清视频一区二区三区 | 亚洲精品国偷自产在线91正片 | 91成人精品一区在线播放69 | 日韩二区在线播放 | 91丨九色丨高潮丰满 | av免费播放| 日韩欧美精品在线观看视频 | 久久国产一区二区三区 | 97理论电影 | 亚洲无吗视频在线 | 久久综合婷婷国产二区高清 | 国产免费视频一区二区裸体 | 天天干天天色2020 | 中文字幕999 | 亚洲砖区区免费 | av在线免费观看网站 | 日韩欧美大片免费观看 | 婷婷精品视频 | 91亚洲精品久久久蜜桃网站 | 日韩在线视频一区 | 成 人 黄 色 视频免费播放 | 男女视频久久久 | 一区二区激情 | 天天干 夜夜操 | 欧美在线一二 | 黄色网在线播放 | 久久综合精品一区 | 99热最新精品| 91免费在线 | 久久久影院官网 | 9在线观看免费高清完整版在线观看明 | 国产精品18久久久久久不卡孕妇 | 亚洲日本欧美 | 在线观看福利网站 | 日韩视频一二三区 | 91麻豆精品国产91久久久使用方法 | 亚洲日韩中文字幕在线播放 | 91精品久久久久久久99蜜桃 | 亚洲综合在线发布 | av天天干| 成人免费一级 | 国产高清免费在线观看 | 99久久精品国产观看 | 激情影院在线观看 | 日韩免费一区二区 | 国产高清视频免费最新在线 | 国产精品色婷婷视频 | 国产91精品看黄网站在线观看动漫 | 久久久精品成人 | 成年性视频 | 91麻豆免费版 | 91免费的视频在线播放 | 欧美日韩一区久久 | 久久超碰免费 | 婷婷精品国产欧美精品亚洲人人爽 | 成人午夜电影在线观看 | 99精品在线直播 | 99视频精品 | a级片网站 | 国产一级精品在线观看 | 免费a级毛片在线看 | 在线观看 国产 | 黄色片网站av| 亚洲精品国偷自产在线99热 | 亚洲一级国产 | 久青草视频 | 久久99精品久久久久久 | 欧美精品中文 | 欧美一级在线观看视频 | 国产精品视频地址 | 波多野结衣视频一区二区 | 国产日韩欧美视频 | 久久永久免费视频 | 亚洲精品理论 | 麻豆国产精品视频 | 日本中文字幕电影在线免费观看 | 久久精品一二区 | 最近字幕在线观看第一季 | 亚洲国产成人精品电影在线观看 | 黄色视屏免费在线观看 | 午夜影院一级片 | 成人免费大片黄在线播放 | 99在线观看免费视频精品观看 | 欧美日韩xxxxx| 91女子私密保健养生少妇 | 欧美日韩国产精品爽爽 | 亚洲一区欧美精品 | 97精品国产97久久久久久春色 | 欧美激情视频一区 | 色丁香久久 | 中文字幕乱码电影 | 国产日韩欧美在线一区 | 高清一区二区三区 | 天天综合网在线 | 亚洲第一av在线 | 五月天综合网站 | 成人精品福利 | 精品国产a| 日韩最新在线 | 狠狠激情中文字幕 | 一本一本久久a久久精品综合妖精 | www.99在线观看 | 国产91精品一区二区麻豆网站 | 国精产品一二三线999 | 日韩欧美在线综合网 | 九九热只有精品 | 激情五月婷婷综合网 | 久久再线视频 | 天天色天天爱天天射综合 | 久精品视频在线 | 日本h在线播放 | 探花视频在线观看 | av不卡免费看 | 狠狠干狠狠色 | 2021国产在线视频 | 91精品中文字幕 | 国产精品18久久久久久首页狼 | 亚洲激情 欧美激情 | 西西444www大胆高清图片 | 欧美色综合天天久久综合精品 | 天天玩天天干 | 成人在线免费看视频 | 黄色不卡av| 正在播放一区二区 | 欧美人操人 | 国产精品丝袜在线 | 日韩高清不卡在线 | 欧美国产日韩一区二区三区 | 久草亚洲视频 | 99精品免费观看 | 精品久久久久久久久久久院品网 | 国产一区视频在线 | 波多野结衣在线观看一区二区三区 | 中文字幕在线影视资源 | 日本黄区免费视频观看 | 九色porny真实丨国产18 | 视频国产在线观看18 | 97在线观看视频 | 在线观看国产区 | 亚洲成人av在线播放 | 国产一区二区三精品久久久无广告 | 播五月婷婷 | 九色视频网站 | 国产日韩精品在线观看 | 日本高清xxxx | 天天干天天操天天拍 | 久久久国产精品成人免费 | 九九热av | 国产在线更新 | 国产视频中文字幕 | 狠狠色丁香婷婷综合橹88 | 91免费在线| 国产成人黄色在线 | 欧美乱熟臀69xxxxxx | 黄网站色| 日韩在线观| 国产综合福利在线 | 丁香色婷| 在线观看aa | 免费观看性生交大片3 | 亚洲永久精品视频 | 中文av在线免费观看 | 亚洲精品午夜一区人人爽 | 精品一区二区免费在线观看 | 黄色福利网 | 国产精品va在线 | 中文字幕在线免费观看视频 | 黄色在线网站噜噜噜 | 国产视频手机在线 | 国产高清中文字幕 | 亚洲最快最全在线视频 | 美州a亚洲一视本频v色道 | 久久免费国产电影 | 欧美一区二区三区在线 | 日韩 在线a| 美女网站色免费 | 婷婷在线色 | 波多野结衣在线播放视频 | 99这里有精品 | 欧美日韩二区在线 | 精品国产激情 | 久久人操 | 欧美日韩精品综合 | 免费看v片 | 久艹在线播放 | 91亚洲成人 | 亚洲成人av一区二区 | 中文字幕精品久久 | 69xx视频| 黄在线免费看 | 婷婷综合久久 | 超级av在线 | 婷婷色5月| 天天做天天射 | 久久久久久久久久久久影院 | 精品国产精品国产偷麻豆 | 日韩免费b | 精品毛片在线 | 日日干美女 | 91麻豆视频网站 | 中文字幕成人av | 91欧美日韩国产 | 久草精品视频在线观看 | 久久一视频 | 97在线影院 | 91中文字幕在线观看 | 天天五月天色 | 午夜精品成人一区二区三区 | 久久久久国产精品一区二区 | 天天夜夜狠狠操 | 欧美成年黄网站色视频 | 国产情侣一区 | 四虎影视成人永久免费观看视频 | 国产伦精品一区二区三区四区视频 | 色吊丝在线永久观看最新版本 | aaa日本高清在线播放免费观看 | 四虎国产精品免费观看视频优播 | 国产午夜麻豆影院在线观看 | 97成人在线免费视频 | 狠狠色丁香久久婷婷综 | 中文字幕在 | 波多野结衣电影一区二区 | 成人在线视频一区 | 成人一级免费视频 | 成人一级影视 | 亚洲欧洲xxxx| 国产日韩精品视频 | 久草视频在线新免费 | 天天弄天天操 | 97超视频在线观看 | 99热国产在线 | 久爱综合| 911国产精品 | 美女国产在线 | 国产精品久久久久国产精品日日 | 狠狠做深爱婷婷综合一区 | 久久不见久久见免费影院 | 日韩在线理论 | av成人在线电影 | 最新99热| 亚洲精品天天 | 日韩二区三区在线观看 | 日韩在线三区 | 免费视频99 | 亚洲激情在线播放 | 91av观看| 九色琪琪久久综合网天天 | 粉嫩av一区二区三区免费 | 久久久久久久网站 | 欧美日韩国产mv | 97超碰在线视 | 日韩黄色中文字幕 | 人人爽人人爽人人爽学生一级 | 日韩欧美视频免费观看 | 99久久精品国产毛片 | 91免费在线 | 日韩精品免费一区二区三区 | 国产精品永久在线 | 美女福利视频在线 | 亚洲精品国偷拍自产在线观看蜜桃 | 精品视频一区在线观看 | 久久九九久久九九 | www.一区二区三区 | 午夜精品一区二区三区免费视频 | 亚洲激情综合 | 精品一区精品二区高清 | 麻豆视频91 | 国产精品第一页在线观看 | 毛片网站免费在线观看 | 黄色综合| 亚洲国产片色 | 97精品国产97久久久久久春色 | 中国成人一区 | 亚洲午夜久久久久久久久久久 | 狠狠色噜噜狠狠狠合久 | 亚洲一区二区视频在线 | 在线 欧美 日韩 | 麻豆视频在线播放 | 一级a毛片高清视频 | 在线观看一区视频 | 久草电影在线观看 | 黄色软件在线看 | 久久久精品网 | 九九热免费在线视频 | 日本资源中文字幕在线 | 久久人视频 | 天天视频色版 | 黄色片毛片 | av大全在线观看 | www.五月婷| 99久久国产免费看 | 欧美在线观看禁18 | 成人国产精品 | 一区二区三区免费在线 | 色综合久久88色综合天天 | 九九免费在线视频 | 亚洲精品乱码久久久久久蜜桃不爽 | 成 人 黄 色 视频播放1 | 人人插人人| 欧美久久久一区二区三区 | 最近2019年日本中文免费字幕 | 99精品一区二区 | av激情五月 | 国产在线视频导航 | 国产精品久久久久久久免费大片 | 久久久免费播放 | 国产精品久久久久久电影 | 婷婷五月在线视频 | 久久免费视频在线 | 999精品视频| 久久精品国产成人精品 | 中文日韩在线视频 | 97成人啪啪网 | 五月天久久精品 | 日本性生活一级片 | 日韩欧美高清一区二区 | 色综合天天综合网国产成人网 | 久久69精品久久久久久久电影好 | 亚洲精品免费观看视频 | 久久九九国产精品 | 亚洲欧美怡红院 | 久久久久激情视频 | 伊人网综合在线观看 | 精品国产一区二区在线 | 欧美一级乱黄 | 成人国产精品免费 | 四虎亚洲精品 | 国产二区视频在线观看 | 日日日日 | 麻豆久久久 | 久久成人精品视频 | 亚洲黄色app | 久久免费视频网 | 国产精品精品国产婷婷这里av | 伊人中文字幕在线 | 香蕉影视 | 日韩av不卡在线播放 | 亚洲精品2区 | 亚洲一区二区三区四区精品 | 四虎影视久久久 | 开心色婷婷| 久久人人爽人人爽人人片av免费 | 亚洲日本中文字幕在线观看 | 日韩在线观看电影 | 国产一级二级视频 | 午夜体验区 | 久久久久久国产一区二区三区 | 狠狠干婷婷色 | 国产又黄又爽无遮挡 | 亚洲视频一级 | 亚洲天堂在线观看完整版 | 国产精品成人自产拍在线观看 | 欧美经典久久 | 亚洲成人精品久久久 | 久久久污 | 午夜成人免费电影 | 激情综合网五月 | 狠狠狠色丁香综合久久天下网 | 正在播放 久久 | 国产黄色片免费 | 国产精品久久久久久麻豆一区 | 久热爱| 国产手机视频在线 | 欧美日韩国语 | 在线观看色网站 | 亚洲成a人片77777kkkk1在线观看 | 欧美日韩国产在线 | 中文字幕丝袜制服 | 综合激情av | 亚洲男人天堂a | 在线观看国产一区二区 | 天天天射 | 中文成人字幕 | 亚洲天堂网在线播放 | 亚洲精品乱码久久久久久蜜桃欧美 | 成人免费色 | 亚洲精品视 | 国产在线欧美日韩 | 就色干综合| 一区二区三区 中文字幕 | 99视频导航 | 中文字幕第一 | 日韩免| www.色五月.com | 婷婷国产v亚洲v欧美久久 | 国产成人精品福利 | 免费久久视频 | 天天操天天谢 | 亚洲精品国产欧美在线观看 | 色婷婷av一区二 | 精品不卡av | 91在线视频免费 | 欧美日韩国产色综合一二三四 | 日韩免费看的电影 | 久久草在线视频国产 | 国产成人一级电影 | 日日干美女 | 成人一级免费电影 | 69av在线视频 | 91热视频在线观看 | 久久免费观看少妇a级毛片 久久久久成人免费 | 欧美国产91| 中文字幕在线观看免费高清完整版 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 国产精品久久久久久麻豆一区 | 欧美日韩成人一区 | 成人黄色大片网站 | 欧美激情精品久久久久 | 91在线观看黄 | 欧美激情在线看 | 在线精品在线 | 日韩成人免费在线观看 | 日韩精品资源 | aaa免费毛片 | 免费亚洲视频 | 成全在线视频免费观看 | 久久99久久99精品 | 久久久久国产精品一区二区 | 日本最新中文字幕 | 国产免费作爱视频 | 91久久久久久久一区二区 | 97视频免费在线观看 | 中文字幕在线视频一区 | 丁香婷五月 | 香蕉看片| 51精品国自产在线 | 日日草夜夜操 | 欧美一级视频在线观看 | 国产一线天在线观看 | 色av婷婷 | 国产黄在线 | 中文字幕免费观看视频 | 免费久久网站 | 超碰av在线免费观看 | 国产黄色高清 | 欧美日比视频 | 九九热精品视频在线观看 | 成人黄色在线电影 | 成人在线一区二区 | 欧美一区二区三区不卡 | 91成人精品一区在线播放69 | 五月婷婷在线视频观看 | 狠狠干电影 | 久久精品网站免费观看 | 亚洲精品午夜久久久久久久久久久 | a电影免费看 | 久草免费电影 | 91精品视频一区二区三区 | 在线之家官网 | 在线观看亚洲国产精品 | 欧美ⅹxxxxxx | 人人爽人人爱 | 三级黄在线 | 亚洲最新av | 成人在线一区二区三区 | 亚洲精品免费在线观看视频 | 久久天天躁狠狠躁夜夜不卡公司 | 日本韩国在线不卡 | 欧美日韩一区二区久久 | 中文字幕免费在线看 | 亚洲精品在线一区二区三区 | 一区二区影视 | 国产无套一区二区三区久久 | 91精选在线 | 久久亚洲私人国产精品va | 日韩中文字幕a | 欧美aaa大片 | 天天操天天操天天干 | 97精品一区二区三区 | 五月婷婷一区 | 国产高清在线一区 | 91在线视频免费 | 天天插天天干 | 一区二区三区中文字幕在线 | 日韩高清在线一区 | 免费观看mv大片高清 | 特级西西人体444是什么意思 | 国产黄a三级三级三级三级三级 | 97超碰在线视 | 一区二区三区四区在线 | 久久夜色精品国产欧美一区麻豆 | 久久国产精品电影 | 久久久午夜精品理论片中文字幕 | 国产成人久久精品 | 婷婷免费视频 | 国产不卡在线播放 | 国产成人高清在线 | 五月激情电影 | 中文字幕av一区二区三区四区 | av免费试看| 在线免费观看欧美日韩 | 黄色影院在线播放 | 9i看片成人免费看片 | 久久国内免费视频 | 蜜臀av性久久久久av蜜臀妖精 |