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