$7#V⒎FSͷ30110/(*TXJGUୈճձ
View Slide
OPQQF!1PDPDIBJ04ΤϯδχΞ"͖ͭͶ͔Θ͍͍#30110/(*TXJGUॳࢀઓ$J04%$ͰඳըपΓͷΛ͠·ͨ͠W
ಈըΛѻ͏ػձͷ૿Ճw ಈը৴ΞϓϦIFWDͷొɺ$PSF7JEFPʹ৮ΕΔػձ͕૿͍͑ͯΔw σʔλϝσΟΞΛѻ͏#V⒎FSܥΫϥεͷར༻ස૿Ճw ΈΜͳɺؾ࣋ͪͰ$71JYFM#V⒎FSΛ͍ͬͯ·ͤΜ͔ʁ
#V⒎FSܥΫϥεͷۙگw ݹ͍ΫϥεͳͷͰɺ΄΅มߋͳ͍w ͔͠͠ڥมԽɺΫϥΠΞϯτͰͷσίʔυ0QFO(-&4.FUBMͷσʔλ͠ʹར༻͞ΕΔ
$7#V⒎FS
$7#V⒎FSw $7#V⒎FSͷ$7$PSF7JEFPͷ$7σʔλόοϑΝΛ৮Βͣʹ؆୯ʹಡΈॻ͖͢ΔͨΊͷ*'
දతͳ$7#V⒎FSͷੜw $7*NBHF#V⒎FSw $71JYFM#V⒎FSw $70QFO(-&45FYUVSF
$7#V⒎FS͡Όͳ͍ํw $.4BNQMF#V⒎FS͜Εҧ͏w $.#MPDL#V⒎FS͜Εҧ͏
ͲΜͳ࣌ʹऔಘͰ͖Δͷ͔DJ*NBHFQJYFM#V⒎[email protected]ͱ͔MFUJC$.4BNQMF#V⒎FS(FU*NBHF#V⒎FS TC
$7#V⒎FSͷਖ਼ମw $7*NBHF#V⒎FSpublic typealias CVImageBuffer = CVBufferw $71JYFM#V⒎FSpublic typealias CVPixelBuffer = CVImageBufferw $70QFO(-&45FYUVSFpublic typealias CVOpenGLESTexture = CVImageBuffer
$71JYFM#V⒎FSWT$7*NBHF#V⒎FSw 2UZQFBMJBTͳΜͩ͠ಉ͡Ͱ͠ΐʁw "ԶʹΘ͔ΒΜ
$71JYFM#V⒎FSWT$7*NBHF#V⒎FSw $71JYFM#VGGFSϝϞϦͷϐΫηϧόοϑΝʹΞΫηε͢ΔͨΊͷΫϥεw $7*NBHF#VGGFSϝϞϦͷը૾ʹΞΫηε͢ΔͨΊͷΫϥε
ϐΫηϧใΞΫηεͷྫw ॎԣͷαΠζw σʔλαΠζը૾ΞΫηεͷྫw Χϥʔεϖʔε
υΩϡϝϯτ$7*NBHF#VGGFS(FU%JTQMBZ4J[F @"$(4J[FTUSVDUVSFEFpOJOHUIFOPNJOBMEJTQMBZTJ[FPGUIFCV⒎FS3FUVSOT[FSPTJ[FJGDBMMFEXJUIBOPO$7*NBHF#VGGFS3FGUZQFPS/6--
ݕূvar pb: CVPixelBuffer? = nilCVPixelBufferCreate(kCFAllocatorDefault,128, 128,kCVPixelFormatType_32BGRA, nil, &pb)CVImageBufferGetDisplaySize(pb!)// -> (128.0, 128.0)
ؾ࣋ͪͰ͍ͬͯΔ
6**NBHFͱͷҧ͍
6**NBHFͱͷҧ͍w $7#V⒎FSΞυϨεΛࢀর͍ͯ͠Δ͚ͩͳͷͰɺϩοΫ͢Δ͕ίϐʔΩϟογϡ͞Εͳ͍தؒϨϯμϦϯάউखʹ͞Εͳ͍ϏσΦͷΑ͏ʹߴʹॲཧ͢Δඞཁ͕͋ΔՕॴʹ࠷ద
ΞυϨεͷϩοΫ$7#V⒎FSͷσʔλόοϑΝʹ$16͔ΒΞΫηε͢Δ߹ΞυϨεΛϩοΫ͢Δඞཁ͕͋ΔCVPixelBufferLockBaseAddress(pb, .readOnly)defer { CVPixelBufferUnlockBaseAddress(pb, .readOnly) }
$71JYFM#V⒎FSͷதΛදࣔ͢Δ
Ұ൪؆୯ͳํ๏$71JYFM#V⒎FS$**NBHF6**NBHFCIImage(cvPixelBuffer: CVPixelBuffer)UIImage(ciImage: ciImage)
.FUBMͰදࣔ͢ΔCVMetalTextureCacheܦ༝Ͱ$71JYFM#V⒎FS.5-5FYUVSF.5,7JFXͳͲͰදࣔ
0QFO(-&4Ͱදࣔ͢ΔCVOpenGLESTextureCacheܦ༝Ͱ$71JYFM#V⒎FS0QFO(-&45FYUVSF(-,7JFXͳͲͰදࣔ
$.4BNQMF#V⒎FSͱ
$.4BNQMF#V⒎FSͱɾඞͣ͠$71JYFM#V⒎FS͕ೖ͍ͬͯΔͱݶΒͳ͍
ͦ͏ͱࢥ͍ͬͯͨɾ$71JYFM#V⒎FS͔Β$.4BNQMF#V⒎FSΛ࡞ΔɾϢʔεέʔεɾར