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
よくある動画アプリのあれを実装したい。
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
nakajijapan
May 28, 2014
Technology
2.7k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
よくある動画アプリのあれを実装したい。
Instagram, Vine, SlideStory のような動画アプリで動画を保存する仕込みが気になったので実装しました。
nakajijapan
May 28, 2014
More Decks by nakajijapan
See All by nakajijapan
今時のフルスタック主導の iOSアプリ開発
nakajijapan
0
370
サービスにおけるDesign Systemの構築
nakajijapan
11
4.2k
Markdownをリアルタイムに解析する
nakajijapan
5
4.8k
Firebase Authorization
nakajijapan
0
350
Intoducing Izumo
nakajijapan
1
2.1k
Practical CloudKit
nakajijapan
1
1.9k
Introducing to Ajimi - プロダクトを味見していこう
nakajijapan
0
2.4k
Shari
nakajijapan
1
3.1k
Japan Apple Pay Development
nakajijapan
0
350
Other Decks in Technology
See All in Technology
メルカリにおけるAI時代の高速プロトタイピング基盤「Arca」
ryotarai
15
12k
Azure Serverless 2026:Production-ready な AI エージェント基盤 / Azure Serverless 2026: Production-Ready AI Agent Platform
miyake
2
630
企業の現実世界をグラフで写し取る
sansantech
PRO
0
100
地方移住と都心キャリアの両立は「金・時間・人」のリソースをフル活用すれば実現できる!〜Snowflake女子会 vol.8
snowwmn0824
0
120
3人で1000GPU超を統合運用する?マルチクラウド&オンプレを跨ぐ、構築と運用のリアル!
kazukun0716
2
500
ScotSecure West 2026 - Glasgow
raybugg
0
190
Azure Copilot Resiliency Agentをいろいろ試してみる
tomokusaba
0
110
What the customer really needed
kawaguti
PRO
3
230
作って終わりじゃないサーバーレス 〜9年運用する大規模EC物流API基盤の設計・運用のリアル〜
zozotech
PRO
0
560
エージェントはローカル、検証はMicroVM — Lambda MicroVMsでつくるServerless CI
fujioka6789
3
820
AWS FinOps Agent 結局何が得意なの?
siromi
0
200
ADKで始める業務改善 - AIエージェント開発時の考えと設計
harappa80
2
290
Featured
See All Featured
How to Ace a Technical Interview
jacobian
281
24k
It's Worth the Effort
3n
188
29k
Side Projects
sachag
456
43k
Claude Code のすすめ
schroneko
67
230k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
550
Designing for Performance
lara
611
70k
Speed Design
sergeychernyshev
33
2.1k
Accessibility Awareness
sabderemane
1
220
Skip the Path - Find Your Career Trail
mkilby
1
240
YesSQL, Process and Tooling at Scale
rocio
174
15k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
850
Building AI with AI
inesmontani
PRO
1
1.3k
Transcript
BQQಓ !OBLBKJKBQBO Α͋͘Δಈը ΞϓϦͷ͋Ε Λ࣮͍ͨ͠
!OBLBKJKBQBO 4PGUXBSF&OHJOFFS (.01&1"#0JOD
৺ྶࣸਅΞϓϦ͓Θ͔Γ͍͚ͨͩͨͩΖ͏͔
৺ྶಈըΞϓϦ͏Ұ͝ཡ͍ͨͩ͜͏
"7'PVOEBUJPO ࠓճʂʂ
͋ͷಈըΛอଘ͢ΔΠ ϯλʔϑΣʔε͕ؾʹ ͳͬͨͷͰ࣮ͨ͠ɻ
༷
εΫϦʔϯΛλον ͨ͠ΒಈըΛอଘ։ ࢝ͯ͠εΫϦʔϯ͔ ΒΕͨΒอଘऴྃ
"7$BQUVSF4FTTJPO
"7$BQUVSF0VUQVU
"7$BQUVSF0VUQVU ɾ"7$BQUVSF.PWJF'JMF0VUQVU ɾ"7$BQUVSF4UJMM*NBHF0VUQVU ɾ"7$BQUVSF7JEFP%BUB0VUQVU ɾ"7$BQUVSF"VEJP%BUB0VUQVU
"7$BQUVSF0VUQVU ɾ"7$BQUVSF.PWJF'JMF0VUQVU ɾ'JMFT ɾ"7$BQUVSF4UJMM*NBHF0VUQVU ɾ*NBHF ɾ"7$BQUVSF7JEFP%BUB0VUQVU ɾ"7$BQUVSF"VEJP%BUB0VUQVU
ɾ-JWFEBUB
"7$BQUVSF0VUQVU ɾ"7$BQUVSF.PWJF'JMF0VUQVU ɾ'JMFT ɾ"7$BQUVSF4UJMM*NBHF0VUQVU ɾ*NBHF ɾ"7$BQUVSF7JEFP%BUB0VUQVU ɾ"7$BQUVSF"VEJP%BUB0VUQVU
ɾ-JWFEBUB
"7$BQUVSF"VEJP%BUB0VUQVU AVCaptureVideoDataOutputSampleBufferDelegate AVCaptureAudioDataOutputSampleBufferDelegate "7$BQUVSF7JEFP%BUB0VUQVU
#pragma mark - AVCaptureVideoDataOutputSampleBufferDelegate, AVCaptureAudioDataOutputSampleBufferDelegate ! - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection { ! if (!CMSampleBufferDataIsReady(sampleBuffer)) { NSLog(@"sampleBuffer data is not ready"); } ! CMTime currentTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); ! if (self.touching) { ! // Video if ([captureOutput isKindOfClass:[AVCaptureVideoDataOutput class]]) { [self addSamplebuffer:sampleBuffer withWriterInput:(AVAssetWriterInput *)self.assetWriterInputVideo]; } // Audio else if ([captureOutput isKindOfClass:[AVCaptureAudioDataOutput class]]) { [self addSamplebuffer:sampleBuffer withWriterInput:(AVAssetWriterInput *)self.assetWriterInputAudio]; } ! } ! self.recordStartTime = currentTime; } AVCaptureVideoDataOutputSampleBufferDelegate AVCaptureAudioDataOutputSampleBufferDelegate
8SJUJOH
εΫϦʔϯΛλον ͨ͠ΒಈըΛอଘ։ ࢝ͯ͠εΫϦʔϯ͔ ΒΕͨΒอଘऴྃ
εΫϦʔϯΛλον ͨ͠ΒಈըΛอଘ։ ࢝ͯ͠εΫϦʔϯ͔ ΒΕͨΒอଘऴྃ - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; -
(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
"7"TTFU8SJUFS "7"TTFU8SJUFS*OQVU
4UBSU8SJUJOH อଘରͷϑΝΠϧΛࢦఆͯ͠ॳظԽ ϝσΟΞλΠϓΛࢦఆ TFU&YQFDUT.FEJB%BUB*O3FBM5JNFΛ0/ʹ͢Δ "7"TTFU8SJUFSʹ"7"TTFU8SJUFS*OQVUΛΈࠐΉ ॻ͖ࠐΈ։࢝
4UBSU8SJUJOH // AVAssetWriter self.assetWriter = [AVAssetWriter assetWriterWithURL:self.outputURL fileType:AVFileTypeQuickTimeMovie error:&error]; !
! // movie NSDictionary *videoSetting = self.videoSettings; self.assetWriterInputVideo = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoSetting]; [self.assetWriterInputVideo setExpectsMediaDataInRealTime:YES]; ! ! // audio NSDictionary *audioSetting = self.audioSettings; self.assetWriterInputAudio = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:audioSetting]; [self.assetWriterInputAudio setExpectsMediaDataInRealTime:YES]; ! ! [self.assetWriter addInput:self.assetWriterInputVideo]; [self.assetWriter addInput:self.assetWriterInputAudio]; ! // queue self.movieWritingQueue = dispatch_queue_create("Movie Writing Queue", DISPATCH_QUEUE_SERIAL); ! // Record [self.assetWriter startWriting]; [self.assetWriter startSessionAtSourceTime:self.recordStartTime];
4UBSU8SJUJOH // AVAssetWriter self.assetWriter = [AVAssetWriter assetWriterWithURL:self.outputURL fileType:AVFileTypeQuickTimeMovie error:&error]; !
! // movie NSDictionary *videoSetting = self.videoSettings; self.assetWriterInputVideo = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoSetting]; [self.assetWriterInputVideo setExpectsMediaDataInRealTime:YES]; ! ! // audio NSDictionary *audioSetting = self.audioSettings; self.assetWriterInputAudio = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:audioSetting]; [self.assetWriterInputAudio setExpectsMediaDataInRealTime:YES]; ! ! [self.assetWriter addInput:self.assetWriterInputVideo]; [self.assetWriter addInput:self.assetWriterInputAudio]; ! // queue self.movieWritingQueue = dispatch_queue_create("Movie Writing Queue", DISPATCH_QUEUE_SERIAL); ! // Record [self.assetWriter startWriting]; [self.assetWriter startSessionAtSourceTime:self.recordStartTime];
4UBSU8SJUJOH // AVAssetWriter self.assetWriter = [AVAssetWriter assetWriterWithURL:self.outputURL fileType:AVFileTypeQuickTimeMovie error:&error]; !
! // movie NSDictionary *videoSetting = self.videoSettings; self.assetWriterInputVideo = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoSetting]; [self.assetWriterInputVideo setExpectsMediaDataInRealTime:YES]; ! ! // audio NSDictionary *audioSetting = self.audioSettings; self.assetWriterInputAudio = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:audioSetting]; [self.assetWriterInputAudio setExpectsMediaDataInRealTime:YES]; ! ! [self.assetWriter addInput:self.assetWriterInputVideo]; [self.assetWriter addInput:self.assetWriterInputAudio]; ! // queue self.movieWritingQueue = dispatch_queue_create("Movie Writing Queue", DISPATCH_QUEUE_SERIAL); ! // Record [self.assetWriter startWriting]; [self.assetWriter startSessionAtSourceTime:self.recordStartTime];
4UBSU8SJUJOH // AVAssetWriter self.assetWriter = [AVAssetWriter assetWriterWithURL:self.outputURL fileType:AVFileTypeQuickTimeMovie error:&error]; !
! // movie NSDictionary *videoSetting = self.videoSettings; self.assetWriterInputVideo = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoSetting]; [self.assetWriterInputVideo setExpectsMediaDataInRealTime:YES]; ! ! // audio NSDictionary *audioSetting = self.audioSettings; self.assetWriterInputAudio = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:audioSetting]; [self.assetWriterInputAudio setExpectsMediaDataInRealTime:YES]; ! ! [self.assetWriter addInput:self.assetWriterInputVideo]; [self.assetWriter addInput:self.assetWriterInputAudio]; ! // queue self.movieWritingQueue = dispatch_queue_create("Movie Writing Queue", DISPATCH_QUEUE_SERIAL); ! // Record [self.assetWriter startWriting]; [self.assetWriter startSessionAtSourceTime:self.recordStartTime];
4UBSU8SJUJOH // AVAssetWriter self.assetWriter = [AVAssetWriter assetWriterWithURL:self.outputURL fileType:AVFileTypeQuickTimeMovie error:&error]; !
! // movie NSDictionary *videoSetting = self.videoSettings; self.assetWriterInputVideo = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoSetting]; [self.assetWriterInputVideo setExpectsMediaDataInRealTime:YES]; ! ! // audio NSDictionary *audioSetting = self.audioSettings; self.assetWriterInputAudio = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:audioSetting]; [self.assetWriterInputAudio setExpectsMediaDataInRealTime:YES]; ! ! [self.assetWriter addInput:self.assetWriterInputVideo]; [self.assetWriter addInput:self.assetWriterInputAudio]; ! // queue self.movieWritingQueue = dispatch_queue_create("Movie Writing Queue", DISPATCH_QUEUE_SERIAL); ! // Record [self.assetWriter startWriting]; [self.assetWriter startSessionAtSourceTime:self.recordStartTime];
4UBSU8SJUJOH - (void)addSamplebuffer:(CMSampleBufferRef)sampleBuffer withWriterInput:(AVAssetWriterInput *)assetWriterInput { CMFormatDescriptionRef formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer);
! CFRetain(sampleBuffer); CFRetain(formatDescription); dispatch_async(self.movieWritingQueue, ^{ ! if (_assetWriter.status == AVAssetWriterStatusWriting) { ! if (assetWriterInput.readyForMoreMediaData) { ! [assetWriterInput appendSampleBuffer:sampleBuffer]; ! } } ! CFRelease(sampleBuffer); CFRelease(formatDescription); }); }
$.4BNQMF#VGGFS3FG
$.4BNQMF#VGGFS3FG ɾ͋ΔϝσΟΞλΠϓͷαϯϓϧؚ͕·Εͨ$PSF'PVEBUJPO0CKFDUT ɹɾѹॖPSൺѹॖ ɾαϯϓϧ ɾશମͷத͔ΒऔΓग़ͨ͠Ұ෦ͷԿ͔
'JOJTI8SJUJOH ऴྃॲཧ ϑΝΠϧʹอଘ
'JOJTI8SJUJOH [self.assetWriterInputVideo markAsFinished]; [self.assetWriterInputAudio markAsFinished]; [self.assetWriter endSessionAtSourceTime:self.recordStartTime]; [self.assetWriter finishWritingWithCompletionHandler:^{ NSLog(@"self.assetWriter
finishWritingWithCompletionHandler"); [self.movieURLs addObject:self.outputURL]; NSLog(@"%@", self.movieURLs); }];
'JOJTI8SJUJOH [self.assetWriterInputVideo markAsFinished]; [self.assetWriterInputAudio markAsFinished]; [self.assetWriter endSessionAtSourceTime:self.recordStartTime]; [self.assetWriter finishWritingWithCompletionHandler:^{ NSLog(@"self.assetWriter
finishWritingWithCompletionHandler"); [self.movieURLs addObject:self.outputURL]; NSLog(@"%@", self.movieURLs); }];
͍͍ײ͡ʹग़དྷ্͕ͬͨ ͷͰެ։͠·ͨ͠ɻ
/,+.VMUJ.PWJF$BQUVSF7JFX IUUQTHJUIVCDPNOBLBKJKBQBO/,+.VMUJ.PWJF$BQUVSF7JFX
൚༻ੑ͕·ͩΓͳ͍ͷ Ͱʑॗʑͱվળͤͯ͞ ͍͖ͨͩ·͢ɻɻɻɻɻ
ࠂ͍ͤͯͩ͘͞͞
DPNNJOHTPPO
5IBOLT