Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
MediaCodecで動画編集をしてみよう
Search
Masayuki Suda
February 08, 2018
Programming
3
4.5k
MediaCodecで動画編集をしてみよう
DroidKaigi 2018でプレゼンさせていただいたスライドです。
Masayuki Suda
February 08, 2018
Tweet
Share
More Decks by Masayuki Suda
See All by Masayuki Suda
Kotlin 2.0が与えるAndroid開発の進化
masayukisuda
2
1.8k
Kotlin Collection関数をマスター
masayukisuda
1
5.1k
Jetpack Macrobenchmarkを試してみた
masayukisuda
1
280
Androidで動画編集アプリの技術選択
masayukisuda
1
1.3k
Other Decks in Programming
See All in Programming
BEエンジニアがFEの業務をできるようになるまでにやったこと
yoshida_ryushin
0
190
Simple組み合わせ村から大都会Railsにやってきた俺は / Coming to Rails from the Simple
moznion
3
2.1k
Оптимизируем производительность блока Казначейство
lamodatech
0
950
return文におけるstd::moveについて
onihusube
1
1.4k
PHPUnitしか使ってこなかった 一般PHPerがPestに乗り換えた実録
mashirou1234
0
420
DevFest - Serverless 101 with Google Cloud Functions
tunmise
0
140
ATDDで素早く安定した デリバリを実現しよう!
tonnsama
1
1.8k
PHPで作るWebSocketサーバー ~リアクティブなアプリケーションを知るために~ / WebSocket Server in PHP - To know reactive applications
seike460
PRO
2
770
rails newと同時に型を書く
aki19035vc
5
710
asdf-ecspresso作って 友達が増えた話 / Fujiwara Tech Conference 2025
koluku
0
1.3k
テストコード書いてみませんか?
onopon
2
340
良いユニットテストを書こう
mototakatsu
11
3.6k
Featured
See All Featured
Adopting Sorbet at Scale
ufuk
74
9.2k
Testing 201, or: Great Expectations
jmmastey
41
7.2k
Documentation Writing (for coders)
carmenintech
67
4.5k
The Power of CSS Pseudo Elements
geoffreycrofte
74
5.4k
How to train your dragon (web standard)
notwaldorf
89
5.8k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
7
570
Large-scale JavaScript Application Architecture
addyosmani
510
110k
What's in a price? How to price your products and services
michaelherold
244
12k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
3
240
Become a Pro
speakerdeck
PRO
26
5.1k
Rails Girls Zürich Keynote
gr2m
94
13k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
Transcript
.FEJB$PEFDͰಈըฤूΛͯ͠ΈΑ͏ %SPJE,BJHJ EBBTVV
ॳొஃʂʂ
ࣗݾհ $$IBOOFMגࣜձࣾ "OESPJE&OHJOFFS݉1. ਢాխ೭ ʮNZTUBʯΤϯλϝಈըΞϓϦ ʮ4PEBʯಈըฤूΞϓϦ .BTBZVLJ4VEB EBBTVV
ࠓͷΰʔϧ "OESPJEΞϓϦΛ࡞ΕΔਓ͕ɺ .FEJB$PEFDͰϑΟϧλʔ͕͔͔ͬͨΓɺ ΥʔλʔϚʔΫΛ͚ͭͨಈըΛ࡞ΕΔͷʹ ඞཁͳٕज़Λཧղ͢Δɻ
.Q$PNQPTFSBOESPJE ɾ؆୯ʹ.QʹϑΟϧλʔΥʔλʔϚʔΫ ɹ͕͚ͭΒΕΔ ɾຊͨ͠༰ͷಈ͘αϯϓϧʹ IUUQTHJUIVCDPN.BTBZVLJ4VEB.Q$PNQPTFSBOESPJE
// ΥʔλʔϚʔΫ new Mp4Composer(srcMp4Path, destMp4Path) .filter( new GlWatermarkFilter(watermarkBitmap, Position.RIGHT_BOTTOM) )
.start(); // ηϐΞϑΟϧλʔ new Mp4Composer(srcMp4Path, destMp4Path) .filter(new GlSepiaFilter()) .start(); .Q$PNQPTFSBOESPJE IUUQTHJUIVCDPN.BTBZVLJ4VEB.Q$PNQPTFSBOESPJE
࣍ ᶃಈըͱ ᶄಈըฤूͷجૅࣝ ᶅ.FEJB$PEFDͷϙΠϯτ ᶆ0QFO(-&4ͷϙΠϯτ ᶇಈըʹϑΟϧλʔΛ͔͚Δ ᶈಈըʹΥʔλʔϚʔΫΛ͚ͭΔ ᶉ࠷ޙʹ
ಈըͱԻʴө૾ ᶃಈըͱ ը૾ग़యɹ"WJ6UJMͷқ͍͍͠ํ ɹIUUQBWJVUMJOGPEPVHBLFJTJLJLPOOUFOB
ө૾ͱը૾ͷू߹ମ ը૾ग़యɹ"WJ6UJMͷқ͍͍͠ํ ɹIUUQBWJVUMJOGPEPVHBLFJTJLJLPOOUFOB ᶃಈըͱ
࣍ ᶃಈըͱ ᶄಈըฤूͷجૅࣝ ᶅ.FEJB$PEFDͷϙΠϯτ ᶆ0QFO(-&4ͷϙΠϯτ ᶇಈըʹϑΟϧλʔΛ͔͚Δ ᶈಈըʹΥʔλʔϚʔΫΛ͚ͭΔ ᶉ࠷ޙʹ
ᶄಈըฤूͷجૅࣝ ಈըฤूͰ͓͍͑ͨ͞༻ޠͭ ᶃ&ODPEF ᶄ$PEFD ɹ ᶅ%FDPEF ᶆ.VYFS
ɾѹॖΛͯ͠ɺಈըϑΝΠϧΛখ͘͢͞Δߦҝɻ ɾө૾ը૾ͷू߹ମɻGQTͰͷಈըͩͱ ຕͷը૾ʹͳΔɻ୯७ʹͦͷ··ॲཧΛ ͯ͠͠·͏ͱɺେͳ༰ྔʹͳͬͯ͠·͏ɻ ͦΕΛ͙ ಈըฤूͰͷ༻ޠͭ ᶃ&ODPEF ᶄಈըฤूͷجૅࣝ
ᶄ$PEFD ɾ&ODPEF ѹॖ ͢ΔࡍͷΞϧΰϦζϜ ɾ).1&("7$ͷ͜ͱΛࢦ͢ ɾ"OESPJEҎ߱ɺ.FEJB$PEFD) ɹʹ΄΅શରԠ ಈըฤूͰͷ༻ޠͭ ᶄಈըฤूͷجૅࣝ
ಈըฤूͰͷ༻ޠ ᶅ%FDPEF ɾ&ODPEF ѹॖ ͞ΕͨಈըΛ෮ݩ͢Δߦҝ ɾಈը࠶ੜಈըϑΝΠϧΛ%FDPEFΛ ɹ͞Εͯ࠶ੜ͞Ε͍ͯΔ ᶄಈըฤूͷجૅࣝ
ಈըฤूͰͷ༻ޠ ᶆ.VYFS ɾΤϯίʔυͨ͠ʮө૾ʯͱʮԻʯΛͭͷ ɹಈըϑΝΠϧͱͯ͠·ͱΊΔ ᶄಈըฤूͷجૅࣝ
ɾಈըΛ%FDPEF͢Δɺը૾ʹల։͢Δɻ ɹˣ ɾల։ͨ͠ը૾ʹϑΟϧλʔΛ͔͚Δ ɹˣ ɾฤूͨ͠ը૾Λ&ODPEF ѹॖ ͯ͠ө૾ʹ͢Δ ɹˣ ɾ&ODPEFͨ͠ө૾ͱԻΛಈըϑΝΠϧʹ͢Δ ɹ
.VYFS ಈըʹϑΟϧλʔΛ͔͚ΔTUFQ ᶄಈըฤूͷجૅࣝ
࣍ ᶃಈըͱ ᶄಈըฤूͷجૅࣝ ᶅ.FEJB$PEFDͷϙΠϯτ ᶆ0QFO(-&4ͷϙΠϯτ ᶇಈըʹϑΟϧλʔΛ͔͚Δ ᶈಈըʹΥʔλʔϚʔΫΛ͚ͭΔ ᶉ࠷ޙʹ
ᶃ.FEJB&YUSBDUPSͰը૾Λ̍ຕ̍ຕऔΓग़͢ ᶄ.FEJB&YUSBDUPS͔Βड͚औͬͨσʔλΛ%FDPEFSͰ4VSGBDF5FYUVSF ʹ͠ɺͦ͜ʹϑΟϧλʔΛ͔͚Δɻ&ODPEFSͰ༻ҙͨ͠(-$POUFYUʹඳըɻ ᶅ.FEJB.VYFSͰ.1ϑΝΠϧʹ͢Δɻ ᶅ.FEJB$PEFDͷϙΠϯτ ը૾࡞ࢀߟݩɹ "OESPJEͰ.FEJB$PEFDΛ͍''NQFHͳ͠ͰಈըΛѹॖ͢Δํ๏ʢϥΠϒϥϦ͋Γʣɹ IUUQTRJJUBDPNZVZB@QSFTUPJUFNTEFDCE .1 .FEJB
&YUSBDUPS .FEJB$PEFD %FDPEFS 0QFO(-&4$POUFYU 'JMUFS %FDPEFS4VSGBDF &ODPEFS4VSGBDF .FEJB$PEFD &ODPEFS .FEJB .VYFS .1 4VSGBDF5FYUVSF 4XBQ#V⒎FS ESBX #ZUF#V⒎FS #ZUF#V⒎FS .Q$PNQPTFSͷΞʔΩςΫνϟ
ᶅ.FEJB$PEFDͷϙΠϯτ ͭͷओཁ$MBTTΛΈ߹ΘͤͯಈըฤूΛߦ͏ ɾ.FEJB&YUSBDUPS ɾ.FEJB$PEFD ɾ.FEJB.VYFS
ᶅ.FEJB$PEFDͷϙΠϯτ ɾ.FEJB&YUSBDUPS ɹׂͱͯ͠%FDPEFͷҰ෦Λ୲͏ɻ ɹ ɹฤूݩͷಈը͔ΒԻσʔλͱө૾ຕຕΛ#ZUF#V⒎FS Ͱ.FEJB$PEFDʹ͢ɻ ɹ.FEJB$PEFDͰѻ͑ΔҰ୯Ґ TBNQMF ͣͭ͠·͢ɻ
ᶅ.FEJB$PEFDͷϙΠϯτ ɾ.FEJB$PEFD ɹׂͱͯ͠%FDPEFͷҰ෦ͱ&ODPEFΛ୲͏ ɹ%FDPEFͱ&ODPEFͦΕͧΕผͷΠϯελϯεͰ୲͏ɻ ɹ ɹ.FEJB&YUSBDUPS͔Βड͚औͬͨ#ZUF#V⒎FSΛ ɹ%FDPEF͢ΔΠϯελϯεͰडऔɺ0QFO(-&4 5FYUVSF 4VSGBDF5FYUVSF ͱͯ͠ల։͢Δɻ
ɹ&ODPEF͢ΔΠϯελϯεͰ༻ҙͨ͠(-$POUFYUͰ ɹ5FYUVSFΛඳը͢Δɻ
ᶅ.FEJB$PEFDͷϙΠϯτ ɾ.FEJB.VYFS .FEJB$PEFD͔Βฤू͞ΕͨԻɺө૾Λ#ZUF#V⒎FSͰ ɹडऔɺҰͭͷϑΝΠϧίϯςφΛੜ͢Δɻ ɹ
.FEJB&YUSBDUPSͷ େࡶͳίʔυͷྲྀΕ // Πϯελϯεੜ mediaExtractor = new MediaExtractor(); // ಈըฤूݩͷϑΝΠϧΛFileDescriptorܗࣜͰηοτ͢Δɻ
mediaExtractor.setDataSource(inputFileDescriptor); // Decoder(MediaCodec)ͷ࡞ MediaFormat inputFormat = mediaExtractor.getTrackFormat(trackIndex); decoder = MediaCodec.createDecoderByType(inputFormat.getString(MediaFormat.KEY_MIME)); // Decoderʹ͢ByteBufferΛ࡞ decoderInputBuffers = decoder.getInputBuffers(); // sample (MediaCodecͰѻ͑Δ1୯Ґ)ͷαΠζΛऔಘ int result = decoder.dequeueInputBuffer(0); int sampleSize = mediaExtractor.readSampleData(decoderInputBuffers[result], 0); // DecoderʹDataΛ͢ boolean isKeyFrame = (mediaExtractor.getSampleFlags() & MediaExtractor.SAMPLE_FLAG_SYNC) != 0; decoder.queueInputBuffer(result, 0, sampleSize, mediaExtractor.getSampleTime(), isKeyFrame ? MediaCodec.BUFFER_FLAG_SYNC_FRAME : 0); // ࣍ͷsampleσʔλʹਐΉ mediaExtractor.advance(); ᶅ.FEJB$PEFDͷϙΠϯτ
// MediaExtractor͔ΒडऔɺॲཧࡁΈͷOutput BufferΛऔಘ int result = decoder.dequeueOutputBuffer(bufferInfo, 0); // 2ͭΊͷҾSurfaceʹtextureΛඳը͢Δ͔Ͳ͏͔
decoder.releaseOutputBuffer(result, true); // ඳը͞Εͨtextureͷ౸ணͪ decoderSurface.awaitNewImage(); // textureΛOpenGLͰඳը decoderSurface.drawImage(); // ඳը͞ΕΔ࣌ؒΛࢦఆ encoderSurface.setPresentationTime(bufferInfo.presentationTimeUs * 1000); // ݱࡏඳը͞Ε͍ͯΔ༰ΛEncoderʹૹ৴ encoderSurface.swapBuffers(); // encoderͰඳըใΛडऔΔ encoder.dequeueOutputBuffer(bufferInfo, 0); encoderOutputBuffers = encoder.getOutputBuffers(); // encoderͷoutputBufferΛMediaMuxerʹͯ͠ɺmp4ϑΝΠϧʹ͢Δ muxRender.writeSampleData(MuxRender.SampleType.VIDEO, encoderOutputBuffers[result], bufferInfo); ᶅ.FEJB$PEFDͷϙΠϯτ .FEJB$PEFDɹ.FEJB.VYFSͷ େࡶͳίʔυͷྲྀΕ
࣍ ᶃಈըͱ ᶄಈըฤूͷجૅࣝ ᶅ.FEJB$PEFDͷϙΠϯτ ᶆ0QFO(-&4ͷϙΠϯτ ᶇಈըʹϑΟϧλʔΛ͔͚Δ ᶈಈըʹΥʔλʔϚʔΫΛ͚ͭΔ ᶉ࠷ޙʹ
.1 .FEJB &YUSBDUPS .FEJB$PEFD %FDPEFS 0QFO(-&4$POUFYU 'JMUFS %FDPEFS4VSGBDF &ODPEFS4VSGBDF .FEJB$PEFD
&ODPEFS .FEJB .VYFS .1 4VSGBDF5FYUVSF 4XBQ#V⒎FS ESBX #ZUF#V⒎FS #ZUF#V⒎FS ᶆ0QFO(-&4ͷϙΠϯτ
ᶆ0QFO(-&4ͷϙΠϯτ ɾ0QFO(-&4ͱɺ0QFO(-ͷܞଳ͚ͷαϒηοτ൛ɻ ,ISPOPT(SPVQ͕༷ࡦఆ ɾ(16ͷ֤ԋࢉϢχοτશ͘ಉ͡ϓϩάϥϜΛҟͳΔσʔλ ʹରͯ͠ฒྻ࣮ߦ͠·͢ɻ ɾෳࡶͳӄӨॲཧඳըΤϑΣΫτͷࡍɺ(16ͷࢧԉʹΑͬͯ ɹ࣮ߦ͍ͯͨ͘͠ΊɺϚϧνίΞ$16ΑΓ༏Εͨ ɹύϑΥʔϚϯεΛൃش
ᶆ0QFO(-&4ͷϙΠϯτ ϑΟϧλʔΛ͔͚ΔશͯͷϐΫηϧʹॲཧΛՃ͑Δ
ᶆ0QFO(-&4ͷϙΠϯτ ը૾ग़యɹϚΠφϏχϡʔε %άϥϑΟοΫɾϚχΞοΫε ɹIUUQTOFXTNZOBWJKQBSUJDMFHSBQIJDT 0QFO(-&4Ͱͷඳը·ͰͷྲྀΕ ใΛ༻ҙ %σΟεϓϨΠͷͲ͜ʹඳը͢ΔҐஔͷܾఆ ֤ϐΫηϧຖͷ৭Λܾఆ
ᶆ0QFO(-&4ͷϙΠϯτ 0QFO(-&4Ͱͷඳը·ͰͷྲྀΕ ใΛ༻ҙ private final float[] triangleVerticesData = { //
X, Y, Z, U, V -1.0f, -1.0f, 0, 0.f, 0.f, 1.0f, -1.0f, 0, 1.f, 0.f, -1.0f, 1.0f, 0, 0.f, 1.f, 1.0f, 1.0f, 0, 1.f, 1.f, };
(-1,1,0) +y +x (1,1,0) (1,-1,0) (-1,-1,0) +z (0,0) (1,0) (0,1)
67࠲ඪ ࠲ඪ ᶆ0QFO(-&4ͷϙΠϯτ 0QFO(-&4Ͱͷඳը·ͰͷྲྀΕ ใΛ༻ҙ ը૾࡞ࢀߟݩɹ ͚Μ͝ͷ͓ෑɹςΫενϟϚοϐϯά IUUQULFOHPHJUIVCJPCMPHPQFOHMFTELOPXMFEHF
ᶆ0QFO(-&4ͷϙΠϯτ 7FSUFY4IBEFSͰߦ͏ 0QFO(-&4Ͱͷඳը·ͰͷྲྀΕ %σΟεϓϨΠͷͲ͜ʹඳը͢ΔҐஔͷܾఆ
7FSUFY4IBEFS VOJGPSNNBUV.71.BUSJY֦େճసͳͲͷม࠲ඪ VOJGPSNNBUV45.BUSJYσίʔυͨ͠ςΫενϟͷߦྻ BUUSJCVUFWFDB1PTJUJPOY Z [ͷ࠲ඪ BUUSJCVUFWFDB5FYUVSF$PPSEV W࠲ඪ WBSZJOHWFDW5FYUVSF$PPSE'SBHNFOU4IBEFSʹ͢࠲ඪ WPJENBJO
\ HM@1PTJUJPOV.71.BUSJY B1PTJUJPO W5FYUVSF$PPSE V45.BUSJY B5FYUVSF$PPSE YZ ^ ᶆ0QFO(-&4ͷϙΠϯτ ɾมߦྻͱ࠲ඪΛܭࢉ͠ɺҐஔΛܾఆ ɾςΫενϟͷ67࠲ඪͷܾఆΛ'SBHNFOU4IBEFS͢
ᶆ0QFO(-&4ͷϙΠϯτ มߦྻͱ ը૾ग़య͚Μ͝ͷ͓ෑɹ όʔςοΫεγΣʔμʹΑΔ࠲ඪܥมɹ IUUQULFOHPHJUIVCJPCMPHPQFOHMFTELOPXMFEHF
ᶆ0QFO(-&4ͷϙΠϯτ มߦྻͱ private float[] MVPMatrix = new float[16]; // ୯Ґߦྻͷੜ
Matrix.setIdentityM(MVPMatrix, 0); // ฒߦҠಈ Matrix.translateM(MVPMatrix, 0, x:0, y:0, z:0f); // ֦େɾॖখ Matrix.scaleM(MVPMatrix, 0, x:1, y:1, z:1); // ճస Matrix.rotateM(MVPMatrix, 0, rotation:0, x:0.f, y:0.f, z:1.f);
ᶆ0QFO(-&4ͷϙΠϯτ 'SBHNFOU4IBEFS ৭Λมߋ͢ΔϑΟϧλʔɺΥʔλʔϚʔΫ ͜͜Ͱͷॲཧ͢Δ͕伴ʹͳΔɻ ֤ϐΫηϧຖͷ৭Λܾఆ 0QFO(-&4Ͱͷඳը·ͰͷྲྀΕ
'SBHNFOU4IBEFS FYUFOTJPO(-@0&4@&(-@JNBHF@FYUFSOBMSFRVJSF QSFDJTJPONFEJVNQqPBU WBSZJOHWFDW5FYUVSF$PPSEWFSUFYTIBEFS VOJGPSNTBNQMFS&YUFSOBM0&4T5FYUVSFಈը͔Βσίʔυ͞Εͨը૾ WPJENBJO \ HM@'SBH$PMPSUFYUVSF% T5FYUVSF W5FYUVSF$PPSE
^ ᶆ0QFO(-&4ͷϙΠϯτ ɾ͖ͬͯͨ67࠲ඪʹ5FYUVSF͔Β5FYFMΛऔΓग़͠ɺ ɹϥελϥΠζิ͞Εͨ৭Λඳը͢Δ
ᶆ0QFO(-&4ͷϙΠϯτ ใΛ৭ใʹ͢ڮ͠ɻ ҙࣝ͠ͳͯ͘ϓϩάϥϛϯάͰ͖Δɻ ϥελϥΠζ ը૾ग़యɹϚΠφϏχϡʔε %άϥϑΟοΫɾϚχΞοΫε ɹIUUQTOFXTNZOBWJKQBSUJDMFHSBQIJDT 0QFO(-&4Ͱͷඳը·ͰͷྲྀΕ
.1 .FEJB &YUSBDUPS .FEJB$PEFD %FDPEFS 0QFO(-&4$POUFYU 'JMUFS %FDPEFS4VSGBDF &ODPEFS4VSGBDF .FEJB$PEFD
&ODPEFS .FEJB .VYFS .1 4VSGBDF5FYUVSF 4XBQ#V⒎FS ESBX #ZUF#V⒎FS #ZUF#V⒎FS ᶆ0QFO(-&4ͷϙΠϯτ ᶃ%FDPEFS4VSGBDFͰ4VSGBDF5FYUVSFͱͯ͠ը૾Λड͚औΔɻ 4DBMFճస༻ͷมߦྻΛཧɻ ᶄ'JMUFSͰ4VSGBDF5FYUVSFʹ৭Λ͚ͭͨΓɺΥʔλʔϚʔΫΛ͚ͭͨΓ͢Δ ᶅ&ODPEFS4VSGBDFͰ.FEJB$PEFDͷ&ODPEFʹॻ͖ࠐΈΛߦ͏
// ඳը͞Εͨtextureͷ౸ணͪ decoderSurface.awaitNewImage(); // textureΛOpenGLͰඳը ෦ͰFilter͕drawΛߦͬͯ·͢ɻ decoderSurface.drawImage(); // ඳը͞ΕΔ࣌ؒΛࢦఆ encoderSurface.setPresentationTime(bufferInfo.presentationTimeUs
* 1000); // ݱࡏඳը͞Ε͍ͯΔ༰ΛEncoderʹૹ৴ encoderSurface.swapBuffers(); // encoderͰඳըใΛडऔΔ encoder.dequeueOutputBuffer(bufferInfo, 0); encoderOutputBuffers = encoder.getOutputBuffers(); // encoderͷoutputBufferΛMediaMuxerʹͯ͠ɺmp4ϑΝΠϧʹ͢Δ muxRender.writeSampleData(MuxRender.SampleType.VIDEO, encoderOutputBuffers[result], bufferInfo); ᶆ0QFO(-&4ͷϙΠϯτ %FDPEFS4VSGBDFͱ&ODPEFS 4VSGBDFͷେࡶͳίʔυͷྲྀΕ
4VSGBDF5FYUVSFͱ ᶆ0QFO(-&4ͷϙΠϯτ ɾ%FDPEF͞Εͨը૾Λ0QFO(-&4ςΫενϟ ɹͱͯ͠ϑϨʔϜΛΩϟϓνϟ͠·͢ɻ ɾ"OESPJEͷ4VSGBDF5FYUVSF%ςΫενϟͰͳ͍ ɾΧϝϥϓϨϏϡʔͷετϦʔϜͰ༻͞Ε͍ͯΔ
࣍ ᶃಈըͱ ᶄಈըฤूͷجૅࣝ ᶅ.FEJB$PEFDͷϙΠϯτ ᶆ0QFO(-&4ͷϙΠϯτ ᶇಈըʹϑΟϧλʔΛ͔͚Δ ᶈಈըʹΥʔλʔϚʔΫΛ͚ͭΔ ᶉ࠷ޙʹ
ᶇಈըʹϑΟϧλʔΛ͔͚Δ ಈըʹϑΟϧλʔΛ͔͚Δ ˣ QJYFM͝ͱͷ৭Λ'SBHNFOU4IBEFSͰมߋ͢Δ
(MBZ4DBMFͷ'SBHNFOU4IBEFS FYUFOTJPO(-@0&4@&(-@JNBHF@FYUFSOBMSFRVJSF QSFDJTJPONFEJVNQqPBU WBSZJOHWFDW5FYUVSF$PPSE VOJGPSNTBNQMFS&YUFSOBM0&4T5FYUVSF DPOTUIJHIQWFDXFJHIUWFD
WPJENBJO \ qPBUMVNJOBODFEPU UFYUVSF% T5FYUVSF W5FYUVSF$PPSE SHC XFJHIU HM@'SBH$PMPSWFD WFD MVNJOBODF ^ ᶇಈըʹϑΟϧλʔΛ͔͚Δ
4FQJBͷ'SBHNFOU4IBEFS FYUFOTJPO(-@0&4@&(-@JNBHF@FYUFSOBMSFRVJSF QSFDJTJPONFEJVNQqPBU WBSZJOHWFDW5FYUVSF$PPSE VOJGPSNTBNQMFS&YUFSOBM0&4T5FYUVSF WPJENBJO \ WFDGSBH$PMPSUFYUVSF% T5FYUVSF W5FYUVSF$PPSE
HM@'SBH$PMPSSEPU GSBH$PMPSSHC WFD HM@'SBH$PMPSHEPU GSBH$PMPSSHC WFD HM@'SBH$PMPSCEPU GSBH$PMPSSHC WFD ^ ᶇಈըʹϑΟϧλʔΛ͔͚Δ
࣍ ᶃಈըͱ ᶄಈըฤूͷجૅࣝ ᶅ.FEJB$PEFDͷϙΠϯτ ᶆ0QFO(-&4ͷϙΠϯτ ᶇಈըʹϑΟϧλʔΛ͔͚Δ ᶈಈըʹΥʔλʔϚʔΫΛ͚ͭΔ ᶉ࠷ޙʹ
ᶈಈըʹΥʔλʔϚʔΫΛ͚ͭΔ ɾΥʔλʔϚʔΫͷ#JUNBQΛ0QFO(-ʹૹΔ ɾ'SBHNFOU4IBEFSͰBMQIB߹Λߦ͏
ᶈಈըʹΥʔλʔϚʔΫΛ͚ͭΔ #JUNBQΛ0QFO(-ʹૹΔ ը૾ग़య͚Μ͝ͷ͓ෑɹ ςΫενϟϚοϐϯάɹ IUUQULFOHPHJUIVCJPCMPHPQFOHMFTELOPXMFEHF
ᶈಈըʹΥʔλʔϚʔΫΛ͚ͭΔ ը૾ग़య͚Μ͝ͷ͓ෑɹ ςΫενϟϚοϐϯάɹ IUUQULFOHPHJUIVCJPCMPHPQFOHMFTELOPXMFEHF
ᶈಈըʹΥʔλʔϚʔΫΛ͚ͭΔ ը૾ग़య͚Μ͝ͷ͓ෑɹ ςΫενϟϚοϐϯάɹ IUUQULFOHPHJUIVCJPCMPHPQFOHMFTELOPXMFEHF
'SBHNFOU4IBEFSͰΞϧϑΝ߹ FYUFOTJPO(-@0&4@&(-@JNBHF@FYUFSOBMSFRVJSF QSFDJTJPONFEJVNQqPBU WBSZJOHWFDW5FYUVSF$PPSE VOJGPSNTBNQMFS&YUFSOBM0&4T5FYUVSF VOJGPSNMPXQTBNQMFS%P5FYUVSFΞοϓϩʔυͨ͠UFYUVSF WPJENBJO \ MPXQWFDDUFYUVSF% T5FYUVSF
W5FYUVSF$PPSE MPXQWFDDUFYUVSF% P5FYUVSF W5FYUVSF$PPSE MPXQWFDPVUQVU$PMPS PVUQVU$PMPSSDS DS DB DB PVUQVU$PMPSHDH DH DB DB PVUQVU$PMPSCDC DC DB DB PVUQVU$PMPSBDB DB DB HM@'SBH$PMPSPVUQVU$PMPS ^ ᶈಈըʹΥʔλʔϚʔΫΛ͚ͭΔ
࣍ ᶃಈըͱ ᶄಈըฤूͷجૅࣝ ᶅ.FEJB$PEFDͷϙΠϯτ ᶆ0QFO(-&4ͷϙΠϯτ ᶇಈըʹϑΟϧλʔΛ͔͚Δ ᶈಈըʹΥʔλʔϚʔΫΛ͚ͭΔ ᶉ࠷ޙʹ
ᶉ࠷ޙʹ ɾ"OESPJEͰಈըฤू.FEJB$PEFDͱ0QFO(-&4 ɹͷ߹Θٕͤ ɾ0QFO(-&4ྗ্͕͕Δͱදݱͷ෯͕Δ ɾ4FSWJDFͰ࣮ߦ͢Δ͜ͱΛΦεεϝ͠·͢ɻ ɾJ04ʹൺΔͱɺഒಈըੜͷ͕͔͔࣌ؒ ɹͬͯ͠·͏ͨΊɺ69Λߟྀ͢Δඞཁ͋Γɻ
ᶉ࠷ޙʹ &YP1MBZFS'JMUFS IUUQTHJUIVCDPN.BTBZVLJ4VEB&YP1MBZFS'JMUFS ɾಈըϓϨϏϡʔதʹϑΟϧλʔΛ͔͚Δ ɹฤू݁ՌΛίʔσοΫͨͣʹ͔֬ΊΒΕΔ
ᶉ࠷ޙʹ ࢀߟϦϯΫհ ɾ"OESPJEͰ.FEJB$PEFDΛ͍''NQFHͳ͠ͰಈըΛѹॖ͢Δํ๏ʢϥΠϒϥϦ͋Γʣ ɹ .FEJB$PEFDͷΈʹେมࢀߟʹͳΓ·͢ ɹIUUQTRJJUBDPNZVZB@QSFTUPJUFNTEFDCE ɾ͚Μ͝ͷ͓ෑ 0QFO(-ͷΈʹେมࢀߟʹͳΓ·͢
ɹIUUQULFOHPHJUIVCJPCMPHPQFOHMFTELOPXMFEHF ɾϚΠφϏχϡʔεɹ%άϥϑΟοΫεͷ֓೦ͱϨϯμϦϯάύΠϓϥΠϯ ɹIUUQTOFXTNZOBWJKQBSUJDMFHSBQIJDT
ᶉ࠷ޙʹ 41&$*"-5)"/,4 :VZB5BOBLB IUUQTHJUIVCDPNZQSFTUP IUUQTRJJUBDPNZVZB@QSFTUP IUUQTUXJUUFSDPNZVZB@QSFTUP ,FOHP5BUFJTIJ IUUQULFOHPHJUIVCJP IUUQTHJUIVCDPNULFOHP IUUQTUXJUUFSDPNULFOHP
͓·͚ (-&4HM6OJGPSNGW ؔΛ࣮ߦ͢Δͱ ͳ͔ͥ(BMBYZγϦʔζͷܥҎ্Ͱ TJHOBM 4*(4&(7 DPEF 4&(7@."1&33 Ͱམͪ·ͨ͠
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠