我为ios制作了一个基于FFMPEG的播放器。它在模拟器上工作正常,但在实际设备(iPhone 4)上,帧速率很低,使我的音频和视频不同步。播放器在iPhone 4s上工作正常,所以我猜这只是设备计算能力的问题。
那么,无论如何构建针对iOS设备优化的FFMPEG(armv7,arvm7s arch)?或者是否有利用ios设备硬件解码视频流?
我的视频流在H264 / AAC中编码。
答案 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;
}
现在的一个缺点是需要确定一种方法来在编写数据时将其读取,相信我,当我说有些开发人员在我写作时想要弄清楚如何做此