Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
MediaCodecで動画編集をしてみよう
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Masayuki Suda
February 08, 2018
Programming
4.8k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
MediaCodecで動画編集をしてみよう
DroidKaigi 2018でプレゼンさせていただいたスライドです。
Masayuki Suda
February 08, 2018
More Decks by Masayuki Suda
See All by Masayuki Suda
Rewind & Replay: Kotlin 2.2が変えるCoroutine デバッグ最前線
masayukisuda
1
3.7k
Android端末で実現するオンデバイスLLM 2025 続き
masayukisuda
0
45
Android端末で実現するオンデバイスLLM 2025
masayukisuda
2
750
Kotlin 2.0が与えるAndroid開発の進化
masayukisuda
2
4k
Kotlin Collection関数をマスター
masayukisuda
1
6.6k
Jetpack Macrobenchmarkを試してみた
masayukisuda
1
420
Androidで動画編集アプリの技術選択
masayukisuda
1
1.4k
Other Decks in Programming
See All in Programming
Deep dive into the select statement (GopherCon UK)
jespino
0
170
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
230
デプロイ直後のレイテンシスパイクを調べたら、 Railsの仕様にたどり着いた
nhsykym
0
110
信頼性の目標を誰も求めてない
shubox
0
500
LoopHub - ローカルで動く GitHub で、AI と共同開発
jugyo
1
490
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
140
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
220
Claude Codeを組織的に動かして月400PRを実現した話
happy_ryo
0
260
不幸な GC
chencmd
0
900
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
590
RSSとCodexを使ってX投稿自動化してみた
ochtum
0
110
AIエージェント時代のコードレビューを設計する
nogu66
6
2.6k
Featured
See All Featured
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
370
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
45k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
690
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.7k
Navigating Weather and Climate Data
rabernat
0
510
The browser strikes back
jonoalderson
0
1.7k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
4
620
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
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 Ͱམͪ·ͨ͠
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠