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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

WebRTC VideoEngine超详细教程(三)——集成X264编码和ffmpeg解码

發布時間:2025/4/5 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WebRTC VideoEngine超详细教程(三)——集成X264编码和ffmpeg解码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:http://blog.csdn.net/nonmarking/article/details/47958395

?

本系列目前共三篇文章,后續還會更新

WebRTC VideoEngine超詳細教程(一)——視頻通話的基本流程

WebRTC VideoEngine超詳細教程(二)——集成OPENH264編解碼器

WebRTC VideoEngine超詳細教程(三)——集成X264編碼和ffmpeg解碼

總述

在前一篇文章中,講解了如何將OPENH264編解碼器集成到WebRTC中,但是OPENH264只能編碼baseline的H264視頻,而且就編碼質量而言,還是X264最好,本文就來講解一下如何將X264編碼器集成到WebRTC中,為了實現解碼,同時要用到ffmpeg。總體流程和之前一樣,分為重新封裝編解碼器和注冊調用兩大步驟,注冊調用這一步沒有任何不同,主要是重新封裝這一步驟有較大區別。

重新封裝X264編碼功能

首先當然還是要下載X264源碼編譯出相應的庫以供調用。在windows下使用mingw進行編譯,再使用poxports工具導出庫,最后得到libx264.dll和libx264.lib,同時把x264.h和x264_config.h總共四個文件放到工程目錄下,并在項目屬性中進行相應配置。 使用x264進行視頻編碼的基本流程如下 [cpp]?view plaincopy
  • #include?<stdint.h>??
  • #include?<stdio.h>??
  • #include?<x264.h>??
  • ??
  • int?main(?int?argc,?char?**argv?)??
  • {??
  • ????int?width,?height;??
  • ????x264_param_t?param;??
  • ????x264_picture_t?pic;??
  • ????x264_picture_t?pic_out;??
  • ????x264_t?*h;??
  • ????int?i_frame?=?0;??
  • ????int?i_frame_size;??
  • ????x264_nal_t?*nal;??
  • ????int?i_nal;??
  • ??
  • ????/*?Get?default?params?for?preset/tuning?*/??
  • ????if(?x264_param_default_preset(?&param,?"medium",?NULL?)?<?0?)??
  • ????????goto?fail;??
  • ??
  • ????/*?Configure?non-default?params?*/??
  • ????param.i_csp?=?X264_CSP_I420;??
  • ????param.i_width??=?width;??
  • ????param.i_height?=?height;??
  • ????param.b_vfr_input?=?0;??
  • ????param.b_repeat_headers?=?1;??
  • ????param.b_annexb?=?1;??
  • ??
  • ????/*?Apply?profile?restrictions.?*/??
  • ????if(?x264_param_apply_profile(?&param,?"high"?)?<?0?)??
  • ????????goto?fail;??
  • ??
  • ????if(?x264_picture_alloc(?&pic,?param.i_csp,?param.i_width,?param.i_height?)?<?0?)??
  • ????????goto?fail;??
  • ??
  • ????h?=?x264_encoder_open(?&param);??
  • ????if(?!h?)??
  • ????????goto?fail;??
  • ??
  • ????int?luma_size?=?width?*?height;??
  • ????int?chroma_size?=?luma_size?/?4;??
  • ????/*?Encode?frames?*/??
  • ????for(?;;?i_frame++?)??
  • ????{??
  • ????????/*?Read?input?frame?*/??
  • ????????if(?fread(?pic.img.plane[0],?1,?luma_size,?stdin?)?!=?luma_size?)??
  • ????????????break;??
  • ????????if(?fread(?pic.img.plane[1],?1,?chroma_size,?stdin?)?!=?chroma_size?)??
  • ????????????break;??
  • ????????if(?fread(?pic.img.plane[2],?1,?chroma_size,?stdin?)?!=?chroma_size?)??
  • ????????????break;??
  • ??
  • ????????pic.i_pts?=?i_frame;??
  • ????????i_frame_size?=?x264_encoder_encode(?h,?&nal,?&i_nal,?&pic,?&pic_out?);??
  • ????????if(?i_frame_size?<?0?)??
  • ????????????goto?fail;??
  • ????????else?if(?i_frame_size?)??
  • ????????{??
  • ????????????if(?!fwrite(?nal->p_payload,?i_frame_size,?1,?stdout?)?)??
  • ????????????????goto?fail;??
  • ????????}??
  • ????}??
  • ????/*?Flush?delayed?frames?*/??
  • ????while(?x264_encoder_delayed_frames(?h?)?)??
  • ????{??
  • ????????i_frame_size?=?x264_encoder_encode(?h,?&nal,?&i_nal,?NULL,?&pic_out?);??
  • ????????if(?i_frame_size?<?0?)??
  • ????????????goto?fail;??
  • ????????else?if(?i_frame_size?)??
  • ????????{??
  • ????????????if(?!fwrite(?nal->p_payload,?i_frame_size,?1,?stdout?)?)??
  • ????????????????goto?fail;??
  • ????????}??
  • ????}??
  • ??
  • ????x264_encoder_close(?h?);??
  • ????x264_picture_clean(?&pic?);??
  • ????return?0;??
  • }??
  • 還是一樣,照葫蘆畫瓢,改寫上一篇文章中提到的H264EncoderImpl類 首先是類的定義,去掉了原來的私有成員變量ISVCEncoder* encoder_,加入了以下幾項,其他內容不變 [cpp]?view plaincopy
  • x264_picture_t?pic;??
  • x264_picture_t?pic_out;??
  • x264_t?*encoder_;??
  • int?i_frame?=?0;//frame?index??
  • x264_nal_t?*nal;??

  • 相應的,構造函數和析構函數也要改變,這里就不贅述了,重點看InitEncode方法和Encode方法。 InitEncode方法的實現改寫如下 [cpp]?view plaincopy
  • int?H264EncoderImpl::InitEncode(const?VideoCodec*?inst,??
  • ????????int?number_of_cores,??
  • ????????size_t?max_payload_size)?{??
  • ????????if?(inst?==?NULL)?{??
  • ????????????return?WEBRTC_VIDEO_CODEC_ERR_PARAMETER;??
  • ????????}??
  • ????????if?(inst->maxFramerate?<?1)?{??
  • ????????????return?WEBRTC_VIDEO_CODEC_ERR_PARAMETER;??
  • ????????}??
  • ????????//?allow?zero?to?represent?an?unspecified?maxBitRate??
  • ????????if?(inst->maxBitrate?>?0?&&?inst->startBitrate?>?inst->maxBitrate)?{??
  • ????????????return?WEBRTC_VIDEO_CODEC_ERR_PARAMETER;??
  • ????????}??
  • ????????if?(inst->width?<?1?||?inst->height?<?1)?{??
  • ????????????return?WEBRTC_VIDEO_CODEC_ERR_PARAMETER;??
  • ????????}??
  • ????????if?(number_of_cores?<?1)?{??
  • ????????????return?WEBRTC_VIDEO_CODEC_ERR_PARAMETER;??
  • ????????}??
  • ??
  • ????????int?ret_val?=?Release();??
  • ????????if?(ret_val?<?0)?{??
  • ????????????return?ret_val;??
  • ????????}??
  • ????????/*?Get?default?params?for?preset/tuning?*/??
  • ????????x264_param_t?param;??
  • ????????ret_val?=?x264_param_default_preset(&param,?"medium",?NULL);??
  • ????????if?(ret_val?!=?0)?{??
  • ????????????WEBRTC_TRACE(webrtc::kTraceError,?webrtc::kTraceVideoCoding,?-1,??
  • ????????????????"H264EncoderImpl::InitEncode()?fails?to?initialize?encoder?ret_val?%d",??
  • ????????????????ret_val);??
  • ????????????x264_encoder_close(encoder_);??
  • ????????????encoder_?=?NULL;??
  • ????????????return?WEBRTC_VIDEO_CODEC_ERROR;??
  • ????????}??
  • ????????/*?Configure?non-default?params?*/??
  • ????????param.i_csp?=?X264_CSP_I420;??
  • ????????param.i_width?=?inst->width;??
  • ????????param.i_height?=?inst->height;??
  • ????????param.b_vfr_input?=?0;??
  • ????????param.b_repeat_headers?=?1;??
  • ????????param.b_annexb?=?0;//這里設置為0,是為了使編碼后的NAL統一有4字節的起始碼,便于處理,否則會同時有3字節和4字節的起始碼,很麻煩??
  • ????????param.i_fps_num?=?1;??
  • ????????param.i_fps_num?=?codec_.maxFramerate;??
  • ????????param.rc.i_bitrate?=?codec_.maxBitrate;??
  • ????????/*?Apply?profile?restrictions.?*/??
  • ????????ret_val?=?x264_param_apply_profile(&param,?"high");??
  • ????????if?(ret_val?!=?0)?{??
  • ????????????WEBRTC_TRACE(webrtc::kTraceError,?webrtc::kTraceVideoCoding,?-1,??
  • ????????????????"H264EncoderImpl::InitEncode()?fails?to?initialize?encoder?ret_val?%d",??
  • ????????????????ret_val);??
  • ????????????x264_encoder_close(encoder_);??
  • ????????????encoder_?=?NULL;??
  • ????????????return?WEBRTC_VIDEO_CODEC_ERROR;??
  • ????????}??
  • ??
  • ????????ret_val?=?x264_picture_alloc(&pic,?param.i_csp,?param.i_width,?param.i_height);??
  • ????????if?(ret_val?!=?0)?{??
  • ????????????WEBRTC_TRACE(webrtc::kTraceError,?webrtc::kTraceVideoCoding,?-1,??
  • ????????????????"H264EncoderImpl::InitEncode()?fails?to?initialize?encoder?ret_val?%d",??
  • ????????????????ret_val);??
  • ????????????x264_encoder_close(encoder_);??
  • ????????????encoder_?=?NULL;??
  • ????????????return?WEBRTC_VIDEO_CODEC_ERROR;??
  • ????????}??
  • ??
  • ????????encoder_?=?x264_encoder_open(&param);??
  • ????????if?(!encoder_){??
  • ????????????WEBRTC_TRACE(webrtc::kTraceError,?webrtc::kTraceVideoCoding,?-1,??
  • ????????????????"H264EncoderImpl::InitEncode()?fails?to?initialize?encoder?ret_val?%d",??
  • ????????????????ret_val);??
  • ????????????x264_encoder_close(encoder_);??
  • ????????????x264_picture_clean(&pic);??
  • ????????????encoder_?=?NULL;??
  • ????????????return?WEBRTC_VIDEO_CODEC_ERROR;??
  • ????????}??
  • ??
  • ????????if?(&codec_?!=?inst)?{??
  • ????????????codec_?=?*inst;??
  • ????????}??
  • ??
  • ????????if?(encoded_image_._buffer?!=?NULL)?{??
  • ????????????delete[]?encoded_image_._buffer;??
  • ????????}??
  • ????????encoded_image_._size?=?CalcBufferSize(kI420,?codec_.width,?codec_.height);??
  • ????????encoded_image_._buffer?=?new?uint8_t[encoded_image_._size];??
  • ????????encoded_image_._completeFrame?=?true;??
  • ??
  • ????????inited_?=?true;??
  • ????????WEBRTC_TRACE(webrtc::kTraceApiCall,?webrtc::kTraceVideoCoding,?-1,??
  • ????????????"H264EncoderImpl::InitEncode(width:%d,?height:%d,?framerate:%d,?start_bitrate:%d,?max_bitrate:%d)",??
  • ????????????inst->width,?inst->height,?inst->maxFramerate,?inst->startBitrate,?inst->maxBitrate);??
  • ??
  • ????????return?WEBRTC_VIDEO_CODEC_OK;??
  • ????}??

  • Encode方法的實現改寫如下 [cpp]?view plaincopy
  • int?H264EncoderImpl::Encode(const?I420VideoFrame&?input_image,??
  • ????????const?CodecSpecificInfo*?codec_specific_info,??
  • ????????const?std::vector<VideoFrameType>*?frame_types)?{??
  • ????????if?(!inited_)?{??
  • ????????????return?WEBRTC_VIDEO_CODEC_UNINITIALIZED;??
  • ????????}??
  • ????????if?(input_image.IsZeroSize())?{??
  • ????????????return?WEBRTC_VIDEO_CODEC_ERR_PARAMETER;??
  • ????????}??
  • ????????if?(encoded_complete_callback_?==?NULL)?{??
  • ????????????return?WEBRTC_VIDEO_CODEC_UNINITIALIZED;??
  • ????????}??
  • ??
  • ????????VideoFrameType?frame_type?=?kDeltaFrame;??
  • ????????//?We?only?support?one?stream?at?the?moment.??
  • ????????if?(frame_types?&&?frame_types->size()?>?0)?{??
  • ????????????frame_type?=?(*frame_types)[0];??
  • ????????}??
  • ??
  • ????????bool?send_keyframe?=?(frame_type?==?kKeyFrame);??
  • ????????if?(send_keyframe)?{??
  • ????????????pic.b_keyframe?=?TRUE;??
  • ????????????WEBRTC_TRACE(webrtc::kTraceApiCall,?webrtc::kTraceVideoCoding,?-1,??
  • ????????????????"H264EncoderImpl::EncodeKeyFrame(width:%d,?height:%d)",??
  • ????????????????input_image.width(),?input_image.height());??
  • ????????}??
  • ??
  • ????????//?Check?for?change?in?frame?size.??
  • ????????if?(input_image.width()?!=?codec_.width?||??
  • ????????????input_image.height()?!=?codec_.height)?{??
  • ????????????int?ret?=?UpdateCodecFrameSize(input_image);??
  • ????????????if?(ret?<?0)?{??
  • ????????????????return?ret;??
  • ????????????}??
  • ????????}??
  • ??
  • ????????/*?Read?input?frame?*/??
  • ????????pic.img.plane[0]?=?const_cast<uint8_t*>(input_image.buffer(kYPlane));??
  • ????????pic.img.plane[1]?=?const_cast<uint8_t*>(input_image.buffer(kUPlane));??
  • ????????pic.img.plane[2]?=?const_cast<uint8_t*>(input_image.buffer(kVPlane));??
  • ????????pic.i_pts?=?i_frame;??
  • ??
  • ????????int?i_nal?=?0;??
  • ????????int?i_frame_size?=?x264_encoder_encode(encoder_,?&nal,?&i_nal,?&pic,?&pic_out);??
  • ????????if?(i_frame_size?<?0)??
  • ????????{??
  • ????????????WEBRTC_TRACE(webrtc::kTraceError,?webrtc::kTraceVideoCoding,?-1,??
  • ????????????????"H264EncoderImpl::Encode()?fails?to?encode?%d",??
  • ????????????????i_frame_size);??
  • ????????????x264_encoder_close(encoder_);??
  • ????????????x264_picture_clean(&pic);??
  • ????????????encoder_?=?NULL;??
  • ????????????return?WEBRTC_VIDEO_CODEC_ERROR;??
  • ????????}??
  • ??
  • ????????RTPFragmentationHeader?frag_info;??
  • ??????????
  • ????????if?(i_frame_size)??
  • ????????{??
  • ????????????if?(i_nal?==?0)?{??
  • ????????????????return?WEBRTC_VIDEO_CODEC_OK;??
  • ????????????}??
  • ????????????frag_info.VerifyAndAllocateFragmentationHeader(i_nal);??
  • ??
  • ????????????encoded_image_._length?=?0;??
  • ??
  • ????????????uint32_t?totalNaluIndex?=?0;??
  • ????????????for?(int?nal_index?=?0;?nal_index?<?i_nal;?nal_index++)??
  • ????????????{??
  • ????????????????uint32_t?currentNaluSize?=?0;??
  • ????????????????currentNaluSize?=?nal[nal_index].i_payload?-?4;?//x264_encoder_encode編碼得到的nal單元是已經帶有起始碼的,此外,這里直接使用nal[index]即可,不必再使用x264_nal_encode函數??
  • ????????????????memcpy(encoded_image_._buffer?+?encoded_image_._length,?nal[nal_index].p_payload?+?4,?currentNaluSize);//encoded_image_中存有的是去掉起始碼的數據??
  • ????????????????encoded_image_._length?+=?currentNaluSize;??
  • ??
  • ????????????????WEBRTC_TRACE(webrtc::kTraceApiCall,?webrtc::kTraceVideoCoding,?-1,??
  • ????????????????????"H264EncoderImpl::Encode()?nal_type?%d,?length:%d",??
  • ????????????????????nal[nal_index].i_type,?encoded_image_._length);??
  • ??
  • ????????????????frag_info.fragmentationOffset[totalNaluIndex]?=?encoded_image_._length?-?currentNaluSize;??
  • ????????????????frag_info.fragmentationLength[totalNaluIndex]?=?currentNaluSize;??
  • ????????????????frag_info.fragmentationPlType[totalNaluIndex]?=?nal[nal_index].i_type;??
  • ????????????????frag_info.fragmentationTimeDiff[totalNaluIndex]?=?0;??
  • ????????????????totalNaluIndex++;??
  • ????????????}??
  • ????????}??
  • ????????i_frame++;??
  • ????????if?(encoded_image_._length?>?0)?{??
  • ????????????encoded_image_._timeStamp?=?input_image.timestamp();??
  • ????????????encoded_image_.capture_time_ms_?=?input_image.render_time_ms();??
  • ????????????encoded_image_._encodedHeight?=?codec_.height;??
  • ????????????encoded_image_._encodedWidth?=?codec_.width;??
  • ????????????encoded_image_._frameType?=?frame_type;??
  • ????????????//?call?back??
  • ????????????encoded_complete_callback_->Encoded(encoded_image_,?NULL,?&frag_info);??
  • ????????}??
  • ????????return?WEBRTC_VIDEO_CODEC_OK;??
  • ????}??

  • 其他方法的實現均沒有改變。 至此,X264編碼器重新封裝完畢,還是比較好理解的。

    重新封裝ffmpeg解碼功能

    首先還是一樣,獲得ffmpeg的頭文件和庫文件,加入工程中并進行相應設置,這里只需使用avcodec avformat avutil swscale四個庫,頭文件也可以做相應的刪減。 ffmpeg解碼的基本流程如下,實際集成之后是從WebRTC的EncodedImage& input_image中獲得待解碼數據的,所以不能使用常見的基于文件的解碼流程 [cpp]?view plaincopy
  • AVCodec?*codec?=?avcodec_find_decoder(AV_CODEC_ID_H264);??
  • AVCodecContext?*codecCtx?=?avcodec_alloc_context3(codec);??
  • avcodec_open2(codecCtx,?codec,?nil);??
  • char?*videoData;??
  • int?len;??
  • AVFrame?*frame?=?av_frame_alloc();??
  • AVPacket?packet;??
  • av_new_packet(&packet,?len);??
  • memcpy(packet.data,?videoData,?len);??
  • int?ret,?got_picture;??
  • ret?=?avcodec_decode_video2(codecCtx,?frame,?&got_picture,?&packet);??
  • if?(ret?>?0){??
  • ????if(got_picture){??
  • ????//進行下一步的處理??
  • ????}??
  • }??
  • 相應的,對H264DecoderImpl類的定義和各方法的實現要進行改寫。
    首先是類的定義,去掉了ISVCDecoder* decoder_,加入了以下私有成員變量 [cpp]?view plaincopy
  • AVCodecContext??*pCodecCtx;??
  • ??AVCodec???????????*pCodec;??
  • ??AVFrame???*pFrame,?*pFrameYUV;??
  • ??AVPacket?*packet;??
  • ??struct?SwsContext?*img_convert_ctx;??
  • ??uint8_t?*decode_buffer;//存儲最開始收到的SPS、PPS和IDR幀以便進行最開始的解碼??
  • ??uint8_t?*out_buffer;??
  • ??int?framecnt?=?0;??
  • ??int?encoded_length?=?0;??
  • 構造函數和析構函數的改寫省略不表,重點看一下InitDecode方法和Decode方法 InitDecode方法改寫如下 [cpp]?view plaincopy
  • int?H264DecoderImpl::InitDecode(const?VideoCodec*?inst,?int?number_of_cores)?{??
  • ????????if?(inst?==?NULL)?{??
  • ????????????return?WEBRTC_VIDEO_CODEC_ERR_PARAMETER;??
  • ????????}??
  • ????????int?ret_val?=?Release();??
  • ????????if?(ret_val?<?0)?{??
  • ????????????return?ret_val;??
  • ????????}??
  • ??
  • ????????if?(&codec_?!=?inst)?{??
  • ????????????//?Save?VideoCodec?instance?for?later;?mainly?for?duplicating?the?decoder.??
  • ????????????codec_?=?*inst;??
  • ????????}??
  • ????????pCodec?=?avcodec_find_decoder(AV_CODEC_ID_H264);??
  • ????????pCodecCtx?=?avcodec_alloc_context3(pCodec);??
  • ????????pCodecCtx->pix_fmt?=?PIX_FMT_YUV420P;??
  • ????????pCodecCtx->width?=?codec_.width;??
  • ????????pCodecCtx->height?=?codec_.height;??
  • ????????//pCodecCtx->bit_rate?=?codec_.targetBitrate*1000;??
  • ????????pCodecCtx->time_base.num?=?1;??
  • ????????pCodecCtx->time_base.den?=?codec_.maxFramerate;??
  • ??
  • ????????if?(pCodec?==?NULL){??
  • ????????????WEBRTC_TRACE(webrtc::kTraceError,?webrtc::kTraceVideoCoding,?-1,??
  • ????????????????"H264DecoderImpl::InitDecode,?Codec?not?found.");??
  • ????????????return?WEBRTC_VIDEO_CODEC_ERROR;??
  • ????????}??
  • ????????if?(avcodec_open2(pCodecCtx,?pCodec,?NULL)?<?0){??
  • ????????????WEBRTC_TRACE(webrtc::kTraceError,?webrtc::kTraceVideoCoding,?-1,??
  • ????????????????"H264DecoderImpl::InitDecode,?Could?not?open?codec.");??
  • ????????????return?WEBRTC_VIDEO_CODEC_ERROR;??
  • ????????}??
  • ????????inited_?=?true;??
  • ??
  • ????????//?Always?start?with?a?complete?key?frame.??
  • ????????key_frame_required_?=?true;??
  • ????????WEBRTC_TRACE(webrtc::kTraceApiCall,?webrtc::kTraceVideoCoding,?-1,??
  • ????????????"H264DecoderImpl::InitDecode(width:%d,?height:%d,?framerate:%d,?start_bitrate:%d,?max_bitrate:%d)",??
  • ????????????inst->width,?inst->height,?inst->maxFramerate,?inst->startBitrate,?inst->maxBitrate);??
  • ????????return?WEBRTC_VIDEO_CODEC_OK;??
  • ????}??
  • Decode方法的實現改寫如下 [cpp]?view plaincopy
  • int?H264DecoderImpl::Decode(const?EncodedImage&?input_image,??
  • ????????bool?missing_frames,??
  • ????????const?RTPFragmentationHeader*?fragmentation,??
  • ????????const?CodecSpecificInfo*?codec_specific_info,??
  • ????????int64_t?/*render_time_ms*/)?{??
  • ????????if?(!inited_)?{??
  • ????????????WEBRTC_TRACE(webrtc::kTraceError,?webrtc::kTraceVideoCoding,?-1,??
  • ????????????????"H264DecoderImpl::Decode,?decoder?is?not?initialized");??
  • ????????????return?WEBRTC_VIDEO_CODEC_UNINITIALIZED;??
  • ????????}??
  • ??
  • ????????if?(decode_complete_callback_?==?NULL)?{??
  • ????????????WEBRTC_TRACE(webrtc::kTraceError,?webrtc::kTraceVideoCoding,?-1,??
  • ????????????????"H264DecoderImpl::Decode,?decode?complete?call?back?is?not?set");??
  • ????????????return?WEBRTC_VIDEO_CODEC_UNINITIALIZED;??
  • ????????}??
  • ??
  • ????????if?(input_image._buffer?==?NULL)?{??
  • ????????????WEBRTC_TRACE(webrtc::kTraceError,?webrtc::kTraceVideoCoding,?-1,??
  • ????????????????"H264DecoderImpl::Decode,?null?buffer");??
  • ????????????return?WEBRTC_VIDEO_CODEC_ERR_PARAMETER;??
  • ????????}??
  • ????????if?(!codec_specific_info)?{??
  • ????????????WEBRTC_TRACE(webrtc::kTraceError,?webrtc::kTraceVideoCoding,?-1,??
  • ????????????????"H264EncoderImpl::Decode,?no?codec?info");??
  • ????????????return?WEBRTC_VIDEO_CODEC_ERROR;??
  • ????????}??
  • ????????if?(codec_specific_info->codecType?!=?kVideoCodecH264)?{??
  • ????????????WEBRTC_TRACE(webrtc::kTraceError,?webrtc::kTraceVideoCoding,?-1,??
  • ????????????????"H264EncoderImpl::Decode,?non?h264?codec?%d",?codec_specific_info->codecType);??
  • ????????????return?WEBRTC_VIDEO_CODEC_ERROR;??
  • ????????}??
  • ??
  • ????????WEBRTC_TRACE(webrtc::kTraceApiCall,?webrtc::kTraceVideoCoding,?-1,??
  • ????????????"H264DecoderImpl::Decode(frame_type:%d,?length:%d",??
  • ????????????input_image._frameType,?input_image._length);??
  • ??????
  • ????????if?(framecnt?<?2)??
  • ????????{//存儲最開始的SPS?PPS?和?IDR幀以便進行初始的解碼??
  • ????????????memcpy(decode_buffer?+?encoded_length,?input_image._buffer,?input_image._length);??
  • ????????????encoded_length?+=?input_image._length;??
  • ????????????framecnt++;??
  • ????????}??
  • ????????else??
  • ????????{??
  • ????????????pFrame?=?av_frame_alloc();??
  • ????????????pFrameYUV?=?av_frame_alloc();??
  • ????????????out_buffer?=?(uint8_t?*)av_malloc(avpicture_get_size(PIX_FMT_YUV420P,?pCodecCtx->width,?pCodecCtx->height));??
  • ????????????avpicture_fill((AVPicture?*)pFrameYUV,?out_buffer,?PIX_FMT_YUV420P,?pCodecCtx->width,?pCodecCtx->height);??
  • ????????????img_convert_ctx?=?sws_getContext(pCodecCtx->width,?pCodecCtx->height,?pCodecCtx->pix_fmt,??
  • ????????????????pCodecCtx->width,?pCodecCtx->height,?PIX_FMT_YUV420P,?SWS_BICUBIC,?NULL,?NULL,?NULL);??
  • ??????????????
  • ????????????if?(framecnt?==?2)??
  • ????????????{??
  • ????????????????packet?=?(AVPacket?*)av_malloc(sizeof(AVPacket));??
  • ????????????????av_new_packet(packet,?encoded_length);??
  • ????????????????memcpy(packet->data,?decode_buffer,?encoded_length);??
  • ????????????????av_free(decode_buffer);??
  • ????????????????framecnt++;??
  • ????????????????printf("\n\nLoading");??
  • ????????????}??
  • ????????????else??
  • ????????????{??
  • ????????????????packet?=?(AVPacket?*)av_malloc(sizeof(AVPacket));??
  • ????????????????av_new_packet(packet,?input_image._length);??
  • ????????????????memcpy(packet->data,?input_image._buffer,?input_image._length);??
  • ????????????}??
  • ??????????????
  • ????????????int?got_picture?=?0;??
  • ????????????int?ret?=?avcodec_decode_video2(pCodecCtx,?pFrame,?&got_picture,?packet);??
  • ????????????if?(ret?<?0){??
  • ????????????????WEBRTC_TRACE(webrtc::kTraceError,?webrtc::kTraceVideoCoding,?-1,??
  • ????????????????????"H264DecoderImpl::Decode,?Decode?Error.");??
  • ????????????????return?WEBRTC_VIDEO_CODEC_ERROR;??
  • ????????????}??
  • ????????????if?(got_picture){??
  • ????????????????sws_scale(img_convert_ctx,?(const?uint8_t*?const*)pFrame->data,?pFrame->linesize,?0,?pCodecCtx->height,??
  • ????????????????????pFrameYUV->data,?pFrameYUV->linesize);??
  • ??
  • ????????????????int?size_y?=?pFrameYUV->linesize[0]?*?pCodecCtx->height;??
  • ????????????????int?size_u?=?pFrameYUV->linesize[1]?*?pCodecCtx->height?/?2;??
  • ????????????????int?size_v?=?pFrameYUV->linesize[2]?*?pCodecCtx->height?/?2;??
  • ??
  • ????????????????decoded_image_.CreateFrame(size_y,?static_cast<uint8_t*>(pFrameYUV->data[0]),??
  • ????????????????????size_u,?static_cast<uint8_t*>(pFrameYUV->data[1]),??
  • ????????????????????size_v,?static_cast<uint8_t*>(pFrameYUV->data[2]),??
  • ????????????????????pCodecCtx->width,??
  • ????????????????????pCodecCtx->height,??
  • ????????????????????pFrameYUV->linesize[0],??
  • ????????????????????pFrameYUV->linesize[1],??
  • ????????????????????pFrameYUV->linesize[2]);??
  • ??
  • ????????????????decoded_image_.set_timestamp(input_image._timeStamp);??
  • ????????????????decode_complete_callback_->Decoded(decoded_image_);??
  • ????????????????return?WEBRTC_VIDEO_CODEC_OK;??
  • ????????????}??
  • ????????????else??
  • ????????????????printf(".");??
  • ????????????av_free_packet(packet);??
  • ????????}??
  • ????????return?WEBRTC_VIDEO_CODEC_OK;??
  • ????}??

  • 其他方法的實現保持不變,至此ffmpeg解碼功能的重新封裝也完成了。 從最后實現的效果來看,X264的視頻質量的確是最好的,但是播放端的解碼延時比較高,暫時還不清楚原因,希望了解的朋友指教。
    本項目源代碼

    轉載于:https://www.cnblogs.com/x_wukong/p/4880961.html

    總結

    以上是生活随笔為你收集整理的WebRTC VideoEngine超详细教程(三)——集成X264编码和ffmpeg解码的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    国产xvideos免费视频播放 | 五月婷在线观看 | 天天舔天天搞 | 日韩久久午夜一级啪啪 | 在线看片一区 | 一色av | 久久涩涩网站 | 手机av观看| 一区二区三区在线视频观看58 | 五月丁婷婷 | 日韩草比 | 99色婷婷| 国产 色 | 99色在线观看 | 欧美最猛性xxx | 欧洲性视频 | 精品中文字幕在线 | 欧美成a人片在线观看久 | 天天干天天干天天干 | 国产精品亚洲成人 | 丁香导航 | 国产欧美久久久精品影院 | 综合激情av | 毛片视频电影 | 操操日日| 亚洲一级性 | 日本久久免费电影 | 国产精品视频区 | 精品成人a区在线观看 | 久久美女高清视频 | 午夜在线看| 97香蕉久久国产在线观看 | 国产综合精品一区二区三区 | 国产精品久久久久久模特 | 成人影视免费看 | 成人免费在线视频 | 最近中文字幕大全 | 国产中文字幕大全 | 一级片黄色片网站 | 欧美久久综合 | 亚洲一区欧美激情 | 综合激情久久 | 免费碰碰| 久久艹国产视频 | 免费手机黄色网址 | 人人爽人人爽人人爽学生一级 | 亚洲视频精品在线 | 九九99靖品 | 精品五月天 | 91精品视频导航 | 精品久久久久久久久中文字幕 | 色婷婷88av视频一二三区 | 久久艹精品 | 91精品久久久久久久久 | 成人h动漫在线看 | 97热在线观看 | 亚洲精品在线电影 | 在线国产精品视频 | 欧美射射射 | 久久久黄色 | 综合色婷婷 | 韩日电影在线观看 | a久久久久| 国产精品一区免费在线观看 | 热re99久久精品国产99热 | 成人av电影免费观看 | 91超级碰 | 免费看一级一片 | 日韩一区二区免费视频 | 一区二区欧美激情 | 97网站 | 国产一区在线免费观看视频 | 日韩欧美在线一区二区 | 久久免费视频一区 | 在线观看播放av | 日韩成年视频 | 日韩欧美黄色网址 | 99精品视频免费看 | 国产视频一区二区三区在线 | 一区二区在线不卡 | 九色琪琪久久综合网天天 | 黄免费在线观看 | 99视频在线免费 | 二区在线播放 | 国产尤物视频在线 | 青草草在线| 国产精品电影一区 | 欧美一二区视频 | 开心色激情网 | 久久久久久久久免费 | 亚洲三级在线 | 日韩av片免费在线观看 | 婷婷色网视频在线播放 | 国产成人精品综合 | 成人免费精品 | 亚洲精品免费观看视频 | 国产免费观看av | 久久艹人人 | 天天色天天射天天综合网 | 精品国产成人 | 亚洲日韩精品欧美一区二区 | 欧美日韩另类在线观看 | 欧美久久久久久久久久久 | 四虎影视8848aamm | 国产九九九视频 | 精品国模一区二区三区 | 蜜臀av夜夜澡人人爽人人桃色 | 日本在线成人 | 在线观看中文av | 欧美久久久久久久久久 | 久久精品视频一 | 国产高清 不卡 | 成人国产一区 | 久久人人爽人人人人片 | 中文字幕一区二区三区在线播放 | 人人爽人人插 | 亚洲成人资源网 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 色永久免费视频 | 欧美性大战久久久久 | 国产专区精品 | 91免费黄视频 | 日韩视频在线观看免费 | 激情文学综合丁香 | 国产九九热视频 | 免费成人av | 日韩美女高潮 | 激情久久伊人 | 国产精品美女久久久久久久久 | 少妇性xxx| 久久国产品 | 久热香蕉视频 | 久久久精品成人 | 免费美女av | 免费精品视频在线 | 国产精久久久 | 91精品视屏 | av一级久久 | 成人国产精品久久久春色 | 欧美精品九九99久久 | 亚洲成人精品久久久 | 91网免费看 | 中文字幕资源在线 | av888av.com | 成人av在线一区二区 | 国产精品久久久久久久7电影 | 国产成人一区二区三区在线观看 | 黄色在线观看免费 | 久久综合影院 | 免费看黄的视频 | 国产日韩高清在线 | 美女网站在线观看 | 亚洲日本在线视频观看 | 99久久综合精品五月天 | 久久综合九色综合97_ 久久久 | 国产精品美女在线观看 | 中文字幕av电影下载 | 婷婷久久婷婷 | 日韩av免费在线看 | 国产一级免费播放 | 中文字幕刺激在线 | 久久伦理网 | 中国成人一区 | 一区二区精品在线观看 | 国产麻豆传媒 | 色综合天天综合网国产成人网 | 日日操夜| 国产一级二级在线播放 | 国产亚洲精品bv在线观看 | 欧美午夜理伦三级在线观看 | 欧美精品久久久久久久免费 | 国产免费观看高清完整版 | 亚洲精品国产欧美在线观看 | 免费国产视频 | www夜夜操com| 日本高清xxxx | 人人草人| 免费aa大片 | 国产免费黄色 | 天天综合成人 | 免费欧美高清视频 | 亚洲成人国产精品 | 国产一区精品在线 | 91视频久久久久久 | 91精品免费在线 | 91亚洲精品在线观看 | 色狠狠狠 | 69中文字幕 | 最近中文字幕第一页 | 夜夜高潮夜夜爽国产伦精品 | 国产麻豆视频在线观看 | 九九色综合 | 久久一级片 | 亚洲精品国精品久久99热一 | 一区二区精品视频 | 欧美激情第八页 | 91久久精品日日躁夜夜躁国产 | 国产一区免费观看 | 天天天综合网 | 91av成人| 欧美精品国产综合久久 | 日日日日| 九九99视频 | 国产丝袜在线 | 日本黄色片一区二区 | 欧美巨大 | 亚洲理论视频 | 天天综合狠狠精品 | 91精品国产乱码久久桃 | 久久视频| 久久婷婷一区二区三区 | 在线观看免费观看在线91 | 狠狠狠狠狠狠狠干 | 欧美精品日韩 | 色a资源在线 | 亚洲国产成人在线播放 | 亚洲一级性 | 91亚瑟视频 | 在线免费观看av网站 | 精品9999 | 91丨九色丨勾搭 | 日韩视频一| caobi视频| 亚洲黄在线观看 | 亚洲网站在线 | 天天干夜夜想 | 草久电影 | 五月天婷婷丁香花 | 成人黄色电影在线播放 | 中文字幕在线播放日韩 | 手机色在线 | 国产伦理剧 | 天堂黄色片 | 国产91精品在线播放 | 久久99视频免费 | 久久超级碰视频 | 亚洲精品国精品久久99热一 | 在线成人av | 精品专区一区二区 | 亚洲精品久久久蜜臀下载官网 | 日韩色在线 | 天天操综 | 99热网站| 免费看av片网站 | 人人草人人草 | 丁香色天天| 热久久免费视频精品 | 国产裸体视频bbbbb | 午夜精品久久久久久久久久 | 久久视| 人人干人人上 | 99免费在线视频观看 | 99久久久久久 | 国产精品女同一区二区三区久久夜 | 国产精品亚洲综合久久 | 九九热国产视频 | 黄色av三级在线 | 天天射天天做 | 久久国产精品一二三区 | 91精品久久久久久粉嫩 | 成人免费看黄 | 日韩电影在线观看一区二区三区 | 亚州欧美精品 | 日韩av手机在线观看 | 国语黄色片 | 日韩在观看线 | 久久久国产精品免费 | 国产精品久久久99 | 亚洲精品va | 高清一区二区 | 超碰人人99| 热久久视久久精品18亚洲精品 | 国产日本亚洲高清 | av一区二区三区在线 | 超级碰碰碰免费视频 | 欧美一级大片在线观看 | 亚洲精品在线视频观看 | 亚洲精品一区二区在线观看 | 深爱激情综合 | 96久久精品| 美女网站视频色 | 在线91观看| 欧美三级在线播放 | 日本激情视频中文字幕 | 亚洲国产人午在线一二区 | 丁香久久五月 | 久久午夜电影 | 久久久久99精品国产片 | 99精品久久久久久久久久综合 | 操久| 久久久久久久久国产 | 黄污网 | 中文字幕在线色 | 国产91丝袜在线播放动漫 | 蜜臀久久99精品久久久久久网站 | 天天干天天想 | 福利视频入口 | 中文字幕在线日本 | 91大神一区二区三区 | 日韩欧美高清视频在线观看 | www.黄色片.com | 亚洲精品欧美成人 | 涩涩网站在线观看 | 久久九九影院 | 激情深爱五月 | 在线亚洲精品 | 亚洲人成人天堂h久久 | 久草视频在线资源站 | 成 人 黄 色 视频播放1 | 亚洲精品视频网站在线观看 | 久久这里只有精品首页 | 国产免费人人看 | 国产自产在线视频 | 天天躁天天狠天天透 | 久久影院亚洲 | 欧美成人视 | av在线一二三区 | 福利视频一区二区 | 色婷婷激情电影 | 久久国产区 | 最新黄色av网址 | 久久久久中文字幕 | 99视频国产在线 | 婷婷丁香色综合狠狠色 | 349k.cc看片app| 中文字幕中文字幕中文字幕 | 成人免费观看视频网站 | 欧美精品乱码久久久久久 | 日韩丝袜在线观看 | 日本xxxx裸体xxxx17 | 日韩,精品电影 | 69国产在线观看 | 国产一区二区三区免费在线 | 久久久国产一区二区三区 | 青青草华人在线视频 | 少妇bbbb搡bbbb搡bbbb | av在线网站大全 | 超碰电影在线观看 | 免费日韩在线 | 热久久这里只有精品 | 懂色av一区二区三区蜜臀 | 欧美一级特黄aaaaaa大片在线观看 | 成人一区在线观看 | 999精品网| 天天爽人人爽 | 中文字幕一区二区在线播放 | 麻豆免费在线播放 | 欧美福利视频 | 久久久精品国产免费观看一区二区 | 精品在线二区 | 四虎影视精品成人 | 黄a网 | 日本公妇在线观看 | 中文字幕av在线 | 97色在线观看免费视频 | 人人爽人人爽人人爽 | 亚洲成人黄色在线 | 成人午夜影视 | 在线激情影院一区 | 日韩欧美高清一区二区 | 久久免费观看少妇a级毛片 久久久久成人免费 | 另类老妇性bbwbbw高清 | 草 免费视频 | 国产色区 | 夜夜干夜夜 | 精品福利视频在线观看 | 日本黄色免费电影网站 | 欧美精品xxx | 久久综合久久八八 | 在线免费观看麻豆视频 | 久久调教视频 | 亚洲精品一区二区三区在线观看 | 天天操夜 | 色吊丝在线永久观看最新版本 | 一区二区影院 | 日韩精品网址 | 亚洲情影院 | 国产一级精品视频 | 成 人 黄 色 视频播放1 | 狠狠操狠狠干天天操 | 中文字幕欧美三区 | 欧美另类一二三四区 | 最近中文字幕国语免费av | 91在线www | av黄色在线观看 | 99国产视频在线 | 在线观看韩日电影免费 | 久久久久久蜜桃一区二区 | 中文字幕在线久一本久 | 日韩精品一区二区在线 | 国产老太婆免费交性大片 | 国产黄色电影 | 天天曰视频 | 干干日日| 免费看黄在线看 | 国产精品久久99综合免费观看尤物 | 中文字幕久久网 | 午夜精品视频一区二区三区在线看 | 亚洲一区黄色 | 天无日天天操天天干 | 黄色av一级 | 最近免费中文字幕mv在线视频3 | 免费a视频在线 | 97国产精品免费 | bayu135国产精品视频 | 在线观看亚洲免费视频 | 久久精品久久99精品久久 | 婷婷午夜激情 | 国外调教视频网站 | 中文字幕在线第一页 | 午夜在线观看 | x99av成人免费| 国产精品美女久久久久久免费 | 黄色录像av | 免费视频一二三区 | 最近2019好看的中文字幕免费 | 国产精品网红直播 | aav在线| 国产亚洲婷婷免费 | 亚洲精品久久久久久国 | 日本中文一区二区 | 香蕉久久久久久av成人 | 色先锋av资源中文字幕 | 欧美极品少妇xxxx | 久久精品视频在线观看免费 | 久久精品一二区 | 在线观看av免费观看 | 黄色资源在线观看 | 天天综合视频在线观看 | 天堂av网址| 色婷婷伊人| 粉嫩av一区二区三区四区五区 | 三级黄色在线观看 | 日本深夜福利视频 | 在线观看国产高清视频 | 久久久久久久久黄色 | 日本在线成人 | 亚洲天堂色婷婷 | 国产18精品乱码免费看 | 亚洲最快最全在线视频 | 亚洲女人天堂成人av在线 | 免费看久久 | 久久久午夜精品福利内容 | 久久人人爽 | 婷婷丁香狠狠爱 | 天天色.com | 国产美女在线免费观看 | 国产福利一区在线观看 | 久草在线在线视频 | 亚洲人成在 | 日韩黄色一级电影 | 青草视频在线 | 国产精品高清免费在线观看 | 丁香婷婷综合网 | 蜜臀久久99精品久久久无需会员 | 色在线免费 | 亚洲欧洲精品一区二区精品久久久 | 成人亚洲综合 | 久久免费福利视频 | 五月婷婷爱 | a天堂最新版中文在线地址 久久99久久精品国产 | 国产视频九色蝌蚪 | 欧美日韩国产综合一区二区 | 国产一性一爱一乱一交 | 国产欧美精品一区二区三区 | 中文一区在线 | 亚洲午夜不卡 | 国产在线播放一区 | 亚洲成人家庭影院 | 91在线观 | 天天摸天天操天天舔 | 国产一级一级国产 | 免费在线精品视频 | 亚洲精品日韩一区二区电影 | 亚洲高清视频在线观看免费 | 日韩电影在线观看一区二区 | 日韩视频区 | 中文字幕高清在线 | 成人av资源 | 精品国偷自产国产一区 | 国产亚洲精品美女久久 | 中文字幕4 | 欧美日韩国产精品一区二区三区 | 中文字幕在线观看网 | 国产精品99久久久久的智能播放 | 美女在线免费观看视频 | 久久精品美女 | av一区在线 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 久久视频国产 | 九九热久久久 | 久久老司机精品视频 | 91日韩精品 | 中字幕视频在线永久在线观看免费 | 天天插天天爱 | 亚洲精品一区二区18漫画 | 91在线播放国产 | 欧美在线一二区 | 在线日韩av | 麻豆一区在线观看 | 国产资源在线播放 | 色婷婷综合五月 | 天天色天天操天天爽 | 亚洲少妇xxxx | 久久久精品福利视频 | av色一区| 亚洲情感电影大片 | 97色视频在线| 黄色在线观看污 | 久久理论电影 | 丁香免费视频 | 中文一二区 | 久久亚洲私人国产精品 | 美女视频永久黄网站免费观看国产 | 韩国在线视频一区 | 中文字幕在线免费播放 | 五月视频 | 97人人艹| www.com.黄 | 亚洲天堂精品视频在线观看 | 国产另类xxxxhd高清 | 91网站在线视频 | 亚洲夜夜网 | 亚洲资源视频 | 免费91麻豆精品国产自产在线观看 | 中文字幕在线网址 | 亚洲 欧美日韩 国产 中文 | 色99之美女主播在线视频 | 99视频精品 | 在线观看色网 | 日韩视频一区二区三区在线播放免费观看 | 91精品啪在线观看国产线免费 | 国语精品久久 | 免费观看黄 | 国产高清成人在线 | 字幕网在线观看 | 国产成人综 | 久久在线免费 | 激情偷乱人伦小说视频在线观看 | 日韩av手机在线看 | 99这里只有精品99 | 国产成人在线一区 | 天天爱天天射 | 国产三级av在线 | 久久这里只有精品视频首页 | 最新国产精品拍自在线播放 | 日韩中文字幕在线不卡 | 天堂入口网站 | 在线观看日韩视频 | 免费高清在线观看电视网站 | 黄色一级片视频 | 亚洲国产成人精品在线观看 | 久草在线观看视频免费 | 日韩av影片在线观看 | 中文字幕888| 国产资源在线播放 | 久久久久亚洲最大xxxx | 久久av观看 | 国产精品涩涩屋www在线观看 | 久久精品一区二区三区国产主播 | 日韩大片在线免费观看 | 免费看一级黄色大全 | www.69xx| 色妞色视频一区二区三区四区 | 不卡av在线 | 中文字幕五区 | 91色在线观看视频 | 日韩免费av在线 | 欧美亚洲成人免费 | 成人在线播放网站 | 丁香五婷 | 天天色天天干天天 | 亚洲欧美经典 | 国产成人一区二 | 欧美日韩免费在线视频 | 免费人人干 | 日本黄色片一区二区 | 天天色播 | 亚洲午夜小视频 | 国产91精品久久久久久 | 亚洲精品美女在线观看播放 | 国产一区二区在线免费播放 | 亚洲成人黄色av | 久久久久久久亚洲精品 | 超碰国产在线观看 | 国产精品一区二区三区四 | 欧美一级免费片 | 精品自拍网| av网在线观看 | 91最新网址在线观看 | 啪啪免费视频网站 | 人人干人人做 | 国产精品色视频 | 亚洲精品xxx| 色婷婷综合成人av | 国产精品视频地址 | 在线成人欧美 | 中文字幕在线观看资源 | 国产精品国产三级国产aⅴ无密码 | 操操日日 | 亚洲综合黄色 | 黄色电影网站在线观看 | 久久成人国产精品一区二区 | 天天干天天射天天插 | 99久久99久国产黄毛片 | 丁香五香天综合情 | av在线小说 | 9在线观看免费高清完整 | 日韩精品一区在线观看 | 不卡的一区二区三区 | 91av美女| 99精品国产99久久久久久97 | 豆豆色资源网xfplay | 国产美女被啪进深处喷白浆视频 | 亚洲三级黄 | 成人av久久| 国产人成在线视频 | 久久免费视频观看 | 91免费看片黄 | 最近中文字幕免费视频 | 成人av电影在线播放 | 91九色免费视频 | 日韩免费观看视频 | 日韩免费在线看 | 日韩av中文字幕在线 | 久草在线免费看视频 | 免费高清影视 | 成人在线电影观看 | 亚洲精品美女视频 | 日韩在线视频在线观看 | 国产 日韩 在线 亚洲 字幕 中文 | 久久免费精品一区二区三区 | 日日干网址 | 99国产精品一区二区 | 粉嫩高清一区二区三区 | 在线视频免费观看 | 亚洲精选在线观看 | 日韩欧美一区视频 | 久久久久亚洲精品 | 日韩久久一区二区 | 日本一区二区不卡高清 | 国产专区视频在线 | 久久精品香蕉视频 | 亚洲精品国产精品乱码在线观看 | 婷婷性综合 | 九九涩涩av台湾日本热热 | 中文字幕在线免费观看 | 欧美久久久久久久久久久 | 亚洲综合成人婷婷小说 | 欧美俄罗斯性视频 | 亚洲国产视频网站 | 欧美va日韩va| 亚洲区精品 | 五月激情视频 | 国产精品久久久久久av | 91最新网址 | 激情文学综合丁香 | 久香蕉 | 精品久久久免费视频 | 久久久久女人精品毛片九一 | 色播六月天| 国产视频在线观看一区 | 久久精品视频网站 | 国产拍揄自揄精品视频麻豆 | 五月婷av | www.av免费观看 | 亚洲欧美日韩一区二区三区在线观看 | 日韩中文字幕免费在线播放 | 欧美激情综合色综合啪啪五月 | 安徽妇搡bbbb搡bbbb | 91超级碰 | 日韩欧美v | 日韩在线视 | 日日干天天爽 | 狠狠干 狠狠操 | 日韩激情第一页 | 麻豆视频免费观看 | 中文字幕亚洲欧美日韩2019 | 又黄又网站 | 色偷偷88888欧美精品久久 | 日韩av电影网站在线观看 | zzijzzij亚洲日本少妇熟睡 | 国产精品成人一区二区三区 | 天天操天天操天天操天天操天天操 | 制服丝袜亚洲 | 91久久爱热色涩涩 | 久久精品亚洲精品国产欧美 | av高清免费在线 | 久操综合| 国内精品久久久久影院一蜜桃 | 人人射av| 亚洲精品小视频 | 国产精品原创av片国产免费 | 日韩视频一二三区 | 日韩欧美在线不卡 | 国产在线国偷精品产拍免费yy | 成人亚洲综合 | 久久超碰99| 91你懂的| 欧美一级欧美一级 | 91在线视频 | 日韩免费在线观看网站 | 欧美日产在线观看 | 欧美一区二区三区在线看 | 色婷婷狠狠五月综合天色拍 | 日韩视频免费 | 91精品啪在线观看国产81旧版 | 国产成人精品一二三区 | 日韩av在线不卡 | 91视频成人免费 | 午夜电影久久 | 婷婷视频 | 久久成人精品电影 | 天天av综合网 | 日韩视频在线不卡 | 日韩免费电影在线观看 | 五月婷婷六月丁香 | 国产亚洲成av片在线观看 | 91精品久久久久久综合乱菊 | 国产欧美综合视频 | 97香蕉超级碰碰久久免费软件 | 特片网久久 | 91少妇精拍在线播放 | 91人人澡人人爽 | 久久激情日本aⅴ | 亚洲精品在线视频观看 | 久久不卡免费视频 | 国产综合精品一区二区三区 | 日韩欧美成 | 超碰成人免费电影 | 色中文字幕在线观看 | 激情综合网五月 | 久久亚洲福利 | 国产精品视频观看 | 伊人中文在线 | 国产视频一区二区在线观看 | 色偷偷97| 一区二区三区在线视频111 | 综合天天久久 | www.av免费| 国产午夜视频在线观看 | 狠狠色狠狠色综合日日92 | 久久爱www.| 国产在线一区观看 | 天天干天天射天天爽 | 国产精品一区欧美 | 这里只有精彩视频 | 欧美日韩一区二区三区不卡 | 久久神马影院 | 免费影视大全推荐 | 色狠狠婷婷 | 18pao国产成视频永久免费 | 欧美一区二区三区免费观看 | 久久久久欧美精品999 | 国产精品亚洲视频 | 亚洲永久精品在线观看 | 黄色网址在线播放 | 日韩r级电影在线观看 | 免费热情视频 | 在线网址你懂得 | 欧美在线视频一区二区 | 三级黄色网络 | 国产精品久久久网站 | 热99在线| 国产精品夜夜夜一区二区三区尤 | 久久99热国产 | 国产男女爽爽爽免费视频 | 国产麻豆果冻传媒在线观看 | 国产午夜三级一区二区三桃花影视 | av中文字幕网站 | 91亚·色| 日韩亚洲国产中文字幕 | 久久综合久久八八 | 久久人人精| 欧美影片 | 96精品视频| 精品婷婷| 韩日三级在线 | 日韩免费在线视频观看 | 成人在线视频网 | 美女视频久久 | 麻豆视频一区 | 五月天丁香亚洲 | 中文字幕你懂的 | 伊人色综合久久天天 | 激情亚洲综合在线 | 亚洲国产精品成人精品 | 激情五月播播久久久精品 | 国产99久久久国产精品免费二区 | 日本三级吹潮在线 | 欧美色操 | 久久精品精品电影网 | 久久精品一区 | 亚洲欧美成人综合 | 91在线视频免费观看 | 亚洲国产精久久久久久久 | 国产精品久久久久久五月尺 | 高清不卡一区二区在线 | 97国产精品一区二区 | 日韩av电影中文字幕在线观看 | 中日韩三级视频 | 综合精品在线 | 亚洲高清在线视频 | 国产精品中文字幕av | 国产午夜免费视频 | 国产中文字幕三区 | 在线电影播放 | 亚洲国产美女精品久久久久∴ | 日韩在线三区 | 91精品国产高清自在线观看 | 美女视频永久黄网站免费观看国产 | 免费a一级 | avlulu久久精品 | 欧美日韩伦理一区 | 亚洲在线精品 | 午夜精品久久久久久久99婷婷 | 最近免费中文字幕大全高清10 | 久久免费视频这里只有精品 | 青青射 | 久久精品99久久久久久2456 | 欧美日韩一区久久 | 久久精品国产99国产 | 国产黄色一级片在线 | 黄色片免费电影 | 国产理论一区二区三区 | 成x99人av在线www | 欧美狠狠色 | 日本aa在线 | 国产精品美女久久久久aⅴ 干干夜夜 | 久久精品久久精品 | 天天摸夜夜添 | 欧美性一级观看 | 日日草夜夜操 | 久青草视频在线观看 | 亚洲综合视频在线播放 | 欧美嫩草影院 | 天天干天天干天天干天天干天天干天天干 | www亚洲一区 | 欧美日本不卡视频 | 日韩久久一区 | 亚洲精品66| 亚洲尺码电影av久久 | 国产亚洲精品久久19p | 日日夜夜91 | 久久久精品福利视频 | 精品久久久久久一区二区里番 | 久久神马影院 | 久久久精品午夜 | 日韩精品免费一区二区在线观看 | 亚州中文av | 国产精品毛片一区视频播 | 在线观看中文字幕亚洲 | 久久黄色片 | 亚州av网站 | 亚洲精品国产精品乱码在线观看 | 成人午夜电影网站 | 免费高清看电视网站 | 日韩精品视频免费 | 国产免码va在线观看免费 | 在线免费观看视频一区二区三区 | 一区二区三区精品在线视频 | 久久久久久久久久久久久9999 | 99免费在线视频观看 | 最新中文字幕在线资源 | 日韩精品一区二区三区中文字幕 | 国产精品欧美一区二区 | 国产精品视频在线看 | 一区二区中文字幕在线播放 | 国产91在线播放 | 国产精品人人做人人爽人人添 | 国产xx视频 | 激情网站五月天 | 麻豆 91 在线| 手机在线永久免费观看av片 | 国产一级片网站 | 五月婷婷在线观看视频 | 日本性高潮视频 | 97超碰福利久久精品 | 欧美成a人片在线观看久 | 欧美日韩另类视频 | av电影亚洲| 日日干干 | 欧美激情综合五月色丁香 | 国产成人综 | 国产精品一区久久久久 | 久久国产香蕉视频 | 六月丁香婷婷网 | 99精品国产免费久久久久久下载 | 久碰视频在线观看 | 中文字幕av在线播放 | 国产黄色片久久久 | 日韩欧美在线国产 | 国产精品 日本 | 在线看中文字幕 | 色播五月激情五月 | av福利在线 | 婷婷色在线播放 | 欧美精品少妇xxxxx喷水 | 久久久在线视频 | 九九九视频在线 | 亚洲三级网| 国产精品自产拍在线观看中文 | 国产日韩三级 | 久久电影中文字幕视频 | 亚洲精品综合在线观看 | 97视频免费| 免费日韩在线 | 麻豆视频91 | 激情深爱.com | 天天做天天爱天天爽综合网 | 久久精久久精 | 国产精品高潮呻吟久久av无 | 国产综合片 | 天天操天天综合网 | 亚洲精品66| 超碰97在线人人 | 午夜精品久久久久久久爽 | 国产成年免费视频 | 99视屏| 免费在线成人av电影 | 91精品国自产在线观看欧美 | 91亚洲精品久久久蜜桃网站 | 亚洲区视频在线 | 69绿帽绿奴3pvideos | 黄色软件在线观看 | 日韩欧美一区二区三区视频 | 人人舔人人射 | 久久韩国免费视频 | 国产精品一区二区免费 | 久久色视频 | 日日碰狠狠躁久久躁综合网 | 亚洲午夜久久久综合37日本 | 五月婷婷六月综合 | 96久久欧美麻豆网站 | 国产主播99| 正在播放日韩 | 国产精品日韩欧美 | 国产精品中文字幕av | 五月开心激情 | 99色网站 | 在线免费观看欧美日韩 | 日韩精品电影在线播放 | av丝袜天堂 | 欧美一区二区三区在线观看 | 激情 婷婷 | 久久午夜影院 | 人人干人人搞 | 国产成人福利在线观看 | 亚洲闷骚少妇在线观看网站 | 亚洲一区二区观看 | 亚洲在线免费视频 | 色偷偷88888欧美精品久久久 | 欧美国产日韩一区 | 久久久国产精品视频 | 久久这里只有精品9 | 久久综合九色 | 国产日韩视频在线播放 | 久久艹99| 蜜桃视频日本 | 久草视频免费播放 | 成人欧美一区二区三区黑人麻豆 | 欧美做受xxx| 91精品在线免费观看视频 | 黄色av免费电影 | 亚洲一级影院 | 亚洲精品乱码白浆高清久久久久久 | 免费一级片观看 | 欧美日韩成人一区 | 国产又粗又猛又爽又黄的视频免费 | 免费中午字幕无吗 | 国产精品青草综合久久久久99 | 91最新在线观看 | 摸bbb搡bbb搡bbbb | 亚洲一区精品人人爽人人躁 | 午夜视频不卡 | 久久综合久久综合久久 | 国产精品成人av在线 | 国产精品h在线观看 | 日韩三级免费 | 国产午夜麻豆影院在线观看 | 国产精品自产拍在线观看中文 | 国产在线精品一区 | 久久成人国产精品一区二区 | 91免费在线看片 | 亚洲精品视频大全 | 狠狠干婷婷 | 一区二区三区四区精品 | 欧美精品一区二区三区一线天视频 | 人人搞人人干 | 日韩 精品 一区 国产 麻豆 | 波多野结衣综合网 | 中文在线资源 | 久久成年视频 | 中文字幕乱码日本亚洲一区二区 | 亚洲国产电影在线观看 | 欧美日韩午夜在线 | 99热99| 福利二区视频 |