MediaCodecで動画編集をしてみよう

A4a5222ad5b933609fe37b4c18da1c4f?s=47 Masayuki Suda
February 08, 2018

 MediaCodecで動画編集をしてみよう

DroidKaigi 2018でプレゼンさせていただいたスライドです。

A4a5222ad5b933609fe37b4c18da1c4f?s=128

Masayuki Suda

February 08, 2018
Tweet

Transcript

  1. .FEJB$PEFDͰಈըฤूΛͯ͠ΈΑ͏ %SPJE,BJHJ EBBTVV

  2. ॳొஃʂʂ

  3. ࣗݾ঺հ $$IBOOFMגࣜձࣾ "OESPJE&OHJOFFS݉1. ਢాխ೭ ʮNZTUBʯΤϯλϝಈըΞϓϦ ʮ4PEBʯಈըฤूΞϓϦ .BTBZVLJ4VEB EBBTVV

  4. ࠓ೔ͷΰʔϧ "OESPJEΞϓϦΛ࡞ΕΔਓ͕ɺ .FEJB$PEFDͰϑΟϧλʔ͕͔͔ͬͨΓɺ ΢ΥʔλʔϚʔΫΛ͚ͭͨಈըΛ࡞ΕΔͷʹ ඞཁͳٕज़Λཧղ͢Δɻ

  5. .Q$PNQPTFSBOESPJE ɾ؆୯ʹ.QʹϑΟϧλʔ΍΢ΥʔλʔϚʔΫ ɹ͕͚ͭΒΕΔ ɾຊ೔࿩ͨ͠಺༰ͷಈ͘αϯϓϧʹ IUUQTHJUIVCDPN.BTBZVLJ4VEB.Q$PNQPTFSBOESPJE

  6. // ΢ΥʔλʔϚʔΫ 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
  7. ໨࣍ ᶃಈըͱ͸ ᶄಈըฤूͷجૅ஌ࣝ ᶅ.FEJB$PEFDͷϙΠϯτ ᶆ0QFO(-&4ͷϙΠϯτ ᶇಈըʹϑΟϧλʔΛ͔͚Δ ᶈಈըʹ΢ΥʔλʔϚʔΫΛ͚ͭΔ ᶉ࠷ޙʹ

  8. ಈըͱ͸Իʴө૾ ᶃಈըͱ͸ ը૾ग़యɹ"WJ6UJMͷқ͍͠࢖͍ํ
 ɹIUUQBWJVUMJOGPEPVHBLFJTJLJLPOOUFOB

  9. ө૾ͱ͸ը૾ͷू߹ମ ը૾ग़యɹ"WJ6UJMͷқ͍͠࢖͍ํ
 ɹIUUQBWJVUMJOGPEPVHBLFJTJLJLPOOUFOB ᶃಈըͱ͸

  10. ໨࣍ ᶃಈըͱ͸ ᶄಈըฤूͷجૅ஌ࣝ ᶅ.FEJB$PEFDͷϙΠϯτ ᶆ0QFO(-&4ͷϙΠϯτ ᶇಈըʹϑΟϧλʔΛ͔͚Δ ᶈಈըʹ΢ΥʔλʔϚʔΫΛ͚ͭΔ ᶉ࠷ޙʹ

  11. ᶄಈըฤूͷجૅ஌ࣝ ಈըฤूͰ͓͍͑ͨ͞༻ޠͭ ᶃ&ODPEF  ᶄ$PEFD ɹ ᶅ%FDPEF ᶆ.VYFS

  12. ɾѹॖΛͯ͠ɺಈըϑΝΠϧΛখ͘͢͞Δߦҝɻ ɾө૾͸ը૾ͷू߹ମɻGQTͰ෼ͷಈըͩͱ ຕͷը૾ʹͳΔɻ୯७ʹͦͷ··ॲཧΛ ͯ͠͠·͏ͱɺ๲େͳ༰ྔʹͳͬͯ͠·͏ɻ ͦΕΛ๷͙ ಈըฤूͰͷ༻ޠͭ ᶃ&ODPEF ᶄಈըฤूͷجૅ஌ࣝ

  13. ᶄ$PEFD ɾ&ODPEF ѹॖ ͢ΔࡍͷΞϧΰϦζϜ ɾ).1&("7$౳ͷ͜ͱΛࢦ͢ ɾ"OESPJEҎ߱ɺ.FEJB$PEFD͸) ɹʹ΄΅શ୺ରԠ ಈըฤूͰͷ༻ޠͭ ᶄಈըฤूͷجૅ஌ࣝ

  14. ಈըฤूͰͷ༻ޠ ᶅ%FDPEF ɾ&ODPEF ѹॖ ͞ΕͨಈըΛ෮ݩ͢Δߦҝ ɾಈը࠶ੜ͸ಈըϑΝΠϧΛ%FDPEFΛ ɹ͞Εͯ࠶ੜ͞Ε͍ͯΔ ᶄಈըฤूͷجૅ஌ࣝ

  15. ಈըฤूͰͷ༻ޠ ᶆ.VYFS ɾΤϯίʔυͨ͠ʮө૾ʯͱʮԻ੠ʯΛͭͷ ɹಈըϑΝΠϧͱͯ͠·ͱΊΔ ᶄಈըฤूͷجૅ஌ࣝ

  16. ɾಈըΛ%FDPEF͢Δɺը૾ʹల։͢Δɻ ɹˣ ɾల։ͨ͠ը૾ʹϑΟϧλʔΛ͔͚Δ ɹˣ ɾฤूͨ͠ը૾Λ&ODPEF ѹॖ ͯ͠ө૾ʹ͢Δ ɹˣ ɾ&ODPEFͨ͠ө૾ͱԻΛಈըϑΝΠϧʹ͢Δ ɹ

    .VYFS ಈըʹϑΟϧλʔΛ͔͚ΔTUFQ ᶄಈըฤूͷجૅ஌ࣝ
  17. ໨࣍ ᶃಈըͱ͸ ᶄಈըฤूͷجૅ஌ࣝ ᶅ.FEJB$PEFDͷϙΠϯτ ᶆ0QFO(-&4ͷϙΠϯτ ᶇಈըʹϑΟϧλʔΛ͔͚Δ ᶈಈըʹ΢ΥʔλʔϚʔΫΛ͚ͭΔ ᶉ࠷ޙʹ

  18. ᶃ.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ͷΞʔΩςΫνϟ
  19. ᶅ.FEJB$PEFDͷϙΠϯτ ͭͷओཁ$MBTTΛ૊Έ߹ΘͤͯಈըฤूΛߦ͏ ɾ.FEJB&YUSBDUPS ɾ.FEJB$PEFD ɾ.FEJB.VYFS

  20. ᶅ.FEJB$PEFDͷϙΠϯτ ɾ.FEJB&YUSBDUPS ɹ໾ׂͱͯ͠͸%FDPEFͷҰ෦Λ୲͏ɻ ɹ ɹฤूݩͷಈը͔ΒԻσʔλͱө૾ຕຕΛ#ZUF#V⒎FS Ͱ.FEJB$PEFDʹ౉͢ɻ ɹ.FEJB$PEFDͰѻ͑ΔҰ୯Ґ TBNQMF ͣͭ౉͠·͢ɻ

  21. ᶅ.FEJB$PEFDͷϙΠϯτ ɾ.FEJB$PEFD ɹ໾ׂͱͯ͠͸%FDPEFͷҰ෦ͱ&ODPEFΛ୲͏ ɹ%FDPEFͱ&ODPEF͸ͦΕͧΕผͷΠϯελϯεͰ୲͏ɻ ɹ ɹ.FEJB&YUSBDUPS͔Βड͚औͬͨ#ZUF#V⒎FSΛ ɹ%FDPEF͢ΔΠϯελϯεͰडऔɺ0QFO(-&4 5FYUVSF 4VSGBDF5FYUVSF ͱͯ͠ల։͢Δɻ

    ɹ&ODPEF͢ΔΠϯελϯεͰ༻ҙͨ͠(-$POUFYUͰ ɹ5FYUVSFΛඳը͢Δɻ
  22. ᶅ.FEJB$PEFDͷϙΠϯτ ɾ.FEJB.VYFS .FEJB$PEFD͔Βฤू͞ΕͨԻɺө૾Λ#ZUF#V⒎FSͰ ɹडऔɺҰͭͷϑΝΠϧίϯςφΛੜ੒͢Δɻ ɹ

  23. .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ͷϙΠϯτ
  24. // 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ͷ େࡶ೺ͳίʔυͷྲྀΕ
  25. ໨࣍ ᶃಈըͱ͸ ᶄಈըฤूͷجૅ஌ࣝ ᶅ.FEJB$PEFDͷϙΠϯτ ᶆ0QFO(-&4ͷϙΠϯτ ᶇಈըʹϑΟϧλʔΛ͔͚Δ ᶈಈըʹ΢ΥʔλʔϚʔΫΛ͚ͭΔ ᶉ࠷ޙʹ

  26. .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ͷϙΠϯτ
  27. ᶆ0QFO(-&4ͷϙΠϯτ ɾ0QFO(-&4ͱ͸ɺ0QFO(-ͷܞଳ୺຤޲͚ͷαϒηοτ൛ɻ ,ISPOPT(SPVQ͕࢓༷ࡦఆ ɾ(16ͷ֤ԋࢉϢχοτ͸શ͘ಉ͡ϓϩάϥϜΛҟͳΔσʔλ ʹରͯ͠ฒྻ࣮ߦ͠·͢ɻ ɾෳࡶͳӄӨॲཧ΍ඳըΤϑΣΫτͷࡍɺ(16ͷࢧԉʹΑͬͯ ɹ࣮ߦ͍ͯͨ͘͠ΊɺϚϧνίΞ$16ΑΓ΋༏Εͨ ɹύϑΥʔϚϯεΛൃش

  28. ᶆ0QFO(-&4ͷϙΠϯτ ϑΟϧλʔΛ͔͚ΔશͯͷϐΫηϧʹॲཧΛՃ͑Δ

  29. ᶆ0QFO(-&4ͷϙΠϯτ ը૾ग़యɹϚΠφϏχϡʔε
 %άϥϑΟοΫɾϚχΞοΫε
 ɹIUUQTOFXTNZOBWJKQBSUJDMFHSBQIJDT 0QFO(-&4Ͱͷඳը·ͰͷྲྀΕ ௖఺৘ใΛ༻ҙ %σΟεϓϨΠͷͲ͜ʹඳը͢ΔҐஔͷܾఆ ֤ϐΫηϧຖͷ৭Λܾఆ

  30. ᶆ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, };
  31. (-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
  32. ᶆ0QFO(-&4ͷϙΠϯτ 7FSUFY4IBEFSͰߦ͏ 0QFO(-&4Ͱͷඳը·ͰͷྲྀΕ %σΟεϓϨΠͷͲ͜ʹඳը͢ΔҐஔͷܾఆ

  33. 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΁౉͢
  34. ᶆ0QFO(-&4ͷϙΠϯτ ม׵ߦྻͱ͸ ը૾ग़య͚Μ͝ͷ͓԰ෑɹ όʔςοΫεγΣʔμʹΑΔ࠲ඪܥม׵ɹ IUUQULFOHPHJUIVCJPCMPHPQFOHMFTELOPXMFEHF

  35. ᶆ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);
  36. ᶆ0QFO(-&4ͷϙΠϯτ 'SBHNFOU4IBEFS ৭Λมߋ͢ΔϑΟϧλʔ΍ɺ΢ΥʔλʔϚʔΫ΋ ͜͜Ͱͷॲཧ͢Δ͕伴ʹͳΔɻ ֤ϐΫηϧຖͷ৭Λܾఆ 0QFO(-&4Ͱͷඳը·ͰͷྲྀΕ

  37. 'SBHNFOU4IBEFS FYUFOTJPO(-@0&4@&(-@JNBHF@FYUFSOBMSFRVJSF QSFDJTJPONFEJVNQqPBU WBSZJOHWFDW5FYUVSF$PPSEWFSUFYTIBEFS VOJGPSNTBNQMFS&YUFSOBM0&4T5FYUVSFಈը͔Βσίʔυ͞Εͨը૾ WPJENBJO \ HM@'SBH$PMPSUFYUVSF% T5FYUVSF W5FYUVSF$PPSE

     ^ ᶆ0QFO(-&4ͷϙΠϯτ ɾ౉͖ͬͯͨ67࠲ඪʹ5FYUVSF͔Β5FYFMΛऔΓग़͠ɺ ɹϥελϥΠζิ׬͞Εͨ৭Λඳը͢Δ
  38. ᶆ0QFO(-&4ͷϙΠϯτ ௖఺৘ใΛ৭৘ใʹ౉͢ڮ౉͠ɻ ҙࣝ͠ͳͯ͘΋ϓϩάϥϛϯάͰ͖Δɻ ϥελϥΠζ ը૾ग़యɹϚΠφϏχϡʔε
 %άϥϑΟοΫɾϚχΞοΫε
 ɹIUUQTOFXTNZOBWJKQBSUJDMFHSBQIJDT 0QFO(-&4Ͱͷඳը·ͰͷྲྀΕ

  39. .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ʹॻ͖ࠐΈΛߦ͏
  40. // ඳը͞Εͨ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ͷେࡶ೺ͳίʔυͷྲྀΕ
  41. 4VSGBDF5FYUVSFͱ͸ ᶆ0QFO(-&4ͷϙΠϯτ ɾ%FDPEF͞Εͨը૾Λ0QFO(-&4ςΫενϟ ɹͱͯ͠ϑϨʔϜΛΩϟϓνϟ͠·͢ɻ ɾ"OESPJEͷ4VSGBDF5FYUVSF͸%ςΫενϟͰ͸ͳ͍ ɾΧϝϥϓϨϏϡʔͷετϦʔϜͰ΋࢖༻͞Ε͍ͯΔ

  42. ໨࣍ ᶃಈըͱ͸ ᶄಈըฤूͷجૅ஌ࣝ ᶅ.FEJB$PEFDͷϙΠϯτ ᶆ0QFO(-&4ͷϙΠϯτ ᶇಈըʹϑΟϧλʔΛ͔͚Δ ᶈಈըʹ΢ΥʔλʔϚʔΫΛ͚ͭΔ ᶉ࠷ޙʹ

  43. ᶇಈըʹϑΟϧλʔΛ͔͚Δ ಈըʹϑΟϧλʔΛ͔͚Δ ˣ QJYFM͝ͱͷ৭Λ'SBHNFOU4IBEFSͰมߋ͢Δ

  44. (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   ^ ᶇಈըʹϑΟϧλʔΛ͔͚Δ
  45. 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     ^ ᶇಈըʹϑΟϧλʔΛ͔͚Δ
  46. ໨࣍ ᶃಈըͱ͸ ᶄಈըฤूͷجૅ஌ࣝ ᶅ.FEJB$PEFDͷϙΠϯτ ᶆ0QFO(-&4ͷϙΠϯτ ᶇಈըʹϑΟϧλʔΛ͔͚Δ ᶈಈըʹ΢ΥʔλʔϚʔΫΛ͚ͭΔ ᶉ࠷ޙʹ

  47. ᶈಈըʹ΢ΥʔλʔϚʔΫΛ͚ͭΔ ɾ΢ΥʔλʔϚʔΫͷ#JUNBQΛ0QFO(-ʹૹΔ ɾ'SBHNFOU4IBEFSͰBMQIB߹੒Λߦ͏

  48. ᶈಈըʹ΢ΥʔλʔϚʔΫΛ͚ͭΔ #JUNBQΛ0QFO(-ʹૹΔ ը૾ग़య͚Μ͝ͷ͓԰ෑɹ ςΫενϟϚοϐϯάɹ IUUQULFOHPHJUIVCJPCMPHPQFOHMFTELOPXMFEHF

  49. ᶈಈըʹ΢ΥʔλʔϚʔΫΛ͚ͭΔ ը૾ग़య͚Μ͝ͷ͓԰ෑɹ ςΫενϟϚοϐϯάɹ IUUQULFOHPHJUIVCJPCMPHPQFOHMFTELOPXMFEHF

  50. ᶈಈըʹ΢ΥʔλʔϚʔΫΛ͚ͭΔ ը૾ग़య͚Μ͝ͷ͓԰ෑɹ ςΫενϟϚοϐϯάɹ IUUQULFOHPHJUIVCJPCMPHPQFOHMFTELOPXMFEHF

  51. '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 ^ ᶈಈըʹ΢ΥʔλʔϚʔΫΛ͚ͭΔ
  52. ໨࣍ ᶃಈըͱ͸ ᶄಈըฤूͷجૅ஌ࣝ ᶅ.FEJB$PEFDͷϙΠϯτ ᶆ0QFO(-&4ͷϙΠϯτ ᶇಈըʹϑΟϧλʔΛ͔͚Δ ᶈಈըʹ΢ΥʔλʔϚʔΫΛ͚ͭΔ ᶉ࠷ޙʹ

  53. ᶉ࠷ޙʹ ɾ"OESPJEͰಈըฤू͸.FEJB$PEFDͱ0QFO(-&4 ɹͷ߹Θٕͤ ɾ0QFO(-&4ྗ্͕͕Δͱදݱͷ෯޿͕Δ ɾ4FSWJDFͰ࣮ߦ͢Δ͜ͱΛΦεεϝ͠·͢ɻ ɾJ04ʹൺ΂Δͱɺഒ͸ಈըੜ੒ͷ͕͔͔࣌ؒ ɹͬͯ͠·͏ͨΊɺ69Λߟྀ͢Δඞཁ͸͋Γɻ

  54. ᶉ࠷ޙʹ &YP1MBZFS'JMUFS IUUQTHJUIVCDPN.BTBZVLJ4VEB&YP1MBZFS'JMUFS ɾಈըϓϨϏϡʔதʹϑΟϧλʔ౳Λ͔͚Δ ɹฤू݁ՌΛίʔσοΫ଴ͨͣʹ͔֬ΊΒΕΔ

  55. ᶉ࠷ޙʹ ࢀߟϦϯΫ঺հ ɾ"OESPJEͰ.FEJB$PEFDΛ࢖͍''NQFHͳ͠ͰಈըΛѹॖ͢Δํ๏ʢϥΠϒϥϦ͋Γʣ ɹ .FEJB$PEFDͷ࢓૊ΈʹେมࢀߟʹͳΓ·͢  ɹIUUQTRJJUBDPNZVZB@QSFTUPJUFNTEFDCE ɾ͚Μ͝ͷ͓԰ෑ 0QFO(-ͷ࢓૊ΈʹେมࢀߟʹͳΓ·͢ 

    ɹIUUQULFOHPHJUIVCJPCMPHPQFOHMFTELOPXMFEHF ɾϚΠφϏχϡʔεɹ%άϥϑΟοΫεͷ֓೦ͱϨϯμϦϯάύΠϓϥΠϯ ɹIUUQTOFXTNZOBWJKQBSUJDMFHSBQIJDT
  56. ᶉ࠷ޙʹ 41&$*"-5)"/,4 :VZB5BOBLB IUUQTHJUIVCDPNZQSFTUP IUUQTRJJUBDPNZVZB@QSFTUP IUUQTUXJUUFSDPNZVZB@QSFTUP ,FOHP5BUFJTIJ IUUQULFOHPHJUIVCJP IUUQTHJUIVCDPNULFOHP IUUQTUXJUUFSDPNULFOHP

  57. ͓·͚ (-&4HM6OJGPSNGW ؔ਺Λ࣮ߦ͢Δͱ ͳ͔ͥ(BMBYZγϦʔζͷܥҎ্Ͱ TJHOBM 4*(4&(7 DPEF 4&(7@."1&33  Ͱམͪ·ͨ͠

  58. ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠