我有一个应用程序,允许用户录制视频,UIImagePickerController然后将其上传到YouTube.问题是UIImagePickerController创建的视频文件是巨大的,即使视频只有5秒长.例如,5秒长的视频是16-20兆字节.我想保持540或720质量的视频,但我想减少文件大小.
我一直在尝试AVFoundation并AVAssetExportSession试图获得更小的文件大小.我试过以下代码:
AVAsset *video = [AVAsset assetWithURL:videoURL];
AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:video presetName:AVAssetExportPresetPassthrough];
exportSession.shouldOptimizeForNetworkUse = YES;
exportSession.outputFileType = AVFileTypeMPEG4;
exportSession.outputURL = [pathToSavedVideosDirectory URLByAppendingPathComponent:@"vid1.mp4"];
[exportSession exportAsynchronouslyWithCompletionHandler:^{
NSLog(@"done processing video!");
}];
Run Code Online (Sandbox Code Playgroud)
但这并没有减少文件大小.我知道我正在做的事情是可能的,因为在Apple的照片应用程序中,当您选择"在YouTube上分享"时,会自动处理视频文件,因此它的小到可以上传.我想在我的应用程序中做同样的事情.
我怎么能做到这一点?
在录制视频之前,我在调用摄像机视图时实现了叠加视图.
pickerController.cameraOverlayView =myOverlay;
Run Code Online (Sandbox Code Playgroud)
视频录制并在录制视频和通过电子邮件等共享后将视频保存到相册中一切正常.
如果我将视频质量用作"高品质",那么录制的视频已变得庞大.例如,如果我以高质量录制视频30秒,录制的视频大约为30 - 40 mb.
pickerController.videoQuality = UIImagePickerControllerQualityTypeHigh;
Run Code Online (Sandbox Code Playgroud)
如何在共享之前对高质量录制视频进行压缩编程,就像Apple如何使用内置录像机一样?
请指导我解决这个问题.
谢谢!
更新:
这就是我最近的尝试,但仍然没有成功:我想压缩拍摄的录制视频来到didFinishPickingMediaWithInfo并存储在相同的相册实际视频路径本身,而不是其他任何地方.我测试同一个视频被压缩到非常小的尺寸,当我从照片库中选择时,但从相机拍摄的同一视频来自didFinishPickingMediaWithInfo并未压缩,尽管我使用下面的AVAssetExportSession代码.
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if ([mediaType isEqualToString:(NSString *)kUTTypeMovie])
{
NSURL *videoURL = [info objectForKey:UIImagePickerControllerMediaURL];
NSString *urlPath = [videoURL path];
if ([[urlPath lastPathComponent] isEqualToString:@"capturedvideo.MOV"])
{
if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum (urlPath))
{
[self copyTempVideoToMediaLibrary :urlPath];
}
else
{
NSLog(@"Video Capture Error: Captured video cannot be saved...didFinishPickingMediaWithInfo()");
}
}
else
{
NSLog(@"Processing soon to saved photos album...else loop of lastPathComponent..didFinishPickingMediaWithInfo()");
}
}
[self …Run Code Online (Sandbox Code Playgroud) 我正在尝试用UIImagePickerController压缩用户摄像头拍摄的视频(不是现有的视频,而是一个即时的视频)上传到我的服务器并花费少量时间这样做,所以较小的尺寸是理想的而不是30-新品质相机45毫升.
这是在iOS 8中使用swift进行压缩的代码,它压缩得非常好,我从35 mb轻松到2.1 mb.
func convertVideo(inputUrl: NSURL, outputURL: NSURL)
{
//setup video writer
var videoAsset = AVURLAsset(URL: inputUrl, options: nil) as AVAsset
var videoTrack = videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0] as AVAssetTrack
var videoSize = videoTrack.naturalSize
var videoWriterCompressionSettings = Dictionary(dictionaryLiteral:(AVVideoAverageBitRateKey,NSNumber(integer:960000)))
var videoWriterSettings = Dictionary(dictionaryLiteral:(AVVideoCodecKey,AVVideoCodecH264),
(AVVideoCompressionPropertiesKey,videoWriterCompressionSettings),
(AVVideoWidthKey,videoSize.width),
(AVVideoHeightKey,videoSize.height))
var videoWriterInput = AVAssetWriterInput(mediaType: AVMediaTypeVideo, outputSettings: videoWriterSettings)
videoWriterInput.expectsMediaDataInRealTime = true
videoWriterInput.transform = videoTrack.preferredTransform
var videoWriter = AVAssetWriter(URL: outputURL, fileType: AVFileTypeQuickTimeMovie, error: nil)
videoWriter.addInput(videoWriterInput)
var videoReaderSettings: [String:AnyObject] = [kCVPixelBufferPixelFormatTypeKey:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange]
var videoReaderOutput = AVAssetReaderTrackOutput(track: videoTrack, outputSettings: videoReaderSettings)
var …Run Code Online (Sandbox Code Playgroud) TLDR:跳至更新。我正在寻找一种压缩或降低视频输出质量的方法,最好不要在创建后立即进行,但是如果那是唯一的方法,那就这样吧
另外,如果您知道任何可以完成此任务的优质可可豆荚,那就太好了。
我正在寻找一个可以输出压缩URL的函数,并且我应该能够控制压缩质量...
尝试使函数在当前状态下工作后,它不起作用。Yeilding nil。我认为是由于以下原因:
let outputURL = urlToCompress
assetWriter = try AVAssetWriter(outputURL: outputURL, fileType: AVFileType.mov)
Run Code Online (Sandbox Code Playgroud)
我正在尝试快速压缩视频。到目前为止,所有解决方案都已在创建过程中使用。我想知道创建后是否有压缩方式?仅使用视频网址?
如果不是,那我该如何做一个压缩功能来压缩视频并返回压缩的URL?
我一直在使用的代码:
func compressVideo(videoURL: URL) -> URL {
let data = NSData(contentsOf: videoURL as URL)!
print("File size before compression: \(Double(data.length / 1048576)) mb")
let compressedURL = NSURL.fileURL(withPath: NSTemporaryDirectory() + NSUUID().uuidString + ".mov")
compressVideoHelperMethod(inputURL: videoURL , outputURL: compressedURL) { (exportSession) in
}
return compressedURL
}
func compressVideoHelperMethod(inputURL: URL, outputURL: URL, handler:@escaping (_ exportSession: AVAssetExportSession?)-> Void) {
let urlAsset = AVURLAsset(url: inputURL, …Run Code Online (Sandbox Code Playgroud) ios ×3
compression ×2
swift ×2
video ×2
avfoundation ×1
corrupt ×1
file-upload ×1
iphone ×1
objective-c ×1