如何构建针对iOS优化的ffmpeg,可能使用硬件解码?

时间:2012-12-10 16:09:04

标签: ios ffmpeg

我为ios制作了一个基于FFMPEG的播放器。它在模拟器上工作正常,但在实际设备(iPhone 4)上,帧速率很低,使我的音频和视频不同步。播放器在iPhone 4s上工作正常,所以我猜这只是设备计算能力的问题。

那么,无论如何构建针对iOS设备优化的FFMPEG(armv7,arvm7s arch)?或者是否有利用ios设备硬件解码视频流?

我的视频流在H264 / AAC中编码。

1 个答案:

答案 0 :(得分:2)

这些流应该播放得很好,我假设你使用ffmpeg你没有使用iOS直接支持的视频协议。

我们使用ffmpeg来做rtsp / rtmp,我们用h264 / aac获得了良好的性能

有许多因素导致了av / sync问题,通常需要对视频进行某种类型的预缓冲,网络也是其中的重要部分。

至于你的第二个问题,硬件编码只能通过avfoundation获得,你可以使用avassetwriter对你的视频进行编码,但是再次依赖于你是否需要实时。

请参阅此链接https://github.com/mooncatventures-group/FFPlayer-beta1/blob/master/FFAVFrames-test/ViewController.m

-(void) startRecording {

    //  // create the AVComposition
    //  [mutableComposition release];
    //  mutableComposition = [[AVMutableComposition alloc] init];


    movieURL = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/%llu.mov", NSTemporaryDirectory(), mach_absolute_time()]];


    NSError *movieError = nil;
    assetWriter = [[AVAssetWriter alloc] initWithURL:movieURL 
                                            fileType: AVFileTypeQuickTimeMovie 
                                               error: &movieError];
    NSDictionary *assetWriterInputSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                              AVVideoCodecH264, AVVideoCodecKey,
                                              [NSNumber numberWithInt:FRAME_WIDTH], AVVideoWidthKey,
                                              [NSNumber numberWithInt:FRAME_HEIGHT], AVVideoHeightKey,
                                              nil];
    assetWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType: AVMediaTypeVideo
                                                          outputSettings:assetWriterInputSettings];
    assetWriterInput.expectsMediaDataInRealTime = YES;
    [assetWriter addInput:assetWriterInput];

    assetWriterPixelBufferAdaptor = [[AVAssetWriterInputPixelBufferAdaptor  alloc]
                                     initWithAssetWriterInput:assetWriterInput
                                     sourcePixelBufferAttributes:nil];
    [assetWriter startWriting];

    firstFrameWallClockTime = CFAbsoluteTimeGetCurrent();
    [assetWriter startSessionAtSourceTime:kCMTimeZero];
    startSampleing=YES;
}

现在的一个缺点是需要确定一种方法来在编写数据时将其读取,相信我,当我说有些开发人员在我写作时想要弄清楚如何做此