我正在尝试使用AVAssetWriter创建多个串行写入会话.一旦我成功完成一个(在调用finishWriting之后),状态将设置为2(AVAssetWriterStatusCompleted).
尝试创建另一个会话,我调用startWriting,但我收到错误:
[AVAssetWriter startWriting] cannot call method when status is 2
Run Code Online (Sandbox Code Playgroud)
似乎我无法创建写入会话,除非我配置一些东西.我是否必须再次重新创建AVAssetWriter?我必须遗漏一些东西,而且文档没有帮助.
谢谢.
我目前正在尝试使用CoreImage,学习如何将CIFilters应用于相机Feed.目前我已经成功地拍摄了相机,应用过滤器并以视频的形式将Feed写入AVAssetWriter,但我遇到的一个问题是,在过滤过程中,我实际裁剪了图像数据所以它总是有方形尺寸(项目的其他方面需要)
我的流程如下:
没有将CGImageRef绘制到上下文中,这就是我得到的:

在将CGImageRef绘制到上下文之后,这就是我得到的:

理想情况下,我只想告诉CMSampleBufferRef它有新的维度,以便省略附加信息.但我想知道我是否必须完全创建一个新的CMSampleBufferRef.
任何帮助将不胜感激!
我正在尝试向我通过AVAssetWriter转码的视频添加元数据.我尝试创建AVMutableMetadataItem对象,将其插入数组并设置AVAssetWriter对象的元数据属性.结果文件不包含提供的元数据.
媒体信息:
AVMutableMetadataItem *mutableItem = [AVMutableMetadataItem metadataItem];
mutableItem.keySpace = AVMetadataKeySpaceQuickTimeUserData;
mutableItem.key = AVMetadataQuickTimeUserDataKeyCredits;
mutableItem.value = @"credit to me";
assetWriter.metadata = [NSArray arrayWithObject:mutableItem];
Run Code Online (Sandbox Code Playgroud)
请帮忙谢谢
我正在尝试将RTSP/RTP iPhone相机捕获流式传输到Wowza服务器.
Apple的API不允许直接访问H264编码的帧,但只允许您将其写入容器'.mov'文件.
无论哪种方式,我都无法访问该文件内容,直到AVAssetWriter完成写入,这不允许我流式传输实时相机捕获.
我尝试使用命名管道访问它,以便实时访问文件的内容,但没有成功 - AVAssetWriter不会写入现有文件.
有谁知道怎么做?
谢谢!
编辑:从iOS 8开始,编码器和解码器都有API
我正在使用a编写带有AVAssetWriter的MP4视频文件AVAssetWriterInputPixelBufferAdaptor.
来源是a的视频UIImagePickerController,可以从相机或资产库中新近捕获.现在质量是UIImagePickerControllerQualityTypeMedium.
有时候作家失败了.它的状态是AVAssetWriterStatusFailed,AVAssetWriter对象的错误属性是:
Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed"
UserInfo=0xf5d8990 {NSLocalizedFailureReason=An unknown error occurred (-536870210),
NSUnderlyingError=0x4dd8e0 "The operation couldn’t be completed. (OSStatus error -536870210.)",
NSLocalizedDescription=The operation could not be completed
Run Code Online (Sandbox Code Playgroud)
错误发生在代码运行的大约20%的时间.它似乎在iPhone 4/4S上比在iPhone 5上更频繁地失败.
如果源视频质量较高,它也会更频繁地出现.使用UIImagePickerControllerQualityTypeLow,错误不会经常发生.使用UIImagePickerControllerQualityTypeHigh,错误更频繁地发生.
我还注意到了其他一些事情:它似乎有点波澜.当它失败时,即使我删除了应用程序并重新安装它,以下运行也经常会失败.这让我想知道,我的程序是否泄漏了一些内存,即使应用程序被杀,该内存是否仍然存活(甚至可能?).
这是我用来渲染视频的代码:
- (void)writeVideo
{
offlineRenderingInProgress = YES;
/* --- Writer Setup --- */
[locationQueue cancelAllOperations];
[self stopWithoutRewinding];
NSError *writerError = nil;
BOOL succes;
succes = [[NSFileManager defaultManager] removeItemAtURL:self.outputURL error:nil];
// DLog(@"Url: %@, …Run Code Online (Sandbox Code Playgroud) 我目前正在制作一个小应用程序,将我的mac上的网络摄像头延时,将捕获的帧保存到png,我正在考虑将捕获的帧导出为单个视频.
我使用CGImage来处理原始图像,并将它们设置在一个数组中,但我不确定那里是从那里开始的.我从自己的研究中得知,我必须以某种方式使用AVAssetWriter和AVAssetWriterInput.
我在这里看了一下,阅读了苹果文档并搜索了谷歌.但是所有的指南等都是obj-c而不是swift,这使得它很难理解(因为我没有Obj-C的经验).
任何帮助将非常感谢.
非常感谢,卢克.
即时通讯尝试捕获帧缓冲区数据并转换为我的iPhone游戏的视频..即时通讯使用AVAssetWriter来完成这件事.代码在模拟器上工作正常,但在设备本身没有.在设备上它生成一个黑色视频
即时通讯使用以下代码:
//This code initializes the AVAsetWriter and other things
- (void) testVideoWriter {
CGRect screenBoundst = [[UIScreen mainScreen] bounds];
//initialize global info
MOVIE_NAME = @"Documents/Movie5.mp4";
//CGSize size = CGSizeMake(screenBoundst.size.width, screenBoundst.size.height);
CGSize size = CGSizeMake(320, 480);
frameLength = CMTimeMake(1, 5);
currentTime = kCMTimeZero;
currentFrame = 0;
MOVIE_PATH = [NSHomeDirectory() stringByAppendingPathComponent:MOVIE_NAME];
NSError *error = nil;
videoWriter = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:MOVIE_PATH]
fileType:AVFileTypeMPEG4 error:&error];
NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:AVVideoCodecH264, AVVideoCodecKey,
[NSNumber numberWithInt:size.width ], AVVideoWidthKey,
[NSNumber numberWithInt:size.height ], AVVideoHeightKey, nil];
writerInput = [AVAssetWriterInput …Run Code Online (Sandbox Code Playgroud) 我正在尝试同时读写由AVAssetWriter编写的H.264 mov文件.我设法提取单个NAL单元,将它们打包到ffmpeg的AVPackets中,并使用ffmpeg将它们写入另一种视频格式.它的工作原理和生成的文件播放效果很好,但播放速度不正确.如何从原始H.264数据计算正确的PTS/DTS值?或者也许还有其他方法可以获得它们?
这是我尝试过的:
将捕获最小/最大帧速率限制为30,并假设输出文件为30 fps.事实上,它的fps总是小于我设定的值.而且,我认为fps在数据包之间并不是一成不变的.
记住每个书面样本的表示时间戳,并假设样本一对一映射到NALU并将保存的时间戳应用于输出数据包.这不起作用.
将PTS设置为0或AV_NOPTS_VALUE.不行.
从谷歌搜索我了解原始H.264数据通常不包含任何时间信息.它有时在SEI中有一些时间信息,但我使用的文件没有它.另一方面,有些应用程序正是我正在尝试做的事情,所以我认为它可能以某种方式.
当我使用AVCaptureVideoDataOutput和AVCaptureAudioDataOutput录制音频+视频时,我遇到了延迟问题.有时视频会阻塞几毫秒,有时音频与视频不同步.
我插入了一些日志并观察到我首先在captureOutput回调中获得了大量视频缓冲区,并且在一段时间后我得到了音频缓冲区(有时我根本没有收到音频缓冲区,结果视频没有声音).如果我评论处理视频缓冲区的代码,我会毫无问题地获得音频缓冲区.
这是我正在使用的代码:
-(void)initMovieOutput:(AVCaptureSession *)captureSessionLocal
{
AVCaptureVideoDataOutput *dataOutput = [[AVCaptureVideoDataOutput alloc] init];
self._videoOutput = dataOutput;
[dataOutput release];
self._videoOutput.alwaysDiscardsLateVideoFrames = NO;
self._videoOutput.videoSettings = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange]
forKey:(id)kCVPixelBufferPixelFormatTypeKey
];
AVCaptureAudioDataOutput *audioOutput = [[AVCaptureAudioDataOutput alloc] init];
self._audioOutput = audioOutput;
[audioOutput release];
[captureSessionLocal addOutput:self._videoOutput];
[captureSessionLocal addOutput:self._audioOutput];
// Setup the queue
dispatch_queue_t queue = dispatch_queue_create("MyQueue", NULL);
[self._videoOutput setSampleBufferDelegate:self queue:queue];
[self._audioOutput setSampleBufferDelegate:self queue:queue];
dispatch_release(queue);
}
Run Code Online (Sandbox Code Playgroud)
在这里我设置了作者:
-(BOOL) setupWriter:(NSURL *)videoURL session:(AVCaptureSession *)captureSessionLocal
{
NSError *error = nil;
self._videoWriter = [[AVAssetWriter alloc] initWithURL:videoURL fileType:AVFileTypeQuickTimeMovie
error:&error];
NSParameterAssert(self._videoWriter);
// …Run Code Online (Sandbox Code Playgroud) 我有这段代码可以将视频的大小从 1280 x 720 调整为 640 x 360 但我想要一个不裁剪的调整大小。
有没有办法完全调整不裁剪的大小?
这是代码
class func resizer(inputURL : NSURL , completion: (outPutURL : NSURL?) -> Void ){
let videoAsset = AVAsset(URL: inputURL) as AVAsset
let clipVideoTrack = videoAsset.tracksWithMediaType(AVMediaTypeVideo).first! as AVAssetTrack
let composition = AVMutableComposition()
composition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: CMPersistentTrackID())
let videoComposition = AVMutableVideoComposition()
videoComposition.renderSize = CGSizeMake(360,640)
videoComposition.frameDuration = CMTimeMake(1, 30)
let instruction = AVMutableVideoCompositionInstruction()
instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(180, 30))
let transformer : AVMutableVideoCompositionLayerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: clipVideoTrack)
let t1 = CGAffineTransformMakeTranslation(360, 0)
let t2 = CGAffineTransformRotate(t1, …Run Code Online (Sandbox Code Playgroud) avassetwriter ×10
ios ×7
avfoundation ×5
iphone ×3
swift ×2
cocoa-touch ×1
core-video ×1
ffmpeg ×1
h.264 ×1
ipad ×1
macos ×1
metadata ×1
objective-c ×1
rtp ×1
rtsp ×1
transcoding ×1
video ×1
wowza ×1