iOS:如何设置AVAssetWriterInput以获得基线级别3.0配置文件?

iOS:如何设置AVAssetWriterInput以获得基线级别3.0配置文件?,ios,objective-c,avassetwriter,Ios,Objective C,Avassetwriter,有些设备通常是Android设备,无法读取我在iOS中使用带有ImagePicker API的iphone录制的视频。因此,在拍摄视频后,我寻找一些方法将基线转换为3.0级配置文件。我发现一个库提供了使用AVAssetWriterInput的简单方法,我使用以下代码: - (IBAction)takeVideo:(id)sender { UIImagePickerController *ipc = [[UIImagePickerController alloc] init]; NSArray *

有些设备通常是Android设备,无法读取我在iOS中使用带有ImagePicker API的iphone录制的视频。因此,在拍摄视频后,我寻找一些方法将基线转换为3.0级配置文件。我发现一个库提供了使用AVAssetWriterInput的简单方法,我使用以下代码:

- (IBAction)takeVideo:(id)sender
{
UIImagePickerController *ipc = [[UIImagePickerController alloc] init];
NSArray *availableTypes = [UIImagePickerController
                           availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
ipc.mediaTypes = availableTypes;
ipc.sourceType = UIImagePickerControllerSourceTypeCamera;
[ipc setVideoMaximumDuration:10];
ipc.delegate = self;
ipc.videoQuality = UIImagePickerControllerQualityTypeMedium;
if ([availableTypes containsObject:(__bridge NSString *)kUTTypeMovie]) {
    [ipc setMediaTypes:@[(__bridge NSString *)kUTTypeMovie]];
}
[self presentViewController:ipc animated:YES completion:nil];
}

- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
NSURL *mediaURL = info[UIImagePickerControllerMediaURL];
if (mediaURL) {
    SDAVAssetExportSession *encoder = [SDAVAssetExportSession.alloc initWithAsset:[AVAsset assetWithURL:mediaURL]];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    self.videoPath =  [documentsDirectory stringByAppendingPathComponent:
                        [NSString stringWithFormat:@"myvideo.mov"]];
    self.url = [NSURL fileURLWithPath:self.videoPath];
    encoder.outputURL=self.url;
    encoder.outputFileType = AVFileTypeMPEG4;
    encoder.shouldOptimizeForNetworkUse = YES;

    encoder.videoSettings = @
    {
    AVVideoCodecKey: AVVideoCodecH264,
    AVVideoWidthKey: @1920,
    AVVideoHeightKey: @1080,
    AVVideoCompressionPropertiesKey: @
        {
        AVVideoAverageBitRateKey: @6000000, // Lower bit rate here
        AVVideoProfileLevelKey: AVVideoProfileLevelH264Baseline30,//This is what I want
        },
    };
    encoder.audioSettings = @
    {
    AVFormatIDKey: @(kAudioFormatMPEG4AAC),
    AVNumberOfChannelsKey: @2,
    AVSampleRateKey: @44100,
    AVEncoderBitRateKey: @128000,
    };

    [encoder exportAsynchronouslyWithCompletionHandler:^
     {
         int status = encoder.status;

         if (status == AVAssetExportSessionStatusCompleted)
         {
             AVAssetTrack *videoTrack = nil;
             AVURLAsset *asset = [AVAsset assetWithURL:encoder.outputURL];
             NSArray *videoTracks = [asset tracksWithMediaType:AVMediaTypeVideo];
             videoTrack = [videoTracks objectAtIndex:0];
             float frameRate = [videoTrack nominalFrameRate];
             float bps = [videoTrack estimatedDataRate];
             NSLog(@"Frame rate == %f",frameRate);
             NSLog(@"bps rate == %f",bps/(1024.0 * 1024.0));
             NSLog(@"Video export succeeded");
                     [self dismissViewControllerAnimated:YES completion:^{
                         //some instructions...
                     }];
         }
         else if (status == AVAssetExportSessionStatusCancelled)
         {
             NSLog(@"Video export cancelled");
         }
         else
         {
             NSLog(@"Video export failed with error: %@ (%ld)", encoder.error.localizedDescription, (long)encoder.error.code);
         }
     }];
}

}
但我确实得到了错误视频导出失败的错误:操作无法完成-11800。 我很确定这是因为我的视频设置错误/与baseline 3.0不兼容


如何让baseline 3.0正常工作?

这可能是您所需要的

如果您对AVVideoProfileLevelKey使用另一个值,它是否有效?如果我使用AVVideoProfileLevelH264High40,它是否有效。
AVVideoWidthKey: @720,
AVVideoHeightKey: @480,
AVVideoCompressionPropertiesKey: @
{
    AVVideoAverageBitRateKey: @3000000