AVAssetImageGenerator copyCGImageAtTime:actualTime:error: generates 8-bit images from 10-bit video
AVAssetImageGenerator copyCGImageAtTime:actualTime:error: generates 8-bit images from 10-bit video
我的 Mac 上有一个 10 位视频,我想提取帧 完整的 10-bit/channel 数据。我加载我的资产,并验证它是 10 位的:
CMFormatDescriptionRef formatDescriptions = (__bridge CMFormatDescriptionRef)(track.formatDescriptions[0]);
float frameRate = track.nominalFrameRate;
int bitDepth = ((NSNumber*)CMFormatDescriptionGetExtension(formatDescriptions, (__bridge CFStringRef)@"BitsPerComponent")).intValue;
bitDepth
对于很多视频来说是 8,但是对于这个视频来说是 10(我 知道 我无论如何都是用 10 位录制的),所以 AVFoundation
正确识别通道位深度。
但是,我想使用 AVAssetImageGenerator
的 copyCGImageAtTime:actualTime:error:
方法从视频中生成单帧:
NSError *err;
NSImage *img = [[NSImage alloc] initWithCGImage:[imageGenerator copyCGImageAtTime:time actualTime:NULL error:&err] size:dimensions];
图像生成成功,没有错误,但是当我检查它时,我看到它是 8 bits/channel:
(lldb) po img
<NSImage 0x600001793f80 Size={3840, 2160} Reps=(
"<NSCGImageSnapshotRep:0x6000017a5a40 cgImage=<CGImage 0x100520800>
(DP)\n\t<<CGColorSpace 0x60000261ae80> (kCGColorSpaceICCBased;
kCGColorSpaceModelRGB; Composite NTSC)>\n\t\twidth = 3840, height = 2160,
bpc = 8, bpp = 32, row bytes = 15360
\n\t\tkCGImageAlphaPremultipliedFirst | kCGImageByteOrder32Big |
kCGImagePixelFormatPacked \n\t\tis mask? No, has masking color? No,
has soft mask? No, has matte? No, should interpolate? Yes>"
)>
如何从 10 位视频生成完整的无损 10 位(或者,为了兼容,16 位或 32 位)帧?
我使用的是 macOS 10.14。
由于缺乏这方面的任何信息,我放弃了 AVAssetImageGenerator
并开始在我的应用程序中嵌入 ffmpeg
并调用它来提取 10 位帧。
我的 Mac 上有一个 10 位视频,我想提取帧 完整的 10-bit/channel 数据。我加载我的资产,并验证它是 10 位的:
CMFormatDescriptionRef formatDescriptions = (__bridge CMFormatDescriptionRef)(track.formatDescriptions[0]);
float frameRate = track.nominalFrameRate;
int bitDepth = ((NSNumber*)CMFormatDescriptionGetExtension(formatDescriptions, (__bridge CFStringRef)@"BitsPerComponent")).intValue;
bitDepth
对于很多视频来说是 8,但是对于这个视频来说是 10(我 知道 我无论如何都是用 10 位录制的),所以 AVFoundation
正确识别通道位深度。
但是,我想使用 AVAssetImageGenerator
的 copyCGImageAtTime:actualTime:error:
方法从视频中生成单帧:
NSError *err;
NSImage *img = [[NSImage alloc] initWithCGImage:[imageGenerator copyCGImageAtTime:time actualTime:NULL error:&err] size:dimensions];
图像生成成功,没有错误,但是当我检查它时,我看到它是 8 bits/channel:
(lldb) po img
<NSImage 0x600001793f80 Size={3840, 2160} Reps=(
"<NSCGImageSnapshotRep:0x6000017a5a40 cgImage=<CGImage 0x100520800>
(DP)\n\t<<CGColorSpace 0x60000261ae80> (kCGColorSpaceICCBased;
kCGColorSpaceModelRGB; Composite NTSC)>\n\t\twidth = 3840, height = 2160,
bpc = 8, bpp = 32, row bytes = 15360
\n\t\tkCGImageAlphaPremultipliedFirst | kCGImageByteOrder32Big |
kCGImagePixelFormatPacked \n\t\tis mask? No, has masking color? No,
has soft mask? No, has matte? No, should interpolate? Yes>"
)>
如何从 10 位视频生成完整的无损 10 位(或者,为了兼容,16 位或 32 位)帧?
我使用的是 macOS 10.14。
由于缺乏这方面的任何信息,我放弃了 AVAssetImageGenerator
并开始在我的应用程序中嵌入 ffmpeg
并调用它来提取 10 位帧。