标签: avassetwriter

AVAssetWriter多个会话和status属性

我正在尝试使用AVAssetWriter创建多个串行写入会话.一旦我成功完成一个(在调用finishWriting之后),状态将设置为2(AVAssetWriterStatusCompleted).

尝试创建另一个会话,我调用startWriting,但我收到错误:

[AVAssetWriter startWriting] cannot call method when status is 2
Run Code Online (Sandbox Code Playgroud)

似乎我无法创建写入会话,除非我配置一些东西.我是否必须再次重新创建AVAssetWriter?我必须遗漏一些东西,而且文档没有帮助.

谢谢.

iphone avfoundation ios avassetwriter

7
推荐指数
1
解决办法
6965
查看次数

iOS:在附加到AVAssetWriterInput之前裁剪CMSampleBufferRef

我目前正在尝试使用CoreImage,学习如何将CIFilters应用于相机Feed.目前我已经成功地拍摄了相机,应用过滤器并以视频的形式将Feed写入AVAssetWriter,但我遇到的一个问题是,在过滤过程中,我实际裁剪了图像数据所以它总是有方形尺寸(项目的其他方面需要)

我的流程如下:

  1. 使用AVCaptureSession捕获Feed
  2. 从捕获输出中获取CMSampleBufferRef并获取CVPixelBufferRef
  3. 获取CVPixelBufferRef的基地址,并使用基地址作为其数据创建CGBitmapContext(因此我们可以覆盖它)
  4. 将CVPixelBufferRef转换为CIImage(使用其中一个CIImage构造函数)
  5. 将过滤器应用于CIImage
  6. 将CIImage转换为CGImageRef
  7. 将CGImageRef绘制到CGBitmapContext(导致样本缓冲区内容被覆盖)
  8. 将CMSampleBufferRef附加到AVAssetWriterInput.

没有将CGImageRef绘制到上下文中,这就是我得到的:

在此输入图像描述

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

在此输入图像描述

理想情况下,我只想告诉CMSampleBufferRef它有新的维度,以便省略附加信息.但我想知道我是否必须完全创建一个新的CMSampleBufferRef.

任何帮助将不胜感激!

core-graphics avfoundation core-video ios avassetwriter

7
推荐指数
0
解决办法
1448
查看次数

AVAssetWriter元数据需要哪些数据?

我正在尝试向我通过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)

请帮忙谢谢

iphone metadata transcoding ios avassetwriter

7
推荐指数
0
解决办法
1316
查看次数

RTP iPhone相机 - 如何在写入时读取AVAssetWriter文件?

我正在尝试将RTSP/RTP iPhone相机捕获流式传输到Wowza服务器.

Apple的API不允许直接访问H264编码的帧,但只允许您将其写入容器'.mov'文件.

无论哪种方式,我都无法访问该文件内容,直到AVAssetWriter完成写入,这不允许我流式传输实时相机捕获.

我尝试使用命名管道访问它,以便实时访问文件的内容,但没有成功 - AVAssetWriter不会写入现有文件.

有谁知道怎么做?

谢谢!

编辑:从iOS 8开始,编码器和解码器都有API

rtp rtsp wowza ios avassetwriter

7
推荐指数
1
解决办法
2902
查看次数

AVAssetWriter有时会失败,状态为AVAssetWriterStatusFailed.似乎是随机的

我正在使用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)

cocoa-touch objective-c avfoundation avassetwriter

7
推荐指数
1
解决办法
6625
查看次数

如何在swift中使用AVAssetWriter组合视频?

我目前正在制作一个小应用程序,将我的mac上的网络摄像头延时,将捕获的帧保存到png,我正在考虑将捕获的帧导出为单个视频.

我使用CGImage来处理原始图像,并将它们设置在一个数组中,但我不确定那里是从那里开始的.我从自己的研究中得知,我必须以某种方式使用AVAssetWriter和AVAssetWriterInput.

我在这里看了一下,阅读了苹果文档并搜索了谷歌.但是所有的指南等都是obj-c而不是swift,这使得它很难理解(因为我没有Obj-C的经验).

任何帮助将非常感谢.

非常感谢,卢克.

macos avassetwriter swift

7
推荐指数
1
解决办法
5843
查看次数

使用AVAssetWriter捕获屏幕 - 在模拟器上正常工作但在设备上创建黑色视频

即时通讯尝试捕获帧缓冲区数据并转换为我的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)

video ipad avassetwriter

6
推荐指数
0
解决办法
1663
查看次数

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

我正在尝试同时读写由AVAssetWriter编写的H.264 mov文件.我设法提取单个NAL单元,将它们打包到ffmpeg的AVPackets中,并使用ffmpeg将它们写入另一种视频格式.它的工作原理和生成的文件播放效果很好,但播放速度不正确.如何从原始H.264数据计算正确的PTS/DTS值?或者也许还有其他方法可以获得它们?

这是我尝试过的:

  1. 将捕获最小/最大帧速率限制为30,并假设输出文件为30 fps.事实上,它的fps总是小于我设定的值.而且,我认为fps在数据包之间并不是一成不变的.

  2. 记住每个书面样本的表示时间戳,并假设样本一对一映射到NALU并将保存的时间戳应用于输出数据包.这不起作用.

  3. 将PTS设置为0或AV_NOPTS_VALUE.不行.

从谷歌搜索我了解原始H.264数据通常不包含任何时间信息.它有时在SEI中有一些时间信息,但我使用的文件没有它.另一方面,有些应用程序正是我正在尝试做的事情,所以我认为它可能以某种方式.

ffmpeg avfoundation h.264 ios avassetwriter

6
推荐指数
1
解决办法
3120
查看次数

使用AVCaptureVideoDataOutput和AVCaptureAudioDataOutput时的性能问题

当我使用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)

iphone ios avcapturesession avassetwriter

6
推荐指数
1
解决办法
4023
查看次数

Swift Video Resizer AVAsset

我有这段代码可以将视频的大小从 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)

avfoundation ios avassetwriter avassetexportsession swift

6
推荐指数
1
解决办法
5636
查看次数