Tag: avassetwriter

如何控制AVAssetWriter以正确的FPS写入

让我看看我是否理解正确。 在目前最先进的硬件,iOS允许我logging下面的帧数:30,60,120和240。 但是这些fps的行为有所不同。 如果我以30或60 fps的速度拍摄,我预计这些fps拍摄的video文件分别以30 fps和60 fps的速度播放。 但是,如果我以120或240 fps的速度拍摄,我预计在这些fps下拍摄的video文件可以以30 fps的速度播放,否则我将看不到慢镜头。 几个问题: 我对吗? 有没有办法以120或240 fps的速度拍摄,分别以120和240 fps的速度拍摄? 我的意思是在fps上播放video是在没有慢镜头的情况下拍摄的? 我在写文件时如何控制帧速率? 我正在创build这样的AVAssetWriterinput… NSDictionary *videoCompressionSettings = @{AVVideoCodecKey : AVVideoCodecH264, AVVideoWidthKey : @(videoWidth), AVVideoHeightKey : @(videoHeight), AVVideoCompressionPropertiesKey : @{ AVVideoAverageBitRateKey : @(bitsPerSecond), AVVideoMaxKeyFrameIntervalKey : @(1)} }; _assetWriterVideoInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoCompressionSettings]; 并没有明显的办法来控制这一点。 注:我已经尝试了不同的数字,那是1 。 我已经试过1.0/fps ,我已经尝试过fps ,我已经删除了密钥。 没有不同。 这是我如何设置AVAssetWriter: AVAssetWriter *newAssetWriter […]

与原始NAL单位一起使用AVAssetWriter

我注意到在AVAssetWriterInput的iOS文档中,你可以传递nil给outputSettings字典来指定input数据不应该被重新编码。 用于编码附加到输出的媒体的设置。 通过零来指定附加的样本不应该被重新编码。 我想利用这个function来传递一个H.264原始NALstream,但是我无法将我的原始字节stream转换成一个CMSampleBuffer ,我可以将它传递到AVAssetWriterInput的appendSampleBuffer方法中。 我的NALstream只包含SPS / PPS / IDR / P NAL(1,5,7,8)。 我一直无法find有关如何使用预编码的H264数据与AVAssetWriter的文件或结论性的答案。 生成的video文件无法播放。 我如何正确打包NUM单元到CMSampleBuffers ? 我是否需要使用起始码前缀? 长度前缀? 我是否需要确保每个CMSampleBuffer只放置一个NAL? 我的最终目标是创build一个H264 / AAC的MP4或MOV容器。 这是我一直在玩的代码: -(void)addH264NAL:(NSData *)nal { dispatch_async(recordingQueue, ^{ //Adapting the raw NAL into a CMSampleBuffer CMSampleBufferRef sampleBuffer = NULL; CMBlockBufferRef blockBuffer = NULL; CMFormatDescriptionRef formatDescription = NULL; CMItemCount numberOfSampleTimeEntries = 1; CMItemCount numberOfSamples = […]

我如何使用AVAssetWriter?

我想采取一些video帧,并将其编码成一个video。 看起来,这正是AVAssetWriter意思,但无论我如何眼球的文档和谷歌我找不到任何方式来实际使用它。 从文档,它看起来像我需要一个input( AVAssetWriterInput )来提供作家。 精细。 但AVAssetWriterInput类是抽象的,我知道4.1中唯一的子类是AVAssetWriterInputPixelBufferAdaptor ,它的初始化程序需要AVAssetWriterInput …? 我在这里错过了很明显的东西吗

video压缩ios:使用AVAssetWriter缩小video的大小

我成功地使用AVAssetWriter和AVAssetWriterInput将由AVFoundation Framework的AVCaptureVideoPreviewLayer捕获的一系列图像编码为video。 但是video的大小太大了,在这种情况下,你们中的任何一个人都可以给我一个教程或者是一个直接的我,或者给我正确的video输出设置来进行video压缩。 我正在使用以下VideoOutputSetting。 videoOutputSettings = @{ AVVideoCodecKey: AVVideoCodecH264, AVVideoWidthKey: [NSNumber numberWithInt:width], AVVideoHeightKey: [NSNumber numberWithInt:height], AVVideoCompressionPropertiesKey: @{ AVVideoAverageBitRateKey: [NSNumber numberWithInt:bitrate], AVVideoMaxKeyFrameIntervalKey: @(150), AVVideoProfileLevelKey: AVVideoProfileLevelH264BaselineAutoLevel, AVVideoAllowFrameReorderingKey: @NO, AVVideoH264EntropyModeKey: AVVideoH264EntropyModeCAVLC, AVVideoExpectedSourceFrameRateKey: @(30), AVVideoAverageNonDroppableFrameRateKey: @(30) } }; videoWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoSettings]; _videoWriterInput.expectsMediaDataInRealTime = YES;

问题与设置和检索AVMetadataCommonKeyCreator的价值

我有一个iPhone的video录制应用程序。 我正在使用AVAssetWriter将录制的video数据写入文件。 我也有兴趣将自定义元数据embedded到文件中。 例如:我想确定我的应用程序是video的创build者。 因此,在创build资产AVMetadataCommonKeyCreator之后,我使用密钥AVMetadataCommonKeyCreator将创build器值添加到资产AVMetadataCommonKeyCreator器的元数据中。 代码片段如下: AVAssetWriter *assetWrtr = [[AVAssetWriter alloc] initWithURL:inURL fileType:AVFileTypeQuickTimeMovie error:&error]; self.assetWriter = assetWrtr; [assetWrtr release]; NSArray *existingMetadataArray = self.assetWriter.metadata; NSMutableArray *newMetadataArray = nil; if (existingMetadataArray) { newMetadataArray = [existingMetadataArray mutableCopy]; // To prevent overriding of existing metadata } else { newMetadataArray = [[NSMutableArray alloc] init]; } AVMutableMetadataItem *item = [[AVMutableMetadataItem alloc] […]

如何检查分辨率,在iOS的video比特率

我正在开发video压缩function, 我的想法如下: 获得video的分辨率和比特率。 检查video的分辨率。 如果它大于640×480,我会将这个video压缩一半,并将比特率调整为1/4。 例如,如果video的分辨率是1920×1080,它将被压缩到960×540,在4mbps的1920×1080将被压缩到1mbps的960×540。 我有几个问题: 如何在iOS中获得video的分辨率和比特率? 如果把1920×1080压缩到960×540,比特率也会自适应调整,还是需要手动设置比特率? 怎么可能呢? 我试着下面的代码来压缩video,但我不知道它压缩到哪个分辨率: – (void)convertVideoToLowQuailtyWithInputURL:(NSURL*)inputURL outputURL:(NSURL*)outputURL handler:(void (^)(AVAssetExportSession*))handler { [[NSFileManager defaultManager] removeItemAtURL:outputURL error:nil]; AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:inputURL options:nil]; AVAssetExportSession *session = [[AVAssetExportSession alloc] initWithAsset: urlAsset presetName:AVAssetExportPresetLowQuality]; session.outputURL = outputURL; session.outputFileType = AVFileTypeQuickTimeMovie; [session exportAsynchronouslyWithCompletionHandler:^(void) { handler(session); }]; } 请给我一些build议。 提前致谢。

AVAssetWritter不适用于audio

我试图让audio与iOS应用程序的video一起工作。 video很好。 没有audiologging到文件(我的iPhone扬声器工作。) 这里是init的设置: session = [[AVCaptureSession alloc] init]; menu->session = session; menu_open = NO; session.sessionPreset = AVCaptureSessionPresetMedium; camera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; microphone = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; menu->camera = camera; [session beginConfiguration]; [camera lockForConfiguration:nil]; if([camera isExposureModeSupported:AVCaptureExposureModeContinuousAutoExposure]){ camera.exposureMode = AVCaptureExposureModeContinuousAutoExposure; } if([camera isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus]){ camera.focusMode = AVCaptureFocusModeContinuousAutoFocus; } if([camera isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance]){ camera.whiteBalanceMode = AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance; } if ([camera hasTorch]) { […]

AVAssetWriterInputPixelBufferAdaptor和CMTime

我正在用AVAssetWriterInputPixelBufferAdaptor写一些帧到video,而行为与时间不是我所期望的。 如果我只写一帧: [videoWriter startSessionAtSourceTime:kCMTimeZero]; [adaptor appendPixelBuffer:pxBuffer withPresentationTime:kCMTimeZero]; 这给我一个长度为零的video,这是我所期望的。 但是如果我继续添加第二帧: // 3000/600 = 5 sec, right? CMTime nextFrame = CMTimeMake(3000, 600); [adaptor appendPixelBuffer:pxBuffer withPresentationTime:nextFrame]; 我得到了十秒的video,我期待五个。 这里发生了什么? withPresentationTime是否以某种方式设置了帧的开始和持续时间? 请注意,我没有调用endSessionAtSourceTime ,只是finishWriting 。

.wav转换为AVAssetWritter ios的压缩格式

那么我现在面临的问题是尺寸问题。 我允许用户从他们的库中select一首歌曲,然后将其分割成多个部分,然后可以使用启用了文件共享的计算机上的.wav或.mp3文件。 基本上我使用以下AVAssetWritter选项,我不断得到一个巨大的巨大的audio文件。 EG 5分钟的音乐大概是50MB。 我正在试图把这个问题削减到一个标准大小的行业。 我有一种感觉,它与我正在使用LinearPCM作为我的选项之一有关,但是当我更改这个或任何audio选项时,作者不能写入。 我也正在更改AVAssetWritter上的FileType参数。 这是我的代码,它工作得很好,我只需要find压缩或缩小文件。 AVAssetWriter *assetWriter = [[AVAssetWriter assetWriterWithURL:exportURL fileType:AVFileTypeWAVE error:&assetError] NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey, [NSNumber numberWithFloat:41000.0], AVSampleRateKey, [NSNumber numberWithInt:2], AVNumberOfChannelsKey, [NSData dataWithBytes:&channelLayout length:sizeof(AudioChannelLayout)], AVChannelLayoutKey, [NSNumber numberWithInt:16], AVLinearPCMBitDepthKey, [NSNumber numberWithBool:NO], AVLinearPCMIsNonInterleaved, [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey, [NSNumber numberWithBool:NO], AVLinearPCMIsBigEndianKey, nil]; AVAssetWriterInput *assetWriterInput = [[AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:outputSettings] retain]; 任何帮助压缩或使用我的AVAssetWritter写入不同的编解码器,而不是WAVE或CoreAudioFormat将不胜感激。 编辑:如果有一种方法,直接从音乐库到.m4a而不是.wav,这将是我想要的理想方法! […]

从iOS AVAssetWriter生成的原始H264 mdat获取PTS

我试图同时读写由AVAssetWriter写的H.264 mov文件。 我设法提取单独的NAL单元,将它们打包到ffmpeg的AVPackets中,并使用ffmpeg将它们写入另一个video格式。 它的工作原理和结果文件播放良好,除了播放速度不正确。 如何从原始H.264数据计算正确的PTS / DTS值? 或者,也许还有其他的方式来得到它们? 以下是我所尝试的: 将捕获的最小/最大帧速率限制为30,并假定输出文件将为30 fps。 实际上它的fps总是比我设定的值小。 而且,我认为fps在数据包之间并不是一成不变的。 记住每个书面样本的呈现时间戳,并假定样本与NALU一一映射,并将保存的时间戳应用于输出数据包。 这不起作用。 将PTS设置为0或AV_NOPTS_VALUE。 不起作用。 从谷歌search我了解,原始的H.264数据通常不包含任何时间信息。 它有时可以在SEI内部有一些时间信息,但我使用的文件没有它。 另一方面,有一些应用程序正在做我正在做的事情,所以我认为这是可能的。