我正在构建一个用于视频分析的iphone应用程序,我需要知道电影剪辑中帧的确切数量。
我得到了帧率和持续时间,出于某种原因,我得到了2880帧,但我知道电影剪辑实际上有2840帧。
怎样才能得到确切的帧数?
发布于 2011-11-08 19:17:07
嗯,这将取决于视频格式。
如果它是原始视频,那么PAL和SECAM规定25帧/秒(Fps),NTSC 29.97实际胶片是24fps。是隔行扫描还是逐行扫描?
它是否已经压缩,并因此使用帧编号的近似值?
编辑
啊,所以你的视频是H.264/MPEG4标准的AAC音频?索引数据保存在文件的"moov“部分中,该部分包含组成文件的所有索引和数据值。有关MPEG4标准的更多信息,请查看here
如果你能提取这些数据,它会告诉你每一帧的数据大小等等。
发布于 2011-11-08 19:16:18
确切的帧数通常写在文件中的某个位置,可以检索到。但是,视频文件可能包含更多或更少的帧。例如,你得到2880帧,你知道你应该得到2840帧。我的猜测是,一些时间戳是相等的。与上一帧具有相同时间戳的解码帧应被跳过/忽略。你检查过了吗?您还可以获得更少的报告帧。这意味着一些帧的持续时间比预期的要长。例如,如果以25 fps的速度录制影片剪辑,则一帧的持续时间为40毫秒。但是,在解压缩之后,您可能会得到持续时间为80的帧。这样帧确实应该有持续时间,或者它可以重复两次...
发布于 2016-03-31 13:42:46
这是iOS Determine Number of Frames in Video上节奏拳击手的另一个很好的答案。它在SWIFT中,但我已经尝试了bellow(Objective-C):
- (void)getTotalFramesFromVideo{
AVURLAsset* asset = [AVURLAsset assetWithURL:URL1];
NSError* errReader=nil;
AVAssetReader* reader = [AVAssetReader assetReaderWithAsset:asset error:&errReader];
if(!errReader){
AVAssetTrack* track = [asset tracksWithMediaType:AVMediaTypeVideo].firstObject;
AVAssetReaderOutput* readerOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:track outputSettings:nil];
[reader addOutput:readerOutput];
[reader startReading];
long long count = 0;
BOOL isAvailable = NO;
do {
CMSampleBufferRef ref = [readerOutput copyNextSampleBuffer];
if(ref){
isAvailable = YES;
count++;
}else{
isAvailable = NO;
}
} while (isAvailable == YES);
NSLog(@"Total Frames in your Video is %@",@(count));
}else{
NSLog(@"\nAVAssetReaderError:\n%@",errReader.localizedDescription);
}
}这可能会对像我这样想获得视频帧数的人有所帮助。
注意:您也可以在此方法中获取CMSampleBufferRef。
https://stackoverflow.com/questions/8049418
复制相似问题