【iOS】控制元件截圖、MP4格式視訊流和m3u8格式視訊流擷取某一幀功能的實現
最近開發遇到一個點選按鈕實現直播視訊流截圖的功能,去網上查了一下資料,總結了一下iOS中截圖相關的知識,然後自己做了個demo。
demo主要實現了3種截圖方法,分別對應三種不同的應用場景。
1、imageView截圖,這個截圖方法可以用來實現擷取專案中的控制元件,可擷取的控制元件可包括UIImageView、UIView等。截圖方法如下:
-(UIImage *)screenshotsWithView:(UIView *)view{
UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, 0.0);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
2、MP4格式的視訊流截圖,即獲取MP4格式視訊流中的某一幀。擷取方法如下:
-(UIImage *)screenshotsMP4WithCurrentTime:(CMTime)currentTime videoUrl:(NSString *)url{
AVURLAsset * asset = [[AVURLAsset alloc] initWithURL:[NSURL URLWithString:url] options:nil];
AVAssetImageGenerator * gen = [[AVAssetImageGenerator alloc] initWithAsset:asset];
gen.appliesPreferredTrackTransform = YES;
gen.requestedTimeToleranceAfter = kCMTimeZero;
gen.requestedTimeToleranceBefore = kCMTimeZero;
CMTime time = CMTimeMakeWithSeconds(CMTimeGetSeconds(currentTime), 600);
NSError * error = nil;
CMTime actualTime;
CGImageRef imageRef = [gen copyCGImageAtTime:time actualTime:&actualTime error:&error];
UIImage * image = [[UIImage alloc] initWithCGImage:imageRef];
return image;
}
這個方法是不是僅限於MP4格式的視訊我不是很清楚,但是可以確定的是,MP4擷取某一幀的方法不適用於m3u8格式的視訊流。
3、m3u8格式視訊流截圖。方法如下:
-(UIImage *)screenshotsm3u8WithCurrentTime:(CMTime)currentTime playerItemVideoOutput:(AVPlayerItemVideoOutput *)output{
CVPixelBufferRef pixelBuffer = [output copyPixelBufferForItemTime:currentTime itemTimeForDisplay:nil];
CIImage *ciImage = [CIImage imageWithCVPixelBuffer:pixelBuffer];
CIContext *temporaryContext = [CIContext contextWithOptions:nil];
CGImageRef videoImage = [temporaryContext createCGImage:ciImage
fromRect:CGRectMake(0, 0,
CVPixelBufferGetWidth(pixelBuffer),
CVPixelBufferGetHeight(pixelBuffer))];
UIImage *frameImg = [UIImage imageWithCGImage:videoImage];
CGImageRelease(videoImage);
CVBufferRelease(pixelBuffer);
return frameImg;
}
需要特別指出來的那兩個release方法,不呼叫的話會造成記憶體洩漏(可用Instruments除錯)。
另外還有一點需要注意,m3u8格式的視訊流在擷取時需要傳入一個AVPlayerItemVideoOutput物件,這個物件一定要在AVPlayerItem初始化的時候設定好,如果以臨時變數的形式傳入或導致擷取失敗。
在截圖事件裡直接呼叫以上方法即可獲取到擷取的image。demo連結地址:https://github.com/zhanqin/screenshots
相關文章
- wasm + ffmpeg實現前端擷取視訊幀功能ASM前端
- vue 擷取視訊第一幀Vue
- js實現視訊截圖,視訊批量截圖,canvas實現JSCanvas
- iOS M3U8格式視訊的下載以及播放iOS
- Chrome無法播放m3u8格式的直播視訊流的問題解決Chrome
- Ffmpeg視訊開發教程(一)——實現視訊格式轉換功能超詳細版
- 短視訊平臺搭建,指定視訊中的某一幀做為視訊的封面
- 音視訊通訊——直播協議和視訊推流協議
- 前端獲取視訊編碼格式前端
- iOS視訊流採集概述(AVCaptureSession)iOSAPTSession
- NGINX如何實現rtmp推流服務--視訊快取Nginx快取
- 多檔案斷點續傳,上傳視訊自動轉MP4和截圖,圖片格式轉換斷點
- ffmpeg+Python實現B站MP4格式音訊與視訊的合併Python音訊
- php ffmpeg 視訊擷取PHP
- 使用JavaCV實現讀取視訊資訊及自動擷取封面圖Java
- iOS整合FFmpeg及視訊格式轉碼iOS
- Vue+Video.js播放m3u8視訊流VueIDEJS
- iOS學習:AVFoundation 視訊流處理iOS
- iOS視訊邊下邊播–快取播放資料流iOS快取
- iOS 視訊 轉碼MP4 /視訊裁剪 /上傳iOS
- iOS 獲取視訊圖片iOS
- Premiere cs6匯出MP4格式視訊REM
- 用Flask實現視訊資料流傳輸Flask
- Android 獲取視訊某一幀,並且設定為封面Android
- 視訊直播技術之iOS端推流iOS
- [譯] 再看 Flask 視訊流Flask
- iOS開發 iOS整合FFmpeg及視訊格式轉碼iOS
- 如何在視訊中擷取到高清的畫面並轉換為圖片的格式
- win10轉換視訊格式的方法_win10怎麼改視訊格式Win10
- iOS 線上視訊生成GIF圖功能iOS
- 全能的視訊格式轉換工具
- mp4視訊格式是什麼 mp4檔案播放不了怎麼辦
- VP8視訊格式初探
- iOS 視訊直播與錄播拉流框架2.0iOS框架
- 用MediaCodec實現多段視音訊的擷取與拼接音訊
- 圖片視訊瀑布流長列表效能優化實踐優化
- vue使用video.js解決m3u8視訊播放格式VueIDEJS
- 使用python 下載m3u8格式視訊,併合成Python