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



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

那么,有没有办法构建针对iOS设备(armv7,arvm7s arch)优化的FFMPEG? 还是无论如何利用iOS设备硬件来解码视频流?

我的视频流以 H264/AAC 编码。

这些流应该可以播放得很好,我认为由于您使用 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;
}

现在的一个缺点是需要确定一种方法来读取正在写入的编码数据,请相信我,当我说我们中的一些人在写这篇文章时试图弄清楚如何做到这一点。

最新更新