1

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

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

我的视频流采用 H264/AAC 编码。

4

1 回答 1

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;
}

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

于 2012-12-10T16:38:10.837 回答