Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Masayuki Suda
February 08, 2018

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

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

Masayuki Suda

February 08, 2018
Tweet

More Decks by Masayuki Suda

Other Decks in Programming

Transcript

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

    View Slide

  2. ॳొஃʂʂ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    ɹIUUQBWJVUMJOGPEPVHBLFJTJLJLPOOUFOB

    View Slide

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

    ɹIUUQBWJVUMJOGPEPVHBLFJTJLJLPOOUFOB
    ᶃಈըͱ͸

    View Slide

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

    View Slide

  11. ᶄಈըฤूͷجૅ஌ࣝ
    ಈըฤूͰ͓͍͑ͨ͞༻ޠͭ
    ᶃ&ODPEF

    ᶄ$PEFD
    ɹ
    ᶅ%FDPEF
    ᶆ.VYFS

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    ಈըʹϑΟϧλʔΛ͔͚ΔTUFQ
    ᶄಈըฤूͷجૅ஌ࣝ

    View Slide

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

    View Slide

  18. ᶃ.FEJB&YUSBDUPSͰը૾Λ̍ຕ̍ຕऔΓग़͢
    ᶄ.FEJB&YUSBDUPS͔Βड͚औͬͨσʔλΛ%FDPEFSͰ4VSGBDF5FYUVSF
    ʹ͠ɺͦ͜ʹϑΟϧλʔΛ͔͚Δɻ&ODPEFSͰ༻ҙͨ͠(-$POUFYUʹඳըɻ
    ᶅ.FEJB.VYFSͰ.1ϑΝΠϧʹ͢Δɻ
    ᶅ.FEJB$PEFDͷϙΠϯτ
    ը૾࡞੒ࢀߟݩɹ
    "OESPJEͰ.FEJB$PEFDΛ࢖͍''NQFHͳ͠ͰಈըΛѹॖ͢Δํ๏ʢϥΠϒϥϦ͋Γʣɹ
    [email protected]
    .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ͷΞʔΩςΫνϟ

    View Slide

  19. ᶅ.FEJB$PEFDͷϙΠϯτ
    ͭͷओཁ$MBTTΛ૊Έ߹ΘͤͯಈըฤूΛߦ͏
    ɾ.FEJB&YUSBDUPS
    ɾ.FEJB$PEFD
    ɾ.FEJB.VYFS

    View Slide

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

    View Slide

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

    View Slide

  22. ᶅ.FEJB$PEFDͷϙΠϯτ
    ɾ.FEJB.VYFS
    .FEJB$PEFD͔Βฤू͞ΕͨԻɺө૾Λ#ZUF#V⒎FSͰ
    ɹडऔɺҰͭͷϑΝΠϧίϯςφΛੜ੒͢Δɻ
    ɹ

    View Slide

  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ͷϙΠϯτ

    View Slide

  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ͷ
    େࡶ೺ͳίʔυͷྲྀΕ

    View Slide

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

    View Slide

  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ͷϙΠϯτ

    View Slide

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

    View Slide

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

    View Slide

  29. ᶆ0QFO(-&4ͷϙΠϯτ
    ը૾ग़యɹϚΠφϏχϡʔε

    %άϥϑΟοΫɾϚχΞοΫε

    ɹIUUQTOFXTNZOBWJKQBSUJDMFHSBQIJDT
    0QFO(-&4Ͱͷඳը·ͰͷྲྀΕ
    ௖఺৘ใΛ༻ҙ
    %σΟεϓϨΠͷͲ͜ʹඳը͢ΔҐஔͷܾఆ
    ֤ϐΫηϧຖͷ৭Λܾఆ

    View Slide

  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,
    };

    View Slide

  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

    View Slide

  32. ᶆ0QFO(-&4ͷϙΠϯτ
    7FSUFY4IBEFSͰߦ͏
    0QFO(-&4Ͱͷඳը·ͰͷྲྀΕ
    %σΟεϓϨΠͷͲ͜ʹඳը͢ΔҐஔͷܾఆ

    View Slide

  33. 7FSUFY4IBEFS
    VOJGPSNNBUV.71.BUSJY֦େճసͳͲͷม׵࠲ඪ
    VOJGPSNNBUV45.BUSJYσίʔυͨ͠ςΫενϟͷߦྻ
    BUUSJCVUFWFDB1PTJUJPOY Z [ͷ࠲ඪ
    BUUSJCVUFWFDB5FYUVSF$PPSEV W࠲ඪ
    WBSZJOHWFDW5FYUVSF$PPSE'SBHNFOU4IBEFSʹ౉͢࠲ඪ
    WPJENBJO
    \
    [email protected]
    W5FYUVSF$PPSE V45.BUSJYB5FYUVSF$PPSE
    YZ
    ^
    ᶆ0QFO(-&4ͷϙΠϯτ
    ɾม׵ߦྻͱ௖఺࠲ඪΛܭࢉ͠ɺ௖఺ҐஔΛܾఆ
    ɾςΫενϟͷ67࠲ඪͷܾఆΛ'SBHNFOU4IBEFS΁౉͢

    View Slide

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

    View Slide

  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);

    View Slide

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

    View Slide

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

    ^
    ᶆ0QFO(-&4ͷϙΠϯτ
    ɾ౉͖ͬͯͨ67࠲ඪʹ5FYUVSF͔Β5FYFMΛऔΓग़͠ɺ
    ɹϥελϥΠζิ׬͞Εͨ৭Λඳը͢Δ

    View Slide

  38. ᶆ0QFO(-&4ͷϙΠϯτ
    ௖఺৘ใΛ৭৘ใʹ౉͢ڮ౉͠ɻ
    ҙࣝ͠ͳͯ͘΋ϓϩάϥϛϯάͰ͖Δɻ
    ϥελϥΠζ
    ը૾ग़యɹϚΠφϏχϡʔε

    %άϥϑΟοΫɾϚχΞοΫε

    ɹIUUQTOFXTNZOBWJKQBSUJDMFHSBQIJDT
    0QFO(-&4Ͱͷඳը·ͰͷྲྀΕ

    View Slide

  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ʹॻ͖ࠐΈΛߦ͏

    View Slide

  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ͷେࡶ೺ͳίʔυͷྲྀΕ

    View Slide

  41. 4VSGBDF5FYUVSFͱ͸
    ᶆ0QFO(-&4ͷϙΠϯτ
    ɾ%FDPEF͞Εͨը૾Λ0QFO(-&4ςΫενϟ
    ɹͱͯ͠ϑϨʔϜΛΩϟϓνϟ͠·͢ɻ
    ɾ"OESPJEͷ4VSGBDF5FYUVSF͸%ςΫενϟͰ͸ͳ͍
    ɾΧϝϥϓϨϏϡʔͷετϦʔϜͰ΋࢖༻͞Ε͍ͯΔ

    View Slide

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

    View Slide

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

    View Slide

  44. (MBZ4DBMFͷ'SBHNFOU4IBEFS
    FYUFOTJPO([email protected]&[email protected]&([email protected]@FYUFSOBMSFRVJSF
    QSFDJTJPONFEJVNQqPBU
    WBSZJOHWFDW5FYUVSF$PPSE
    VOJGPSNTBNQMFS&YUFSOBM0&4T5FYUVSF
    DPOTUIJHIQWFDXFJHIUWFD

    WPJENBJO
    \
    qPBUMVNJOBODFEPU UFYUVSF% T5FYUVSF W5FYUVSF$PPSE
    SHC XFJHIU

    [email protected]'SBH$PMPSWFD WFD MVNJOBODF


    ^
    ᶇಈըʹϑΟϧλʔΛ͔͚Δ

    View Slide

  45. 4FQJBͷ'SBHNFOU4IBEFS
    FYUFOTJPO([email protected]&[email protected]&([email protected]@FYUFSOBMSFRVJSF
    QSFDJTJPONFEJVNQqPBU
    WBSZJOHWFDW5FYUVSF$PPSE
    VOJGPSNTBNQMFS&YUFSOBM0&4T5FYUVSF
    WPJENBJO
    \
    WFDGSBH$PMPSUFYUVSF% T5FYUVSF W5FYUVSF$PPSE

    [email protected]'SBH$PMPSSEPU GSBH$PMPSSHC WFD


    [email protected]'SBH$PMPSHEPU GSBH$PMPSSHC WFD


    [email protected]'SBH$PMPSCEPU GSBH$PMPSSHC WFD


    ^
    ᶇಈըʹϑΟϧλʔΛ͔͚Δ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  51. 'SBHNFOU4IBEFSͰΞϧϑΝ߹੒
    FYUFOTJPO([email protected]&[email protected]&([email protected]@FYUFSOBMSFRVJSF
    QSFDJTJPONFEJVNQqPBU
    WBSZJOHWFDW5FYUVSF$PPSE
    VOJGPSNTBNQMFS&YUFSOBM0&4T5FYUVSF
    VOJGPSNMPXQTBNQMFS%P5FYUVSFΞοϓϩʔυͨ͠UFYUVSF
    WPJENBJO
    \
    MPXQWFDDUFYUVSF% T5FYUVSF W5FYUVSF$PPSE

    MPXQWFDDUFYUVSF% P5FYUVSF W5FYUVSF$PPSE

    MPXQWFDPVUQVU$PMPS
    PVUQVU$PMPSSDSDSDB DB

    PVUQVU$PMPSHDHDHDB DB

    PVUQVU$PMPSCDCDCDB DB

    PVUQVU$PMPSBDBDB DB

    [email protected]'SBH$PMPSPVUQVU$PMPS
    ^
    ᶈಈըʹ΢ΥʔλʔϚʔΫΛ͚ͭΔ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  55. ᶉ࠷ޙʹ
    ࢀߟϦϯΫ঺հ
    ɾ"OESPJEͰ.FEJB$PEFDΛ࢖͍''NQFHͳ͠ͰಈըΛѹॖ͢Δํ๏ʢϥΠϒϥϦ͋Γʣ
    ɹ .FEJB$PEFDͷ࢓૊ΈʹେมࢀߟʹͳΓ·͢

    ɹ[email protected]
    ɾ͚Μ͝ͷ͓԰ෑ 0QFO(-ͷ࢓૊ΈʹେมࢀߟʹͳΓ·͢

    ɹIUUQULFOHPHJUIVCJPCMPHPQFOHMFTELOPXMFEHF
    ɾϚΠφϏχϡʔεɹ%άϥϑΟοΫεͷ֓೦ͱϨϯμϦϯάύΠϓϥΠϯ
    ɹIUUQTOFXTNZOBWJKQBSUJDMFHSBQIJDT

    View Slide

  56. ᶉ࠷ޙʹ
    41&$*"-5)"/,4
    :VZB5BOBLB
    IUUQTHJUIVCDPNZQSFTUP
    [email protected]
    [email protected]
    ,FOHP5BUFJTIJ
    IUUQULFOHPHJUIVCJP
    IUUQTHJUIVCDPNULFOHP
    IUUQTUXJUUFSDPNULFOHP

    View Slide

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

    Ͱམͪ·ͨ͠

    View Slide

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

    View Slide