我正在为iPhone中的Play Station 3开发媒体服务器。

我开始知道PS3不支持.MOV文件所以我必须将其转换为Mp4或PS3支持的其他转码。

这就是我所做的,但如果我设置的文件类型与源文件不同,它会崩溃。

AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:videoURL options:nil];

NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:avAsset];

if ([compatiblePresets containsObject:AVAssetExportPresetLowQuality])
{
    AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]initWithAsset:avAsset presetName:AVAssetExportPresetLowQuality];

    exportSession.outputURL = [NSURL fileURLWithPath:videoPath];

    exportSession.outputFileType = AVFileTypeMPEG4;

    CMTime start = CMTimeMakeWithSeconds(1.0, 600);

    CMTime duration = CMTimeMakeWithSeconds(3.0, 600);

    CMTimeRange range = CMTimeRangeMake(start, duration);

    exportSession.timeRange = range;

    [exportSession exportAsynchronouslyWithCompletionHandler:^{

        switch ([exportSession status]) {

            case AVAssetExportSessionStatusFailed:
                NSLog(@"Export failed: %@", [[exportSession error] localizedDescription]);

                break;

            case AVAssetExportSessionStatusCancelled:

                NSLog(@"Export canceled");

                break;

            default:

                break;
        }

        [exportSession release];
    }];
}

如果我在这里设置AVFileTypeMPEG4然后它崩溃,说“无效的文件类型”。 所以我必须将它设置为AVFileTypeQuickTimeMovie并且它给出了MOV文件。

在iOS中是否可以通过AVAssetExportSession将视频从MOV转换为Mp4 ...或者没有任何第三方库?

===============>>#1 票数:10

presetName使用“AVAssetExportPresetPassthrough”代替“AVAssetExportPresetLowQuality”

 AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]initWithAsset:avAsset presetName:AVAssetExportPresetPassthrough];

===============>>#2 票数:7

MOV非常类似于MP4,您可能只需更改扩展程序并使其正常工作,Windows Phone无法播放.MOVS但可以播放mp4,我所做的就是将其从.mov更改为.mp4它工作正常,这是从iPhone上拍摄的视频...如果有什么你可以尝试导出AVAssetExporter并尝试在那里有MP4和M4A的文件类型,你可以从fileformat UTI 这里看到

希望能帮助到你

===============>>#3 票数:5

您需要AVMutableComposition才能执行此操作。 因为Asset不能直接在iOS 5.0下转码为MP4。

- (BOOL)encodeVideo:(NSURL *)videoURL
{
    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];

    // Create the composition and tracks
    AVMutableComposition *composition = [AVMutableComposition composition];
    AVMutableCompositionTrack *videoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
    AVMutableCompositionTrack *audioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
    NSArray *assetVideoTracks = [asset tracksWithMediaType:AVMediaTypeVideo];
    if (assetVideoTracks.count <= 0)
    {
            NSLog(@"Error reading the transformed video track");
            return NO;
    }

    // Insert the tracks in the composition's tracks
    AVAssetTrack *assetVideoTrack = [assetVideoTracks firstObject];
    [videoTrack insertTimeRange:assetVideoTrack.timeRange ofTrack:assetVideoTrack atTime:CMTimeMake(0, 1) error:nil];
    [videoTrack setPreferredTransform:assetVideoTrack.preferredTransform];

    AVAssetTrack *assetAudioTrack = [[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
    [audioTrack insertTimeRange:assetAudioTrack.timeRange ofTrack:assetAudioTrack atTime:CMTimeMake(0, 1) error:nil];

    // Export to mp4
    NSString *mp4Quality = [MGPublic isIOSAbove:@"6.0"] ? AVAssetExportPresetMediumQuality : AVAssetExportPresetPassthrough;
    NSString *exportPath = [NSString stringWithFormat:@"%@/%@.mp4",
                                     [NSHomeDirectory() stringByAppendingString:@"/tmp"],
                                     [BSCommon uuidString]];

    NSURL *exportUrl = [NSURL fileURLWithPath:exportPath];
    AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:composition presetName:mp4Quality];
    exportSession.outputURL = exportUrl;
    CMTime start = CMTimeMakeWithSeconds(0.0, 0);
    CMTimeRange range = CMTimeRangeMake(start, [asset duration]);
    exportSession.timeRange = range;
    exportSession.outputFileType = AVFileTypeMPEG4;
    [exportSession exportAsynchronouslyWithCompletionHandler:^{
            switch ([exportSession status])
            {
                case AVAssetExportSessionStatusCompleted:
                       NSLog(@"MP4 Successful!");
                       break;
                case AVAssetExportSessionStatusFailed:
                       NSLog(@"Export failed: %@", [[exportSession error] localizedDescription]);
                       break;
                case AVAssetExportSessionStatusCancelled:
                       NSLog(@"Export canceled");
                       break;
                default:
                       break;
            }
    }];

    return YES;
}

===============>>#4 票数:5

您可以通过AVAssets转换mp4中的视频。

AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:videoURL options:nil];
NSArray *compatiblePresets = [AVAssetExportSession     
exportPresetsCompatibleWithAsset:avAsset];
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]initWithAsset:avAsset presetName:AVAssetExportPresetLowQuality];

NSString* documentsDirectory=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
  exportSession.outputURL = url;
 //set the output file format if you want to make it in other file format (ex .3gp)
 exportSession.outputFileType = AVFileTypeMPEG4;
 exportSession.shouldOptimizeForNetworkUse = YES;

 [exportSession exportAsynchronouslyWithCompletionHandler:^{
 switch ([exportSession status])
 {
      case AVAssetExportSessionStatusFailed:
           NSLog(@"Export session failed");
           break;
      case AVAssetExportSessionStatusCancelled:
           NSLog(@"Export canceled");
           break;
      case AVAssetExportSessionStatusCompleted:
      {
           //Video conversion finished
           NSLog(@"Successful!");
      }
           break;
      default:
           break;
  }
 }];

要轻松将视频转换为mp4,请使用此链接

您还可以找到将视频转换为mp4的示例项目。

===============>>#5 票数:4

使用以下代码

    NSURL * mediaURL = [info objectForKey:UIImagePickerControllerMediaURL];
    AVAsset *video = [AVAsset assetWithURL:mediaURL];
    AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:video presetName:AVAssetExportPresetMediumQuality];
    exportSession.shouldOptimizeForNetworkUse = YES;
    exportSession.outputFileType = AVFileTypeMPEG4;

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    basePath = [basePath stringByAppendingPathComponent:@"videos"];
    if (![[NSFileManager defaultManager] fileExistsAtPath:basePath])
        [[NSFileManager defaultManager] createDirectoryAtPath:basePath withIntermediateDirectories:YES attributes:nil error:nil];

    compressedVideoUrl=nil;
    compressedVideoUrl = [NSURL fileURLWithPath:basePath];
    long CurrentTime = [[NSDate date] timeIntervalSince1970];
    NSString *strImageName = [NSString stringWithFormat:@"%ld",CurrentTime];
    compressedVideoUrl=[compressedVideoUrl URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.mp4",strImageName]];

    exportSession.outputURL = compressedVideoUrl;

    [exportSession exportAsynchronouslyWithCompletionHandler:^{

        NSLog(@"done processing video!");
        NSLog(@"%@",compressedVideoUrl);

        if(!dataMovie)
            dataMovie = [[NSMutableData alloc] init];
        dataMovie = [NSData dataWithContentsOfURL:compressedVideoUrl];

    }];

===============>>#6 票数:4

这是代码

    func encodeVideo(videoURL: NSURL)  {
    let avAsset = AVURLAsset(URL: videoURL, options: nil)

    var startDate = NSDate()

    //Create Export session
    exportSession = AVAssetExportSession(asset: avAsset, presetName: AVAssetExportPresetPassthrough)

    // exportSession = AVAssetExportSession(asset: composition, presetName: mp4Quality)
    //Creating temp path to save the converted video


    let documentsDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
    let myDocumentPath = NSURL(fileURLWithPath: documentsDirectory).URLByAppendingPathComponent("temp.mp4").absoluteString
    let url = NSURL(fileURLWithPath: myDocumentPath)

    let documentsDirectory2 = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL

    let filePath = documentsDirectory2.URLByAppendingPathComponent("rendered-Video.mp4")
    deleteFile(filePath)

    //Check if the file already exists then remove the previous file
    if NSFileManager.defaultManager().fileExistsAtPath(myDocumentPath) {
        do {
            try NSFileManager.defaultManager().removeItemAtPath(myDocumentPath)
        }
        catch let error {
            print(error)
        }
    }

     url

    exportSession!.outputURL = filePath
    exportSession!.outputFileType = AVFileTypeMPEG4
    exportSession!.shouldOptimizeForNetworkUse = true
    var start = CMTimeMakeWithSeconds(0.0, 0)
    var range = CMTimeRangeMake(start, avAsset.duration)
    exportSession.timeRange = range

    exportSession!.exportAsynchronouslyWithCompletionHandler({() -> Void in
        switch self.exportSession!.status {
        case .Failed:
            print("%@",self.exportSession?.error)
        case .Cancelled:
            print("Export canceled")
        case .Completed:
            //Video conversion finished
            var endDate = NSDate()

            var time = endDate.timeIntervalSinceDate(startDate)
            print(time)
            print("Successful!")
            print(self.exportSession.outputURL)

        default:
            break
        }

    })


}

func deleteFile(filePath:NSURL) {
    guard NSFileManager.defaultManager().fileExistsAtPath(filePath.path!) else {
        return
    }

    do {
        try NSFileManager.defaultManager().removeItemAtPath(filePath.path!)
    }catch{
        fatalError("Unable to delete file: \(error) : \(__FUNCTION__).")
    }
}

===============>>#7 票数:2

只是想说URL不能像

[NSURL URLWithString: [@"~/Documents/movie.mov" stringByExpandingTildeInPath]]

它一定是这样的

[NSURL fileURLWithPath: [@"~/Documents/movie.mov" stringByExpandingTildeInPath]]

花了一段时间来弄明白:-)

  ask by Elegant Microweb translate from so

未解决问题?本站智能推荐:

3回复

解码iPhone GPU上的视频帧

我正在寻找解码iPhone上本地mpeg-4视频帧的最快方法。 我只是对每10帧中像素的亮度值感兴趣。 我不需要在任何地方渲染视频。 我已经尝试过ffmpeg,AVAssetReader,ImageAssetGenerator,OpenCV和MPMoviePlayer,但它们都太慢了。
1回复

我们如何将视频文件从库复制到文档目录?

是否可以将位于iOS照片库的视频文件复制到我们应用程序的文档目录中? 我尝试使用uiimagepickercontroller从中获取视频文件的NSUrl,然后将其转换为NSData,然后将其写入文件。 但不幸的是它没有用。 我还有其他方法吗? 我的目的是将视频加载到OpenCV C
1回复

iOS:导出的视频中缺少音频

我正在尝试导出录制的视频。 并取得成功。 但音频缺少最终导出的视频。 所以我搜索了它并添加了下面的音频代码。 但添加上述代码后,我无法保存视频。 我收到一个错误: “session.status 4 error Error Domain = AVFoundationErro
2回复

视频合并在后台iOS中

任务:将传单图像合并到传单视频中。 案例 : 创建传单[添加表情图片/文字..等] 制作视频 情况1 按后退按钮[用户将转到传单屏幕的应用程序列表],在此期间我们正在合并flyerSnapShoot在flyerVideo.and 它完美的工作 。
2回复

GPUImage视频,透明度超过UIView

我正在开发一个iOS项目,该项目使用AV-Out在第二个屏幕上的1280x720窗口中显示内容。 我有一个MPMoviePlayerController的视图作为背景,并在其他不同的元素,如UIImages和UILabels 。 背景影片循环播放。 现在我想覆盖整个视图,包括所有可
1回复

如何从iOS上的实时视频获取每帧的RGB值?

我正在使用iPhone制作应用程序。 我想从实时视频的每一帧中获取数字RGB值。 能做到吗 如果是这样,请告诉我。 更多了解一些示例代码。 提前非常感谢您。
2回复

IOS中的视频编辑库

我正在寻找IOS中的视频编辑库。 编辑任务: - >在视频帧的顶部添加文本或标记。 在我的应用程序中,用户应该能够从视频库中选择视频,并在电影播放器​​中播放视频。 用户可以暂停视频,然后使用空闲手动添加一些文本或标记。 我们需要在此视频中合并添加的文字和标记。
1回复

如何计算视频的比特率?

在iPhone中开发视频压缩功能。 我开发了该功能,但对比特率计算却有些困惑。 我正在使用波纹管方法进行视频压缩。 我们可以获取原始视频的视频比特率吗?
1回复

从较小的尺寸放大视频(重新缩放)

我实际上在寻找的不仅是质量,还需要使用AV基础将整个视频调整为更高的分辨率。 我有一个MP4质量为320x240和176x144的视频,我想将视频的大小调整为1280x720 ,但是AVAssetExportSession类不允许将视频从较小的大小放大。
1回复

获取视频捕获IOS每一帧的红色强度

好吧,所以我有这个项目正在研究。 任务是使用IPhone / Ipad相机测量心率。 我正在尝试使用AVFoundation捕获视频,获取每一帧并求和该帧中每个像素的红色分量,然后将其除以大小即可得出平均值。 我首先设置视频 然后使用如下的委托方法: 但这似乎并没有给我