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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

iOS H264,H265视频编码(Video encode)

發(fā)布時(shí)間:2024/9/21 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS H264,H265视频编码(Video encode) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本例需求:使用H264, H265實(shí)現(xiàn)視頻數(shù)據(jù)的編碼并錄制開始200幀存為文件.

原理:比如做直播功能,需要將客戶端的視頻數(shù)據(jù)傳給服務(wù)器,如果分辨率過(guò)大如2K,4K則傳輸壓力太大,所以需要對(duì)視頻數(shù)據(jù)進(jìn)行編碼,傳給服務(wù)器后再解碼以實(shí)現(xiàn)大數(shù)據(jù)量的視頻數(shù)據(jù)的傳輸,而利用硬件編碼則可以極大限度減小CPU壓力,

H264進(jìn)行編碼,iOS 11 之后,iPhone 7以上的設(shè)備可以支持新的編碼器H265編碼器,使得同等質(zhì)量視頻占用的存儲(chǔ)空間更小。所以本例中可以使用兩種方式實(shí)現(xiàn)視頻數(shù)據(jù)的編碼


最終效果如下 : h264

h265 :


GitHub地址(附代碼) : H264,H265Encode

簡(jiǎn)書地址 : H264,H265Encode

博客地址 : H264,H265Encode

掘金地址 : H264,H265Encode


實(shí)現(xiàn)方式:

1. H264 : H264是當(dāng)前主流編碼標(biāo)準(zhǔn),以高壓縮高質(zhì)量和支持多種網(wǎng)絡(luò)的流媒體傳輸著稱

2. H265 :H264編碼器的下一代,它的主要優(yōu)點(diǎn)提供的壓縮比高,相同質(zhì)量的視頻是H264的兩倍。


一.本文需要基本知識(shí)點(diǎn)

注意:可以先通過(guò)H264,H265編碼器介紹, H.264 Data Structure了解預(yù)備知識(shí)。

1. 軟編與硬編概念

  • 軟編碼:使用CPU進(jìn)行編碼。
  • 硬編碼:不使用CPU進(jìn)行編碼,使用顯卡GPU,專用的DSP、FPGA、ASIC芯片等硬件進(jìn)行編碼。
    • 比較
      • 軟編碼:實(shí)現(xiàn)直接、簡(jiǎn)單,參數(shù)調(diào)整方便,升級(jí)易,但CPU負(fù)載重,性能較硬編碼低,低碼率下質(zhì)量通常比硬編碼要好一點(diǎn)。
      • 性能高,低碼率下通常質(zhì)量低于軟編碼器,但部分產(chǎn)品在GPU硬件平臺(tái)移植了優(yōu)秀的軟編碼算法(如X264)的,質(zhì)量基本等同于軟編碼。
      • 蘋果在iOS 8.0系統(tǒng)之前,沒(méi)有開放系統(tǒng)的硬件編碼解碼功能,不過(guò)Mac OS系統(tǒng)一直有,被稱為Video ToolBox的框架來(lái)處理硬件的編碼和解碼,終于在iOS 8.0后,蘋果將該框架引入iOS系統(tǒng)

2.H265優(yōu)點(diǎn)

  • 壓縮比高,在相同圖片質(zhì)量情況下,比JPEG高兩倍
  • 能增加如圖片的深度信息,透明通道等輔助圖片。
  • 支持存放多張圖片,類似相冊(cè)和集合。(實(shí)現(xiàn)多重曝光的效果)
  • 支持多張圖片實(shí)現(xiàn)GIF和livePhoto的動(dòng)畫效果。
  • 無(wú)類似JPEG的最大像素限制
  • 支持透明像素
  • 分塊加載機(jī)制
  • 支持縮略圖

二.代碼解析

1.實(shí)現(xiàn)流程

  • 初始化相機(jī)參數(shù),設(shè)置相機(jī)代理,這里就固定只有豎屏模式。
  • 初始化編碼器參數(shù),并啟動(dòng)編碼器
  • 在編碼成功的回調(diào)中從開始錄制200幀(文件大小可自行修改)的視頻,存到沙盒中,可以通過(guò)連接數(shù)據(jù)線到電腦從itunes中將文件(test0.asf)提取出來(lái)

2.編碼器實(shí)現(xiàn)流程

  • 創(chuàng)建編碼器需要的session (h264, h265 或同時(shí)創(chuàng)建)
  • 設(shè)置session屬性,如實(shí)時(shí)編碼,碼率,fps, 編碼的分辨率的寬高,相鄰I幀的最大間隔等等
    • 注意H265目前不支持碼率的限制
  • 當(dāng)相機(jī)回調(diào)AVCaptureVideoDataOutputSampleBufferDelegate采集到一幀數(shù)據(jù)的時(shí)候則使用H264/H265編碼器對(duì)每一幀數(shù)據(jù)進(jìn)行編碼。
  • 若編碼成功會(huì)觸發(fā)回調(diào),回調(diào)函數(shù)首先檢測(cè)是否有I幀出現(xiàn),如果有I幀出現(xiàn)則將sps,pps信息寫入否則遍歷NALU碼流并將startCode替換成{0x00, 0x00, 0x00, 0x01}

3.主要方法解析

  • 初始化編碼器 首先選擇使用哪種方式實(shí)現(xiàn),在本例中可以設(shè)置[XDXHardwareEncoder getInstance].enableH264 = YES 或者 [XDXHardwareEncoder getInstance].enableH265 = YES,也可以同時(shí)設(shè)置,如果同時(shí)設(shè)置需要將其中一個(gè)回調(diào)函數(shù)中的writeFile的方法屏蔽掉,并且只有較新的iPhone(> iPhone8 穩(wěn)定)才支持同時(shí)打開兩個(gè)session。

判斷當(dāng)前設(shè)備是否支持H265編碼,必須滿足兩個(gè)條件,一是iPhone 7 以上設(shè)備,二是版本大于iOS 11

if (@available(iOS 11.0, *)) {BOOL hardwareDecodeSupported = VTIsHardwareDecodeSupported(kCMVideoCodecType_HEVC);if (hardwareDecodeSupported) {_deviceSupportH265 = YES;NSLog(@"XDXHardwareEncoder : Support H265 Encode/Decode!");}}else {_deviceSupportH265 = NO;NSLog(@"XDXHardwareEncoder : Not support H265 Encode/Decode!");} 復(fù)制代碼

系統(tǒng)已經(jīng)提供VTIsHardwareDecodeSupported判斷當(dāng)前設(shè)備是否支持H265編碼

初始化編碼器操作

- (void)prepareForEncode {if(self.width == 0 || self.height == 0) {NSLog(@"XDXHardwareEncoder : VTSession need with and height for init,with = %d,height = %d",self.width, self.height);return;}if(g_isSupportRealTimeEncoder) NSLog(@"XDXHardwareEncoder : Device processor is 64 bit");else NSLog(@"XDXHardwareEncoder : Device processor is not 64 bit");NSLog(@"XDXHardwareEncoder : Current h264 open state : %d, h265 open state : %d",self.enableH264, self.enableH265);OSStatus h264Status,h265Status;BOOL isRestart = NO;if (self.enableH264) {if (h264CompressionSession != NULL) {NSLog(@"XDXHardwareEncoder : H264 session not NULL");return;}[m_h264_lock lock];NSLog(@"XDXHardwareEncoder : Prepare H264 hardware encoder");//[self.delegate willEncoderStart];self.h264ErrCount = 0;h264Status = VTCompressionSessionCreate(NULL, self.width, self.height, kCMVideoCodecType_H264, NULL, NULL, NULL, vtCallBack,(__bridge void *)self, &h264CompressionSession);if (h264Status != noErr) {self.h265ErrCount++;NSLog(@"XDXHardwareEncoder : H264 VTCompressionSessionCreate Failed, status = %d",h264Status);}[self getSupportedPropertyFlags];[self applyAllSessionProperty:h264CompressionSession propertyArr:self.h264propertyFlags];h264Status = VTCompressionSessionPrepareToEncodeFrames(h264CompressionSession);if(h264Status != noErr) {NSLog(@"XDXHardwareEncoder : H264 VTCompressionSessionPrepareToEncodeFrames Failed, status = %d",h264Status);}else {initializedH264 = true;NSLog(@"XDXHardwareEncoder : H264 VTSession create success, with = %d, height = %d, framerate = %d",self.width,self.height,self.fps);}if(h264Status != noErr && self.h264ErrCount != 0) isRestart = YES;[m_h264_lock unlock];}if (self.enableH265) {if (h265CompressionSession != NULL) {NSLog(@"XDXHardwareEncoder : H265 session not NULL");return;}[m_h265_lock lock];NSLog(@"XDXHardwareEncoder : Prepare h265 hardware encoder");// [self.delegate willEncoderStart];self.h265ErrCount = 0;h265Status = VTCompressionSessionCreate(NULL, self.width, self.height, kCMVideoCodecType_HEVC, NULL, NULL, NULL, vtH265CallBack,(__bridge void *)self, &h265CompressionSession);if (h265Status != noErr) {self.h265ErrCount++;NSLog(@"XDXHardwareEncoder : H265 VTCompressionSessionCreate Failed, status = %d",h265Status);}[self getSupportedPropertyFlags];[self applyAllSessionProperty:h265CompressionSession propertyArr:self.h265PropertyFlags];h265Status = VTCompressionSessionPrepareToEncodeFrames(h265CompressionSession);if(h265Status != noErr) {NSLog(@"XDXHardwareEncoder : H265 VTCompressionSessionPrepareToEncodeFrames Failed, status = %d",h265Status);}else {initializedH265 = true;NSLog(@"XDXHardwareEncoder : H265 VTSession create success, with = %d, height = %d, framerate = %d",self.width,self.height,self.fps);}if(h265Status != noErr && self.h265ErrCount != 0) isRestart = YES;[m_h265_lock unlock];}if (isRestart) {NSLog(@"XDXHardwareEncoder : VTSession create failured!");static int count = 0;count ++;if (count == 3) {NSLog(@"TVUEncoder : restart 5 times failured! exit!");return;}sleep(1);NSLog(@"TVUEncoder : try to restart after 1 second!");NSLog(@"TVUEncoder : vtsession error occured!,resetart encoder width: %d, height %d, times %d",self.width,self.height,count);[self tearDownSession];[self prepareForEncode];} } 復(fù)制代碼

1> g_isSupportRealTimeEncoder = (is64Bit == 8) ? true : false;用來(lái)判斷當(dāng)前設(shè)備是32位還是64位

2> 創(chuàng)建H264/H265Session 區(qū)別僅僅為參數(shù)的不同,h264為kCMVideoCodecType_H264。 h265為kCMVideoCodecType_HEVC,在創(chuàng)建Session指定了回調(diào)函數(shù)后,當(dāng)編碼成功一幀就會(huì)調(diào)用相應(yīng)的回調(diào)函數(shù)。

3> 通過(guò)[self getSupportedPropertyFlags];獲取當(dāng)前編碼器支持設(shè)置的屬性,經(jīng)過(guò)測(cè)試,H265不支持碼率的限制。目前暫時(shí)得不到解決。等待蘋果后續(xù)處理。

4> 之后設(shè)置編碼器相關(guān)屬性,下面會(huì)具體介紹,設(shè)置完成后則調(diào)用VTCompressionSessionPrepareToEncodeFrames準(zhǔn)備編碼。

  • 設(shè)置編碼器相關(guān)屬性
- (OSStatus)setSessionProperty:(VTCompressionSessionRef)session key:(CFStringRef)key value:(CFTypeRef)value {OSStatus status = VTSessionSetProperty(session, key, value);if (status != noErr) {NSString *sessionStr;if (session == h264CompressionSession) {sessionStr = @"h264 Session";self.h264ErrCount++;}else if (session == h265CompressionSession) {sessionStr = @"h265 Session";self.h265ErrCount++;}NSLog(@"XDXHardwareEncoder : Set %s of %s Failed, status = %d",CFStringGetCStringPtr(key, kCFStringEncodingUTF8),sessionStr.UTF8String,status);}return status; }- (void)applyAllSessionProperty:(VTCompressionSessionRef)session propertyArr:(NSArray *)propertyArr {OSStatus status;if(!g_isSupportRealTimeEncoder) {/* increase max frame delay from 3 to 6 to reduce encoder pressure*/int value = 3;CFNumberRef ref = CFNumberCreate(NULL, kCFNumberSInt32Type, &value);[self setSessionProperty:session key:kVTCompressionPropertyKey_MaxFrameDelayCount value:ref];CFRelease(ref);}if(self.fps) {if([self isSupportPropertyWithKey:Key_ExpectedFrameRate inArray:propertyArr]) {int value = self.fps;CFNumberRef ref = CFNumberCreate(NULL, kCFNumberSInt32Type, &value);[self setSessionProperty:session key:kVTCompressionPropertyKey_ExpectedFrameRate value:ref];CFRelease(ref);}}else {NSLog(@"XDXHardwareEncoder : Current fps is 0");}if(self.bitrate) {if([self isSupportPropertyWithKey:Key_AverageBitRate inArray:propertyArr]) {int value = self.bitrate;if (session == h265CompressionSession) value = 2*1000; // if current session is h265, Set birate 2M.CFNumberRef ref = CFNumberCreate(NULL, kCFNumberSInt32Type, &value);[self setSessionProperty:session key:kVTCompressionPropertyKey_AverageBitRate value:ref];CFRelease(ref);}}else {NSLog(@"XDXHardwareEncoder : Current bitrate is 0");}/*2016-11-15,@gang, iphone7/7plus do not support realtime encoding, so disable itotherwize ,we can not control encoding bit rate*/if (![[self deviceVersion] isEqualToString:@"iPhone9,1"] && ![[self deviceVersion] isEqualToString:@"iPhone9,2"]) {if(g_isSupportRealTimeEncoder) {if([self isSupportPropertyWithKey:Key_RealTime inArray:propertyArr]) {NSLog(@"use RealTimeEncoder");NSLog(@"XDXHardwareEncoder : use realTimeEncoder");[self setSessionProperty:session key:kVTCompressionPropertyKey_RealTime value:kCFBooleanTrue];}}}if([self isSupportPropertyWithKey:Key_AllowFrameReordering inArray:propertyArr]) {[self setSessionProperty:session key:kVTCompressionPropertyKey_AllowFrameReordering value:kCFBooleanFalse];}if(g_isSupportRealTimeEncoder) {if([self isSupportPropertyWithKey:Key_ProfileLevel inArray:propertyArr]) {[self setSessionProperty:session key:kVTCompressionPropertyKey_ProfileLevel value:self.enableH264 ? kVTProfileLevel_H264_Main_AutoLevel : kVTProfileLevel_HEVC_Main_AutoLevel];}}else {if([self isSupportPropertyWithKey:Key_ProfileLevel inArray:propertyArr]) {[self setSessionProperty:session key:kVTCompressionPropertyKey_ProfileLevel value:self.enableH264 ? kVTProfileLevel_H264_Baseline_AutoLevel : kVTProfileLevel_HEVC_Main_AutoLevel];}if (self.enableH264) {if([self isSupportPropertyWithKey:Key_H264EntropyMode inArray:propertyArr]) {[self setSessionProperty:session key:kVTCompressionPropertyKey_H264EntropyMode value:kVTH264EntropyMode_CAVLC];}}}if([self isSupportPropertyWithKey:Key_MaxKeyFrameIntervalDuration inArray:propertyArr]) {int value = 1;CFNumberRef ref = CFNumberCreate(NULL, kCFNumberSInt32Type, &value);[self setSessionProperty:session key:kVTCompressionPropertyKey_MaxKeyFrameIntervalDuration value:ref];CFRelease(ref);} } 復(fù)制代碼

上述方法主要設(shè)置啟動(dòng)編碼器所需的各個(gè)參數(shù)

1> kVTCompressionPropertyKey_MaxFrameDelayCount : 壓縮器被允許保持的最大幀數(shù)在輸出一個(gè)壓縮幀之前。例如如果最大幀延遲數(shù)是M,那么在編碼幀N返回的調(diào)用之前,幀N-M必須被排出。

2> kVTCompressionPropertyKey_ExpectedFrameRate : 設(shè)置fps

3> kVTCompressionPropertyKey_AverageBitRate : 它不是強(qiáng)制的限制,bit rate可能會(huì)超出峰值

4> kVTCompressionPropertyKey_RealTime : 設(shè)置編碼器是否實(shí)時(shí)編碼,如果設(shè)置為False則不是實(shí)時(shí)編碼,視頻效果會(huì)更好一點(diǎn)。

5> kVTCompressionPropertyKey_AllowFrameReordering : 是否讓幀進(jìn)行重新排序。為了編碼B幀,編碼器必須對(duì)幀重新排序,這將意味著解碼的順序與顯示的順序不同。將其設(shè)置為false以防止幀重新排序。

6> kVTCompressionPropertyKey_ProfileLevel : 指定編碼比特流的配置文件和級(jí)別

7> kVTCompressionPropertyKey_H264EntropyMode :如果支持h264該屬性設(shè)置編碼器是否應(yīng)該使用基于CAVLC 還是 CABAC

8> kVTCompressionPropertyKey_MaxKeyFrameIntervalDuration : 兩個(gè)I幀之間最大持續(xù)時(shí)間,該屬性特別有用當(dāng)frame rate是可變

  • 相機(jī)回調(diào)中對(duì)每一幀數(shù)據(jù)進(jìn)行編碼
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {if( !CMSampleBufferDataIsReady(sampleBuffer)) {NSLog( @"sample buffer is not ready. Skipping sample" );return;}if([XDXHardwareEncoder getInstance] != NULL) {[[XDXHardwareEncoder getInstance] encode:sampleBuffer];} } 復(fù)制代碼

以上方法在每采集到一幀視頻數(shù)據(jù)后會(huì)調(diào)用一次,我們將拿到的每一幀數(shù)據(jù)進(jìn)行編碼。

  • 編碼具體實(shí)現(xiàn)
-(void)encode:(CMSampleBufferRef)sampleBuffer {if (self.enableH264) {[m_h264_lock lock];if(h264CompressionSession == NULL) {[m_h264_lock unlock];return;}if(initializedH264 == false) {NSLog(@"TVUEncoder : h264 encoder is not ready\n");return;}}if (self.enableH265) {[m_h265_lock lock];if(h265CompressionSession == NULL) {[m_h265_lock unlock];return;}if(initializedH265 == false) {NSLog(@"TVUEncoder : h265 encoder is not ready\n");return;}}CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);CMTime duration = CMSampleBufferGetOutputDuration(sampleBuffer);frameID++;CMTime presentationTimeStamp = CMTimeMake(frameID, 1000);[self doSetBitrate];OSStatus status;VTEncodeInfoFlags flags;if (self.enableH264) {status = VTCompressionSessionEncodeFrame(h264CompressionSession, imageBuffer, presentationTimeStamp, duration, NULL, imageBuffer, &flags);if(status != noErr) NSLog(@"TVUEncoder : H264 VTCompressionSessionEncodeFrame failed");[m_h264_lock unlock];if (status != noErr) {NSLog(@"TVUEncoder : VTCompressionSessionEncodeFrame failed");VTCompressionSessionCompleteFrames(h264CompressionSession, kCMTimeInvalid);VTCompressionSessionInvalidate(h264CompressionSession);CFRelease(h264CompressionSession);h264CompressionSession = NULL;}else {// NSLog(@"TVUEncoder : Success VTCompressionSessionCompleteFrames");}}if (self.enableH265) {status = VTCompressionSessionEncodeFrame(h265CompressionSession, imageBuffer, presentationTimeStamp, duration, NULL, imageBuffer, &flags);if(status != noErr) NSLog(@"TVUEncoder : H265 VTCompressionSessionEncodeFrame failed");[m_h265_lock unlock];if (status != noErr) {NSLog(@"TVUEncoder : VTCompressionSessionEncodeFrame failed");VTCompressionSessionCompleteFrames(h265CompressionSession, kCMTimeInvalid);VTCompressionSessionInvalidate(h265CompressionSession);CFRelease(h265CompressionSession);h265CompressionSession = NULL;}else {NSLog(@"TVUEncoder : Success VTCompressionSessionCompleteFrames");}}} 復(fù)制代碼

1> 通過(guò)frameID的遞增構(gòu)造時(shí)間戳為了使編碼后的每一幀數(shù)據(jù)連續(xù)

2> 設(shè)置最大碼率的限制,注意:H265目前不支持設(shè)置碼率的限制,等待官方后續(xù)通知??梢詫?duì)H264進(jìn)行碼率限制

3> kVTCompressionPropertyKey_DataRateLimits : 將數(shù)據(jù)的bytes和duration封裝到CFMutableArrayRef傳給API進(jìn)行調(diào)用

4> VTCompressionSessionEncodeFrame : 調(diào)用此方法成功后觸發(fā)回調(diào)函數(shù)完成編碼。

  • 回調(diào)函數(shù)中處理頭信息
#pragma mark H264 Callback static void vtCallBack(void *outputCallbackRefCon,void *souceFrameRefCon,OSStatus status,VTEncodeInfoFlags infoFlags, CMSampleBufferRef sampleBuffer) {XDXHardwareEncoder *encoder = (__bridge XDXHardwareEncoder*)outputCallbackRefCon;if(status != noErr) {NSError *error = [NSError errorWithDomain:NSOSStatusErrorDomain code:status userInfo:nil];NSLog(@"H264: vtCallBack failed with %@", error);NSLog(@"XDXHardwareEncoder : encode frame failured! %s" ,error.debugDescription.UTF8String);return;}if (!CMSampleBufferDataIsReady(sampleBuffer)) {NSLog(@"didCompressH265 data is not ready ");return;}if (infoFlags == kVTEncodeInfo_FrameDropped) {NSLog(@"%s with frame dropped.", __FUNCTION__);return;}CMBlockBufferRef block = CMSampleBufferGetDataBuffer(sampleBuffer);BOOL isKeyframe = false;CFArrayRef attachments = CMSampleBufferGetSampleAttachmentsArray(sampleBuffer, false);if(attachments != NULL) {CFDictionaryRef attachment =(CFDictionaryRef)CFArrayGetValueAtIndex(attachments, 0);CFBooleanRef dependsOnOthers = (CFBooleanRef)CFDictionaryGetValue(attachment, kCMSampleAttachmentKey_DependsOnOthers);isKeyframe = (dependsOnOthers == kCFBooleanFalse);}if(isKeyframe) {CMFormatDescriptionRef format = CMSampleBufferGetFormatDescription(sampleBuffer);static uint8_t *spsppsNALBuff = NULL;static size_t spsSize, ppsSize;size_t parmCount;const uint8_t*sps, *pps;int NALUnitHeaderLengthOut;CMVideoFormatDescriptionGetH264ParameterSetAtIndex(format, 0, &sps, &spsSize, &parmCount, &NALUnitHeaderLengthOut );CMVideoFormatDescriptionGetH264ParameterSetAtIndex(format, 1, &pps, &ppsSize, &parmCount, &NALUnitHeaderLengthOut );spsppsNALBuff = (uint8_t*)malloc(spsSize+4+ppsSize+4);memcpy(spsppsNALBuff, "\x00\x00\x00\x01", 4);memcpy(&spsppsNALBuff[4], sps, spsSize);memcpy(&spsppsNALBuff[4+spsSize], "\x00\x00\x00\x01", 4);memcpy(&spsppsNALBuff[4+spsSize+4], pps, ppsSize);NSLog(@"XDXHardwareEncoder : H264 spsSize : %zu, ppsSize : %zu",spsSize, ppsSize);writeFile(spsppsNALBuff,spsSize+4+ppsSize+4,encoder->_videoFile, 200);}size_t blockBufferLength;uint8_t *bufferDataPointer = NULL;CMBlockBufferGetDataPointer(block, 0, NULL, &blockBufferLength, (char **)&bufferDataPointer);size_t bufferOffset = 0;while (bufferOffset < blockBufferLength - startCodeLength) {uint32_t NALUnitLength = 0;memcpy(&NALUnitLength, bufferDataPointer+bufferOffset, startCodeLength);NALUnitLength = CFSwapInt32BigToHost(NALUnitLength);memcpy(bufferDataPointer+bufferOffset, startCode, startCodeLength);bufferOffset += startCodeLength + NALUnitLength;}writeFile(bufferDataPointer, blockBufferLength,encoder->_videoFile, 200); }#pragma mark H265 Callback static void vtH265CallBack(void *outputCallbackRefCon,void *souceFrameRefCon,OSStatus status,VTEncodeInfoFlags infoFlags, CMSampleBufferRef sampleBuffer) {XDXHardwareEncoder *encoder = (__bridge XDXHardwareEncoder*)outputCallbackRefCon;if(status != noErr) {NSError *error = [NSError errorWithDomain:NSOSStatusErrorDomain code:status userInfo:nil];NSLog(@"H264: H265 vtH265CallBack failed with %@", error);NSLog(@"XDXHardwareEncoder : H265 encode frame failured! %s" ,error.debugDescription.UTF8String);return;}if (!CMSampleBufferDataIsReady(sampleBuffer)) {NSLog(@"didCompressH265 data is not ready ");return;}if (infoFlags == kVTEncodeInfo_FrameDropped) {NSLog(@"%s with frame dropped.", __FUNCTION__);return;}CMBlockBufferRef block = CMSampleBufferGetDataBuffer(sampleBuffer);BOOL isKeyframe = false;CFArrayRef attachments = CMSampleBufferGetSampleAttachmentsArray(sampleBuffer, false);if(attachments != NULL) {CFDictionaryRef attachment =(CFDictionaryRef)CFArrayGetValueAtIndex(attachments, 0);CFBooleanRef dependsOnOthers = (CFBooleanRef)CFDictionaryGetValue(attachment, kCMSampleAttachmentKey_DependsOnOthers);isKeyframe = (dependsOnOthers == kCFBooleanFalse);}if(isKeyframe) {CMFormatDescriptionRef format = CMSampleBufferGetFormatDescription(sampleBuffer);static uint8_t *vpsspsppsNALBuff = NULL;static size_t vpsSize, spsSize, ppsSize;size_t parmCount;const uint8_t *vps, *sps, *pps;if (encoder.deviceSupportH265) { // >= iPhone 7 && support ios11CMVideoFormatDescriptionGetHEVCParameterSetAtIndex(format, 0, &vps, &vpsSize, &parmCount, 0);CMVideoFormatDescriptionGetHEVCParameterSetAtIndex(format, 1, &sps, &spsSize, &parmCount, 0);CMVideoFormatDescriptionGetHEVCParameterSetAtIndex(format, 2, &pps, &ppsSize, &parmCount, 0);vpsspsppsNALBuff = (uint8_t*)malloc(vpsSize+4+spsSize+4+ppsSize+4);memcpy(vpsspsppsNALBuff, "\x00\x00\x00\x01", 4);memcpy(&vpsspsppsNALBuff[4], vps, vpsSize);memcpy(&vpsspsppsNALBuff[4+vpsSize], "\x00\x00\x00\x01", 4);memcpy(&vpsspsppsNALBuff[4+vpsSize+4], sps, spsSize);memcpy(&vpsspsppsNALBuff[4+vpsSize+4+spsSize], "\x00\x00\x00\x01", 4);memcpy(&vpsspsppsNALBuff[4+vpsSize+4+spsSize+4], pps, ppsSize);NSLog(@"XDXHardwareEncoder : H265 vpsSize : %zu, spsSize : %zu, ppsSize : %zu",vpsSize,spsSize, ppsSize);}writeFile(vpsspsppsNALBuff, vpsSize+4+spsSize+4+ppsSize+4,encoder->_videoFile, 200);}size_t blockBufferLength;uint8_t *bufferDataPointer = NULL;CMBlockBufferGetDataPointer(block, 0, NULL, &blockBufferLength, (char **)&bufferDataPointer);size_t bufferOffset = 0;while (bufferOffset < blockBufferLength - startCodeLength) {uint32_t NALUnitLength = 0;memcpy(&NALUnitLength, bufferDataPointer+bufferOffset, startCodeLength);NALUnitLength = CFSwapInt32BigToHost(NALUnitLength);memcpy(bufferDataPointer+bufferOffset, startCode, startCodeLength);bufferOffset += startCodeLength + NALUnitLength;}writeFile(bufferDataPointer, blockBufferLength,encoder->_videoFile, 200); } 復(fù)制代碼

1> 首先在回調(diào)函數(shù)中截取到I幀,從I幀中提取到(h265中新增vps),sps,pps信息并寫入文件 2> 遍歷其他幀將頭信息0000,0001寫入每個(gè)頭信息中,再將該數(shù)據(jù)寫入文件即可

二.碼流數(shù)據(jù)結(jié)構(gòu)介紹

這里我們簡(jiǎn)單介紹一下H264,H265碼流信息

  • H264流數(shù)據(jù)是由一系列NAL單元(NAL Unit)組成的。

  • 一個(gè)NALU可能包含:視頻幀,視頻幀也就是視頻片段,具體有I,P,B幀

  • H.264屬性合集-FormatDesc(包含 SPS和PPS)
  • 注意在H265流數(shù)據(jù)中新增vps在最前。

    • H.264屬性合集-FormatDesc(包含 SPS和PPS)

    流數(shù)據(jù)中,屬性集合可能是這樣的:

    經(jīng)過(guò)處理之后,在Format Description中則是:

    • NALU header 對(duì)于流數(shù)據(jù)來(lái)說(shuō),一個(gè)NALU的Header中,可能是0x00 00 01或者是0x00 00 00 01作為開頭(兩者都有可能,下面以0x00 00 01作為例子)。0x00 00 01因此被稱為開始碼(Start code).所以我們需要在提取的數(shù)據(jù)中用0x00 00 00 01對(duì)數(shù)據(jù)內(nèi)容進(jìn)行替換

    總結(jié)以上知識(shí),我們知道H264的碼流由NALU單元組成,NALU單元包含視頻圖像數(shù)據(jù)和H264的參數(shù)信息。其中視頻圖像數(shù)據(jù)就是CMBlockBuffer,而H264的參數(shù)信息則可以組合成FormatDesc。具體來(lái)說(shuō)參數(shù)信息包含SPS(Sequence Parameter Set)和PPS(Picture Parameter Set).如下圖顯示了一個(gè)H.264碼流結(jié)構(gòu):

    • 提取sps和pps生成FormatDesc

      • 每個(gè)NALU的開始碼是0x00 00 01,按照開始碼定位NALU
      • 通過(guò)類型信息找到sps和pps并提取,開始碼后第一個(gè)byte的后5位,7代表sps,8代表pps
      • 使用CMVideoFormatDescriptionCreateFromH264ParameterSets函數(shù)來(lái)構(gòu)建CMVideoFormatDescriptionRef
    • 提取視頻圖像數(shù)據(jù)生成CMBlockBuffer

      • 通過(guò)開始碼,定位到NALU
      • 確定類型為數(shù)據(jù)后,將開始碼替換成NALU的長(zhǎng)度信息(4 Bytes)
      • 使用CMBlockBufferCreateWithMemoryBlock接口構(gòu)造CMBlockBufferRef
    • 根據(jù)需要,生成CMTime信息。(實(shí)際測(cè)試時(shí),加入time信息后,有不穩(wěn)定的圖像,不加入time信息反而沒(méi)有,需要進(jìn)一步研究,這里建議不加入time信息)

    根據(jù)上述得到CMVideoFormatDescriptionRef、CMBlockBufferRef和可選的時(shí)間信息,使用CMSampleBufferCreate接口得到CMSampleBuffer數(shù)據(jù)這個(gè)待解碼的原始的數(shù)據(jù)。如下圖所示的H264數(shù)據(jù)轉(zhuǎn)換示意圖。

    編碼器知識(shí)可參考:H264,H265編碼器介紹

    總結(jié)

    以上是生活随笔為你收集整理的iOS H264,H265视频编码(Video encode)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    97超碰.com| 欧美一级视频免费看 | 狠狠色综合网站久久久久久久 | 免费黄色在线播放 | 国产 一区二区三区 在线 | 一区二区不卡视频在线观看 | 国精产品999国精产品视频 | 成人在线免费小视频 | 国产明星视频三级a三级点| 久久精品国产精品亚洲 | 国产精品成人国产乱 | 免费a视频 | 久久在线免费 | 99久久er热在这里只有精品66 | 在线观看视频一区二区 | 在线免费观看黄色大片 | 国产成人一区二 | 国产夫妻av在线 | 中文字幕视频一区二区 | 中文字幕在线观看完整版电影 | 岛国一区在线 | 天天干夜夜干 | 97成人精品 | 国产字幕在线看 | 久久精品久久99精品久久 | 在线观看视频精品 | 日韩欧美综合精品 | 九九99| 亚洲国产中文字幕在线观看 | 国产黄色一级大片 | 国产 视频 高清 免费 | 狠狠躁18三区二区一区ai明星 | 四虎影视国产精品免费久久 | 国产一级二级在线观看 | 精品一区二区在线免费观看 | 97av超碰| 色网免费观看 | 亚洲精品在线电影 | 在线视频手机国产 | 一区二区视频免费在线观看 | av一二三区 | 国产免费成人av | 免费在线电影网址大全 | 99国产精品免费网站 | 欧美一区二区伦理片 | 色五丁香 | 亚洲国产精品久久久久 | 国产小视频在线观看免费 | 99r精品视频在线观看 | 成人免费视频在线观看 | 日本中文字幕电影在线免费观看 | 99精品成人 | 最近中文字幕国语免费高清6 | 色综合天天狠狠 | 精品毛片在线 | 一区二区三区四区精品 | 亚洲午夜久久久综合37日本 | 99国产精品久久久久老师 | 正在播放亚洲精品 | 91香蕉嫩草| 亚洲九九影院 | 超碰人人乐 | 热精品 | 日韩精品一区二区三区免费视频观看 | 在线天堂中文在线资源网 | 久热精品国产 | 欧美性生活大片 | 99精品国产一区二区 | 91精品对白一区国产伦 | 亚洲涩涩涩 | 日本一区二区免费在线观看 | 91精品国产一区二区三区 | 欧美一级专区免费大片 | 免费在线观看av | 99在线免费视频 | 久久久在线观看 | 精品v亚洲v欧美v高清v | 四虎影视8848aamm | 99re视频在线观看 | 免费黄色a网站 | 国产一级在线播放 | 日韩精品一区二区在线观看视频 | 日韩精品在线观看av | 国产视频二区三区 | 欧美精品一区在线发布 | 日韩一区在线免费观看 | 综合网伊人 | 免费一级日韩欧美性大片 | 国产精品24小时在线观看 | 久久这里只有精品首页 | 在线看黄色av | 亚洲美女免费精品视频在线观看 | 国产一区二区综合 | 麻豆视频在线免费看 | 蜜臀久久99精品久久久酒店新书 | 免费一级片在线观看 | 亚洲国产精品va在线看 | 久久中文字幕在线视频 | 日日夜夜骑 | 亚洲综合成人专区片 | 狠狠激情中文字幕 | 成人一区二区三区在线观看 | 日韩三级视频在线看 | 久久精品999 | 999免费视频 | 精品字幕 | 国产三级在线播放 | 一本—道久久a久久精品蜜桃 | 国产不卡精品 | 激情婷婷久久 | 色九九在线 | 99r国产精品 | 久久系列| 狠狠操.com | 天天在线免费视频 | 中文字幕在线一二 | 国产xx在线 | 中文字幕国语官网在线视频 | 国产精品99久久久精品免费观看 | 欧美国产日韩在线视频 | 久久久精品国产免费观看一区二区 | 91视频在线自拍 | 久久中文精品视频 | 91看片在线播放 | 国产资源网 | 国产精品女人网站 | 久久视影 | 日本狠狠色| 国产色秀视频 | 国产精品二区在线 | 国产精品美女久久久久久2018 | 91看片在线播放 | 亚洲少妇激情 | 国产视频首页 | 久久特级毛片 | 国产玖玖在线 | 精品国产免费一区二区三区五区 | 久久99精品久久久久久 | 一级黄色在线视频 | 成人av资源 | 天天拍天天色 | 91在线欧美| 国产精品激情偷乱一区二区∴ | 久久艹艹| 国产日韩在线一区 | 91精品综合在线观看 | 久久电影日韩 | 国产免费美女 | 国产精品久久电影网 | 波多野结衣精品 | 欧美精品黑人性xxxx | 亚洲aⅴ乱码精品成人区 | 国产青春久久久国产毛片 | wwxxx日本| 欧美久久久影院 | 亚洲精品电影在线 | 免费麻豆网站 | 日本精品视频在线 | 日韩91精品| 亚洲日本国产精品 | 欧美孕交vivoestv另类 | 亚洲午夜小视频 | 丁香午夜婷婷 | 日韩区在线观看 | 国产国产人免费人成免费视频 | 超碰在线最新地址 | 四虎影视精品永久在线观看 | 国产人成看黄久久久久久久久 | 在线亚洲午夜片av大片 | 国产男女无遮挡猛进猛出在线观看 | 成人影音av | 日韩精品视频在线观看网址 | 91综合在线| 91亚洲精品在线观看 | 激情五月播播久久久精品 | 狠狠狠狠狠操 | 日韩欧美高清一区二区 | 天天躁日日| 91在线免费公开视频 | 色综合久久88色综合天天6 | 天天激情综合网 | 91高清在线| 色婷婷av国产精品 | 精品国产一区二区三区在线 | 久久论理| 色婷婷成人网 | 国产精品永久免费观看 | 99久久精品国产一区 | 天天做日日爱夜夜爽 | 午夜国产一区 | 国产精品美女久久久久aⅴ 干干夜夜 | 久久久久免费 | 国产精品久久久久久久久久久久 | 天天射天天干天天插 | 天天操狠狠操夜夜操 | 探花视频网站 | 久久爱综合| 亚洲成人一区 | 97夜夜澡人人爽人人免费 | 国产乱码精品一区二区蜜臀 | 精品久久久久久国产偷窥 | 久草在线视频首页 | 国产综合在线视频 | 一区 二区 精品 | 国产一区二区三区免费在线 | 亚洲国产中文字幕在线观看 | 99九九热只有国产精品 | 天天射天天干天天插 | 国产一级视频 | 国产手机在线观看视频 | 夜夜躁狠狠躁日日躁视频黑人 | 国产美女网站在线观看 | 中文字幕一区二区在线播放 | 成人免费一区二区三区在线观看 | 五月婷婷久草 | 久久蜜臀一区二区三区av | 久久精品视频在线看 | 伊人五月天 | 最近日本韩国中文字幕 | 色婷婷激情四射 | 久久不卡国产精品一区二区 | 国产aaa大片 | 99热精品久久 | 国产特级毛片aaaaaa高清 | 欧美日韩三区二区 | www黄色| 在线观看福利网站 | 国产精品a成v人在线播放 | 99精品在线直播 | 亚洲天堂激情 | 免费观看高清 | 精品96久久久久久中文字幕无 | 亚洲女在线 | www.国产在线观看 | 成人国产精品一区 | 中文字幕大全 | 亚洲国产精品日韩 | 色在线观看网站 | 黄色精品视频 | 亚洲最大免费成人网 | 久久污视频 | 蜜桃av久久久亚洲精品 | 亚洲精品自在在线观看 | 五月婷婷综合色拍 | 久久综合久久综合九色 | 99久久一区 | 豆豆色资源网xfplay | 久久久国产精品麻豆 | 中文字幕亚洲精品日韩 | 日韩美女黄色片 | 在线观看免费 | 国产免费三级在线观看 | 色中色综合 | www日日夜夜 | 久久香蕉国产 | 国产精品视频不卡 | av福利在线播放 | 伊人久久精品久久亚洲一区 | 久草免费在线观看视频 | 日韩中字在线 | 超碰免费av | 亚洲一区二区麻豆 | 成人欧美一区二区三区在线观看 | 精品久久美女 | 91激情小视频 | 国产精品自产拍在线观看桃花 | 亚洲激情校园春色 | 国产精品h在线观看 | 国产精品视频在线观看 | 麻豆av电影 | av中文字幕第一页 | 人人狠狠综合久久亚洲婷 | 中文字幕婷婷 | 成人精品在线 | 亚洲 欧美 另类人妖 | 一区二区视频播放 | 国产麻豆成人传媒免费观看 | 97在线观 | 五月开心六月婷婷 | 午夜私人影院久久久久 | 国产玖玖在线 | 欧美激情综合色 | 欧美一级片在线免费观看 | 91精品国自产在线观看欧美 | www.99av| 91精品国自产拍天天拍 | 国产原创在线观看 | 天天碰天天操视频 | 女人18毛片90分钟 | 日日操日日 | 亚洲成人黄色网址 | 国产黄色特级片 | 日日弄天天弄美女bbbb | 久久久精品网站 | japanese黑人亚洲人4k | 亚洲日本国产精品 | 中文字幕一区二区三区乱码不卡 | 欧美精品一区二区在线播放 | 综合网五月天 | 日韩在线国产精品 | av亚洲产国偷v产偷v自拍小说 | 在线看片中文字幕 | 国产视频精品久久 | 在线播放亚洲激情 | 久产久精国产品 | 色婷婷www| 九九99| www91在线观看 | 午夜视频在线观看一区二区 | 久草在线视频精品 | 成人一区二区在线 | 在线欧美最极品的av | 久久国产午夜精品理论片最新版本 | 亚洲va天堂va欧美ⅴa在线 | av天天草 | 亚洲精品国产精品乱码不99热 | 久久男人免费视频 | 五月天中文在线 | 欧美日韩视频在线观看一区二区 | 日韩av电影网站在线观看 | 国产69精品久久久久99尤 | av手机在线播放 | 国产 视频 久久 | 成人免费看片网址 | 精品国产网址 | 亚洲伊人网在线观看 | 国产黄色播放 | 亚洲精品在线资源 | 国产精品女 | 丝袜精品视频 | 亚洲精品午夜久久久 | 美女久久久久久久 | 国产无吗一区二区三区在线欢 | 亚洲欧美日韩国产一区二区 | 免费av片在线 | 全久久久久久久久久久电影 | 中文字幕中文中文字幕 | 中文字幕亚洲精品日韩 | 99人成在线观看视频 | 91av在线播放视频 | 久草色在线观看 | 99久久99久久综合 | 国产黄色一级片 | 亚洲一片黄 | 天天干天天操天天 | 精品国产乱码久久久久久三级人 | 精品国产一区二区三区久久影院 | 精品久久久久久国产偷窥 | 久久这里有 | 91免费国产在线观看 | 亚洲区色| 综合精品久久 | 亚洲免费资源 | 国产成人精品不卡 | 日韩欧美高清在线观看 | 久久国产精品一区二区 | 国产精品久久久久久久久搜平片 | 日韩二区三区在线观看 | 国产高清在线一区 | 亚洲精品国产精品国自 | 久久久久久影视 | 久久视频中文字幕 | 丁香婷婷激情啪啪 | 亚洲久草在线视频 | 黄色资源在线观看 | 国产h在线观看 | 91精品国产九九九久久久亚洲 | 精品久久久久久亚洲综合网 | 福利片视频区 | 国产 欧美 日本 | 激情综合久久 | 国产日产精品一区二区三区四区 | 亚洲爱爱视频 | 国产一区二区三区四区在线 | 免费看国产曰批40分钟 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 欧美性色黄 | 国产精品久久亚洲 | 国产精品久久久久亚洲影视 | 97视频一区 | 狠狠狠干 | 黄色免费看片网站 | 99精品亚洲 | 一区二区三区免费在线观看视频 | 免费 在线 中文 日本 | 午夜骚影 | 日本中文字幕在线播放 | 日韩二区三区在线 | 国产一卡二卡四卡国 | 中文字幕一区2区3区 | 五月婷婷av在线 | www黄色av | 久久免费精品 | 午夜色婷婷 | 亚洲性xxxx | 天天综合亚洲 | 成人一级片在线观看 | 日韩精品久久久久久久电影99爱 | 欧美日韩激情视频8区 | 国产成在线观看免费视频 | 国产免费一区二区三区网站免费 | 久久爱影视i | 欧美国产日韩一区二区三区 | www婷婷 | 欧美特一级| 99精品在线视频播放 | 国产经典 欧美精品 | 日韩视频免费观看高清完整版在线 | 黄色一级免费电影 | 又黄又网站 | 在线观看国产成人av片 | 国产h在线播放 | 欧美精品久久久久久久久久丰满 | 久久精品这里都是精品 | 欧美在线free | 中文字幕首页 | 欧美日韩国产高清视频 | 日本精品久久久一区二区三区 | 91亚洲网站| 韩国精品一区二区三区六区色诱 | 国产又粗又硬又爽视频 | 亚洲精品在 | 国产999精品久久久 免费a网站 | 女人18精品一区二区三区 | 丝袜网站在线观看 | 日韩在线第一 | 毛片一级免费一级 | 色综合天天综合网国产成人网 | 最近中文字幕国语免费高清6 | 国产日产欧美在线观看 | 欧美久久久久久久久久久 | 色是在线视频 | 午夜久久福利视频 | 国产亚洲va综合人人澡精品 | 国产精品日韩久久久久 | 久久免费看 | 日韩欧美一区二区三区黑寡妇 | 午夜美女福利直播 | 欧美性久久久久久 | 日韩二区在线播放 | 国产一级二级在线播放 | 亚洲精品白浆高清久久久久久 | 99久久久久久久久 | 国产字幕在线观看 | 天天伊人狠狠 | av成人免费在线观看 | 天堂在线成人 | 又爽又黄在线观看 | 手机成人av在线 | 免费av一级电影 | 国产精品破处视频 | 91毛片在线 | 欧美久久精品 | 久久久综合 | 91免费的视频在线播放 | 99在线视频网站 | 欧美激情在线看 | 少妇自拍av | 91专区在线观看 | 波多野结衣电影一区二区三区 | 黄色毛片视频免费 | 97在线观看视频免费 | 夜夜躁日日躁 | 一区二区三区免费在线 | 天天射天天爱天天干 | 99视频在线看| 狠狠色丁香婷综合久久 | 国产午夜精品久久 | 免费看黄网站在线 | 在线观看亚洲电影 | 亚洲人成网站精品片在线观看 | 久久8精品| 亚洲精品中文字幕视频 | 国内精品福利视频 | 手机在线欧美 | 久久中文字幕视频 | 日韩精品偷拍 | 国产精品青青 | 免费看的黄色小视频 | 精品专区一区二区 | 天天狠狠 | 三级大片网站 | 欧美日韩激情视频8区 | 国产一区在线播放 | 四川bbb搡bbb爽爽视频 | 亚洲第一色| 在线蜜桃视频 | 一本一本久久a久久 | 国产精品日韩久久久久 | 天天爱天天操 | 中文av影院 | 欧美另类xxx | 人人干人人草 | aaa毛片视频 | 色999视频 | 国产精品露脸在线 | 国产伦精品一区二区三区照片91 | 日韩免费在线看 | 日韩二三区 | 免费在线观看视频a | 天天综合网入口 | 青青河边草手机免费 | 国产一区二区免费 | 国产精品一区二区三区电影 | 91精品成人久久 | 欧美网址在线观看 | 人人精久| 日韩高清在线一区二区三区 | 国产一卡久久电影永久 | 激情片av| 国产成人福利片 | 国产精品视频99 | 国产伦精品一区二区三区照片91 | 在线观看免费中文字幕 | 国产伦精品一区二区三区照片91 | 日韩免费在线观看视频 | 99久久久国产免费 | 91传媒免费观看 | 99热这里只有精品国产首页 | 免费欧美高清视频 | 日韩av电影免费观看 | 国产精品久久嫩一区二区免费 | 国产亚洲精品久久 | 精选久久 | 免费a一级 | 久久精品视频3 | 久久久网 | 国产五月天婷婷 | 91观看视频 | 日韩视频一区二区三区在线播放免费观看 | av中文字幕电影 | 99这里只有久久精品视频 | 日韩videos | 69国产成人综合久久精品欧美 | 久久亚洲电影 | 精品视频久久 | 成人黄色片在线播放 | 中文字幕在线一二 | 日韩欧美在线综合网 | 天天色天天操天天爽 | 99九九热只有国产精品 | 国产高清av| 三级黄色大片在线观看 | 欧美三级高清 | 久久精品香蕉视频 | 欧美日韩国产精品一区二区亚洲 | 色综合久久66 | 婷婷综合av| 久久av中文字幕片 | 免费视频网| 日韩一区二区三区不卡 | 欧美日韩在线免费视频 | 超碰国产人人 | 波多野结衣资源 | 中文字幕五区 | 一级黄色片在线免费观看 | 欧美专区日韩专区 | 麻豆免费在线播放 | 婷婷色网 | 91视频3p | 亚洲精品va | 日韩一级理论片 | 亚洲免费永久精品国产 | 伊人婷婷综合 | 国产麻豆电影 | 亚洲三级网 | 亚洲区另类春色综合小说 | 天天天在线综合网 | 草久久久久久久 | 色综合天天爱 | 最近最新中文字幕 | 国产精品淫 | 91久久人澡人人添人人爽欧美 | 国产精品久久久久久久午夜 | 日韩久久一区二区 | 视频在线观看91 | 91污污 | 精品不卡视频 | 又色又爽又黄高潮的免费视频 | 久草免费福利在线观看 | 国产最新在线视频 | 国产精品成人一区二区 | 国产成人a亚洲精品 | 久免费 | 麻花天美星空视频 | 日本视频网 | 美女av电影 | 超碰在线日韩 | 麻豆精品视频在线观看免费 | 激情av一区二区 | 亚洲国产精久久久久久久 | 在线观看一级片 | 免费视频色 | 玖玖视频在线 | 麻豆传媒视频观看 | 免费国产一区二区视频 | 久久久国产毛片 | 国产三级午夜理伦三级 | 国产精品theporn | 久久久九色精品国产一区二区三区 | 91中文字幕在线观看 | 日韩午夜剧场 | 麻豆视频免费在线播放 | 国产午夜精品久久久久久久久久 | 国产精品第一页在线观看 | 国产精品mv | 一色屋精品视频在线观看 | 亚洲专区视频在线观看 | 中文av网| 免费看片成人 | 免费69视频| 免费视频成人 | 国产91aaa| 国产婷婷精品av在线 | 日韩视频免费观看高清 | 国产视频精品在线 | 国产麻豆果冻传媒在线观看 | 在线观看免费视频你懂的 | 99电影456麻豆 | 午夜精品一区二区三区在线视频 | 国产va饥渴难耐女保洁员在线观看 | 五月天婷婷综合 | 麻豆传媒在线视频 | 久久视频免费 | 经典三级一区 | 国产精品色| 亚洲毛片一区二区三区 | 日韩欧美精品在线观看视频 | 超碰精品在线 | 毛片久久久 | 欧洲黄色片| 九九热99视频 | av永久网址 | 精品一二区| 超碰在线公开 | 久草在线视频在线观看 | 又色又爽又黄高潮的免费视频 | 日韩理论片中文字幕 | 五月婷婷影院 | 欧美日韩一区二区视频在线观看 | 色综合www | 国产九九在线 | 激情av在线播放 | 麻豆久久一区 | 香蕉视频免费在线播放 | 99精品99 | 最近中文字幕在线中文高清版 | 中文字幕在线观看完整版 | av福利电影| 国产69久久精品成人看 | 久久久久五月天 | 丁香高清视频在线看看 | 99电影| 国产精品一区二区av | 在线观看免费成人av | 日韩成人精品一区二区 | 中文电影网 | 亚洲va欧洲va国产va不卡 | 久久久在线视频 | 麻豆视频免费入口 | 成人av免费在线播放 | 国产一区二区三区免费在线 | 99综合影院在线 | 国产精品一区二区果冻传媒 | 久久精品一级片 | 99久久精 | 69中文字幕| 欧美国产亚洲精品久久久8v | 亚洲视频h | 欧美一级欧美一级 | 丁香花在线视频观看免费 | 亚洲精品国产日韩 | 国产成人免费高清 | 一级黄色片在线免费观看 | 亚洲综合色丁香婷婷六月图片 | 国产一区不卡在线 | 国产精品久久久久久久免费 | av黄色在线 | 操操日日 | 欧美在线观看视频 | 色婷婷综合久久久久 | 国产成人精品一区二区三区网站观看 | 另类五月激情 | 中文永久免费观看 | 综合中文字幕 | 午夜丁香视频在线观看 | 亚洲综合最新在线 | 狠狠狠综合 | 麻豆久久 | 午夜精品久久久99热福利 | 国产成人av | 六月天综合网 | 久久久久欠精品国产毛片国产毛生 | 亚洲精品国产综合99久久夜夜嗨 | 国产手机视频精品 | 免费一级黄色 | 日韩av高潮| 国产69精品久久久久久久久久 | 最新中文字幕在线观看视频 | 国产高清视频网 | 丁香婷婷深情五月亚洲 | 91成人网在线观看 | 亚洲精品午夜视频 | 午夜视频色| 日韩av一卡二卡三卡 | 天天干视频在线 | 国产亚洲精品女人久久久久久 | 亚洲精品成人av在线 | 在线影院av| 欧美日高清视频 | 中文字幕美女免费在线 | 国产精品福利一区 | 99久久精品一区二区成人 | 亚洲一级片 | 五月婷婷在线视频观看 | 国产又粗又猛又色又黄视频 | 亚洲视频精品在线 | 亚洲a网| av成年人电影 | 久久精品99久久久久久 | 国产欧美在线一区 | 香蕉视频在线网站 | 99在线视频播放 | 色噜噜日韩精品一区二区三区视频 | 国内一区二区视频 | 麻豆视频免费播放 | 伊人影院得得 | 亚州精品在线视频 | av色一区| 日韩精品亚洲专区在线观看 | 成人h在线 | 成人午夜剧场在线观看 | 成人免费xxxxxx视频 | 成人毛片一区 | 美女国产网站 | 国产在线自 | 日韩一二区在线观看 | 丝袜美腿在线播放 | 成人播放器 | 国产九色视频在线观看 | 91在线porny国产在线看 | 天天操一操 | 91看国产| 国内小视频在线观看 | 免费看一及片 | 精品久久99| 久久久黄色免费网站 | 人人插人人看 | 免费裸体视频网 | 日韩婷婷| 精品资源在线 | 国内丰满少妇猛烈精品播 | 日韩一区视频在线 | 天天色天| 在线播放视频一区 | 久久99久久久久久 | 麻豆成人在线观看 | 国产精品视频免费看 | 香蕉视频国产在线 | 日韩av中文在线 | 国产亚洲精品久久久久动 | 韩国精品福利一区二区三区 | 亚洲专区中文字幕 | 99 精品 在线 | 在线看一区 | 一本一本久久a久久精品综合 | 在线播放国产精品 | 狠狠色丁香久久婷婷综合丁香 | 日韩毛片在线播放 | 中文字幕一区二区三区四区在线视频 | 又黄又爽又色无遮挡免费 | 亚洲国产精品电影 | 亚洲春色综合另类校园电影 | 国产成人精品久久久久 | 日韩欧美精品在线 | 97超碰免费在线 | 少妇bbbb揉bbbb日本 | 色综合久久久久久久 | 国产精品资源在线观看 | 婷婷九月激情 | 日韩久久在线 | 正在播放国产精品 | 国产在线国偷精品产拍 | 水蜜桃亚洲一二三四在线 | 久久久国产精品久久久 | 国产一区二区高清视频 | 网站在线观看你们懂的 | 黄色三级免费 | 国产精品videossex国产高清 | 亚洲综合在线播放 | 99视频在线免费看 | 久久伊人综合 | 日韩视频a | 国产视频在 | 国产涩图 | 国产 字幕 制服 中文 在线 | 久热免费在线观看 | 国产精品无| 91手机电视 | 99精品视频在线播放观看 | 日韩一二区在线观看 | 日韩免费视频播放 | 成人久久亚洲 | 999久久国产 | 天天操夜夜操天天射 | 亚洲一级黄色片 | 色激情五月 | 亚洲 欧美变态 另类 综合 | 国产一区不卡在线 | 丁香激情综合久久伊人久久 | 久久香蕉国产精品麻豆粉嫩av | 亚洲另类在线视频 | 亚洲精品在线一区二区 | 视频高清 | 日韩欧美视频免费看 | 亚洲精品无 | 国产成人精品一区二区三区福利 | 久久国产91 | 亚洲精品久久久久久久不卡四虎 | 黄色大全视频 | 激情五月婷婷 | 日韩在线视频免费播放 | 97精品国产97久久久久久免费 | 91在线影院 | 国产黄色电影 | 黄色www在线观看 | 免费视频黄 | 成人毛片在线观看视频 | 欧美精品一区二区性色 | 成人av在线看 | 日韩电影在线看 | 久久综合色播五月 | 国产一区视频在线观看免费 | 在线观看岛国av | 片网址 | 在线视频麻豆 | 免费在线激情电影 | 最近中文字幕完整视频高清1 | 婷婷精品 | 欧美美女视频在线观看 | 超碰999| 久久看视频| 免费视频久久久 | 在线 视频 亚洲 | 一区二区三区免费在线观看视频 | 日韩欧美专区 | 国产一区二区网址 | 成人在线观看日韩 | www.久草.com| 91福利视频免费 | 欧美日韩精品在线观看视频 | 91av在线免费| 精品在线观看国产 | 国产亚洲精品久久久久久久久久 | 国产精品一码二码三码在线 | 久久精品国产一区二区电影 | 久久免费精品一区二区三区 | 天天天干天天射天天天操 | 看av在线| 久久久国产精品视频 | 久久精品国产亚洲 | 日本一区二区三区免费观看 | 亚洲国产日本 | 国产视频一区在线 | 中文字幕在线国产精品 | 99热9 | 九九九九精品九九九九 | 在线播放av网址 | 玖玖在线免费视频 | 色综合天天狠狠 | 亚洲精品国偷拍自产在线观看蜜桃 | 欧美日韩一区二区三区在线观看视频 | 国产福利91精品一区 | 三级在线国产 | 伊人丁香| 五月综合激情 | 十八岁以下禁止观看的1000个网站 | 久久久久成 | 日本精品视频在线观看 | 国产伦理精品一区二区 | 色欧美日韩| 中文字幕乱在线伦视频中文字幕乱码在线 | 日韩在线不卡视频 | 色视频网站在线 | 日韩v在线 | 色综合人人| 国产中文字幕视频在线观看 | 日韩成人精品一区二区三区 | 国产在线观看a | 2019天天干天天色 | 婷婷中文字幕在线观看 | 成人午夜久久 | 99久久www | 麻豆视频免费在线观看 | 亚洲精品在线观 | 成人精品一区二区三区电影免费 | 国产成人精品一区二区三区网站观看 | 久久免费av电影 | 日韩一二区在线 | 亚洲国产欧美在线人成大黄瓜 | 国产91精品欧美 | 日韩久久久 | 不卡av电影在线观看 | 欧美日韩国产亚洲乱码字幕 | 日韩最新在线视频 | 久久99精品久久久久蜜臀 | 成人va天堂 | 婷婷日日 | 香蕉在线影院 | 在线之家免费在线观看电影 | www.色婷婷 | 精品一区精品二区 | 中文字幕影片免费在线观看 | 91成人在线网站 | 91超在线 | 成人福利av | 国产成人久久精品亚洲 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 亚洲精品91天天久久人人 | 日韩v欧美v日本v亚洲v国产v | 免费在线观看一区二区三区 | 欧美综合在线观看 | 午夜精品影院 | 五月天婷婷在线视频 | 国产原创91 | 黄色免费网战 | 在线欧美日韩 | 国产色视频一区二区三区qq号 | 91大神电影| 日韩精品久久久免费观看夜色 | 国产夫妻性生活自拍 | 午夜国产福利在线观看 | 中文字幕乱码在线播放 | 精品中文字幕在线 | 精品久久国产一区 | 91免费国产在线观看 | 天天干天天操av | 日韩欧美在线观看一区二区三区 | 超碰人人草 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 手机av在线免费观看 | 亚洲精品在线播放视频 | 国产视频2021 | av电影一区二区 | 成年人视频在线观看免费 | 久久久久一区二区三区四区 | 91视频观看免费 | 日韩电影一区二区三区 | 精品久久久久国产免费第一页 | 91视频在线自拍 | 丝袜美腿亚洲综合 | 国产精品久久嫩一区二区免费 | 婷婷久久网 | 国产视频每日更新 | 狠狠ri| 国产乱码精品一区二区三区介绍 | 日本精品二区 | 日韩电影中文 | 天天躁日日躁狠狠躁av中文 | 97视频免费在线观看 | 操操操日日日 | 久草av在线播放 | 2021国产在线视频 | 狠狠干夜夜爱 | 国产美女精品 | 韩国精品福利一区二区三区 | 中文字幕在线观看免费高清电影 | 很污的网站 | 在线中文字幕电影 | 欧美成人在线免费观看 | 国产一线二线三线性视频 | 日本黄色免费播放 | www.狠狠| 国产精品女同一区二区三区久久夜 | 日韩精品一区二区在线 | 久草影视在线 | 婷婷丁香综合 | 免费精品在线 | 日日日操操 | 超碰精品在线观看 | 国产一区二区高清不卡 | 久精品视频免费观看2 | 国产视频在线观看一区二区 | 成人一级片在线观看 | 亚洲视频免费在线看 | 91av网站在线观看 | 欧洲亚洲国产视频 | 99久精品视频 | 亚洲午夜久久久综合37日本 | 99精品亚洲 | 欧美性极品xxxx做受 | 中中文字幕av在线 | 久久超碰网 | 久草免费在线观看视频 | 黄色电影网站在线观看 | 91黄色影视 | 四虎在线免费 | 久久伊人综合 |