iOS上でビデオコンテナのデコード手法をAssetReaderとVTDecompressSessionの比較を通して学びます。
7JEFPEFDPEFPOJ04QPUBUPUJQT!!OPQQFGPYXPMG
View Slide
OPQQF‣ !OPQQFGPYXPMG‣!͖ͭͶ͖‣ J04ΞϓϦ։ൃ̔%F/"‣ ιʔγϟϧϥΠϒࣄۀ෦!!OPQQFGPYXPMG
!!OPQQFGPYXPMG
OPQQFGPYXPMG,JUTVOFCJಁաಈը࠶ੜϏϡʔϥΠϒϥϦIUUQTHJUIVCDPNOPQQFGPYXPMG,JUTVOFCJ!!OPQQFGPYXPMG
,JUTVOFCJͷΈϏσΦͷσίʔυˠϚεΫ߹ˠඳը!!OPQQFGPYXPMG
,JUTVOFCJͷΈϏσΦͷσίʔυˠϚεΫ߹ˠඳըࠓ͜ͷลͷΛ͠·͢!!OPQQFGPYXPMG
ϏσΦϑΝΠϧͷલఏࣝྫ͑ɺNQNPWXNWෳͷϝσΟΞίϯςφͷू·ΓɺओʹಈըͱԻ͕֨ೲ͞Ε͍ͯΔͷ͕ҰൠతͳϑΥʔϚοτଞʹࣈນ੩ࢭըͷίϯςφؚ͕·ΕΔ͜ͱ͋Δ!!OPQQFGPYXPMG
ϏσΦϑΝΠϧͷલఏࣝ!!OPQQFGPYXPMG
ϏσΦϑΝΠϧͷσίʔυͱϝσΟΞίϯςφΛ࠶ੜग़དྷΔঢ়ଶʹ෮ݩ͢Δ‣ ϏσΦίϯςφ͔Β̍ϑϨʔϜ͝ͱͷը૾Λऔಘ‣ Իίϯςφ͔ΒԻใΛऔಘ‣ ࣈນίϯςφ͔ΒจࣈྻΛऔಘFUD͜ΕΒΛߦͬͯಈըͱͯ͠࠶ੜ͢Δ!!OPQQFGPYXPMG
ϏσΦͷίʔσοΫϏσΦίϯςφͷූ߸ԽʢΤϯίʔυʣํ๏ෳ͋Δɻྫ͑ɺII71ίʔσοΫͷҧ͍ʹΑͬͯѹॖॲཧʹඞཁͳύϫʔ͕มΘΔɻ!!OPQQFGPYXPMG
J04ͰͷϏσΦίϯςφͷσίʔυํ๏‣ "7"TTFU3FBEFS‣ 75%FDPNQSFTTJPO4FTTJPO‣ ⒎NQFH!!OPQQFGPYXPMG
ରԠίʔσοΫͷ֬ೝ͜ΕΒͷϑϨʔϜϫʔΫ෦Ͱ04ͷσίʔμͷ࣮Λར༻͍ͯ͠Δɻಉ͡NQͰ)͔)Έ͍ͨͳίʔσοΫͷҧ͍͕͋Γɺ04ʹΑͬͯαϙʔτ͕ҟͳΔͷͰҙɻ!!OPQQFGPYXPMG
ྫ͑)&7$Ұ෦ͷνοϓͰ͔͠ϋΠύϑΥʔϚϯεͳσίʔυΛ͢Δ͜ͱ͕Ͱ͖ͳ͍ɻ!!OPQQFGPYXPMG
ରԠίʔσοΫͷ֬ೝެࣜαΠτͷ4QFDΈΕαϙʔτ͍ͯ͠ΔίʔσοΫ͕Θ͔ΔɻରԠίʔσοΫΛऔಘ͢Δϝιουݟ͔ͭΒͳ͔ͬͨɻ!IUUQTXXXBQQMFDPNKQJQIPOFYTQFDTͱ͔!!OPQQFGPYXPMG
"7"TTFU3FBEFSlet reader = try! AVAssetReader(asset: asset)let output = AVAssetReaderTrackOutput(track: asset.videoTrack)reader.add(output)reader.startReading()output.copyNextSampleBuffer()output.copyNextSampleBuffer()output.copyNextSampleBuffer()...ͱͯ؆୯DPQZ/FYU4BNQMF#V⒎FSΛݺͿͨͼʹऔΕΔϑϨʔϜͷλΠϜελϯϓ͕ਐΉ!!OPQQFGPYXPMG
"7"TTFU3FBEFSͷಛ‣ ରԠίʔσοΫͰ͋ΕίʔσοΫΛؾʹͤͣʹσίʔυͰ͖Δ‣ ඇৗʹ؆୯ͳΠϯλʔϑΣΠε‣ ࣍ͷTBNQMF#V⒎FS͔͠औΕͳ͍!!OPQQFGPYXPMG
75%FDPNQSFTTJPO4FTTJPOͷಛϨΠϠʔͷϏσΦσίʔυ༻ϑϨʔϜϫʔΫଟ"7"TTFU3FBEFS"7"TTFU3FBEFS5SBDL0VUQVU͜ΕΛ͍ͬͯΔʁෳࡶͰ໘ͳΘΓʹॊೈੑ͕ߴ͍!!OPQQFGPYXPMG
75%FDPNQSFTTJPO4FTTJPOͷྲྀΕ IBWDΛׂ ө૾ؚ͕·ΕΔνϟϯΫΛऔΓग़͢ 75%FDPNQSFTTJPO4FTTJPOΛੜ νϟϯΫΛ4FTTJPOʹ͢ σίʔυࡁΈͷ*NBHF#V⒎FS͕ίʔϧόοΫʹฦ͞αϯϓϧͰྫͱͯ͠ΩʔϑϨʔϜΛऔΓग़͍ͯ͠Δ!!OPQQFGPYXPMG
IBWDΛׂ/"-pMFGPSNBU!!OPQQFGPYXPMG
ө૾ؚ͕·ΕΔνϟϯΫΛऔΓग़͢/"-ͷϔομΛࢀরͯ͠Yͷͷ͕ΩʔϑϨʔϜΛ͍࣋ͬͯΔɻࠩใ͕ෆཁͳશͳϑϨʔϜ!!OPQQFGPYXPMG
OBMVOJUUZQF*40*&$ͰఆٛIUUQXXXTUBSPDFBOTPSHFCPPL*40QEG!!OPQQFGPYXPMG
75%FDPNQSFTTJPO4FTTJPOΛੜVTDecompressionSessionCreate(_:, _:, _:, _:, _:, _:)ҾʹίʔϧόοΫઌϑϨʔϜͷใ QJYFM'PSNBU)ͷύϥϝʔλ͕ඞཁ!!OPQQFGPYXPMG
νϟϯΫΛ4FTTJPOʹ͢CMSampleBufferCreateReady(sampleBuffer)VTDecompressionSessionDecodeFrame(_:, _:, _:, _:, &sampleBuffer)CZUFྻΛ͢ࣄग़དྷͳ͍ͷͰɺCZUFྻ͔Β࡞ͬͨ#MPDL#V⒎FSΛݩʹ4BNQMF#V⒎FSΛ࡞Γ͢ɻ!!OPQQFGPYXPMG
σίʔυࡁΈͷ*NBHF#V⒎FS͕ίʔϧόοΫʹฦ͞ΕΔcallback.decompressionOutputCallback = { (_, _, _, _, imageBuffer, _, _) in// imageBuffer}4FTTJPOʹొͨ͠DBMMCBDLσίʔυ͞ΕͨJNBHF#V⒎FS͕ฦͬͯ͘Δ!!OPQQFGPYXPMG
1SPT$POT&BTZ 4USFBNJOH 1FSGPSNBODF $VTUPNJ[F"7"TTFU3FBEFSP Y P ˚75%FDPNQSFTTJPO4FTTJPOY P P PϦϞʔτͷΞηοτͷQJYFM#V⒎FSऔΕͳ͍!!OPQQFGPYXPMG
75%FDPNQSFTTJPO4FTTJPO‣ ετϦʔϛϯάͰΩϟϓνϟ͕औΕΔ‣ "7"TTFU3FBEFSʹόά͕͋ͬͯେৎ‣ ࢄͯ͠Τϯίʔυ͍ͨ࣌͠ͱ͔ʹศར‣ ΤϥʔνΣοΫͱ͔ͪΌΜͱ͠ͳ͍ͱ͍͚ͳ͍!!OPQQFGPYXPMG
)%FDPEF4BNQMFIUUQTHJUIVCDPNOPQQFGPYXPMG)%FDPEF4BNQMF!!OPQQFGPYXPMG
OPQQFGPYXPMG,JUTVOFCJVTDecompressionSessionະαϙʔτύϑΥʔϚϯεʹҰఆͷޮՌ͕͋Γͦ͏Ͱ͋Ε࣮༧ఆ!!OPQQFGPYXPMG
J04%$ͷ$G1ग़ͯ͠Έ·ͨ͠ɻࠓճͷͷ΄͔ɺ,JUTVOFCJΛ.FUBMରԠͤͯ͞Ͳ͏ͳΔͷ͔ͱ͔ൺֱͯ͠Έ͍ͨͱࢥ͍ͬͯ·͢!!OPQQFGPYXPMG