NHN	NEXT	Eunjoo	Im
Android

MediaPlayer
& VideoView
GDG	Korea		
November	Meetup
NHN	NEXT	Eunjoo	Im
android media player
android video play
NHN	NEXT	Eunjoo	Im
1. What are the difference between MediaPlayer and VideoView
for Android
2. How to play videos in android from assets folder or raw
folder?
3. Android: mediaplayer went away with unhandled events
4. Playing a video in VideoView in Android
5. Using VideoView for streaming or progressive-download video
6. Full screen videoview without stretching the video
7. Playing youtube video in Android app
NHN	NEXT	Eunjoo	Im
안드로이드
멀티미디어
Architecture
http://markmail.org/download.xqy?id=obl5o53uo3is5hoi&number=1
libaudio
Java	
Application
Java	
FrameWork
Native
Driver
Camera Media	Recoder Media	Player
android.hardware	
.Camera
android.media	
.MediaRecorder
android.media	
.MediaPlayer
android.view	
.Surface
mediarecorder
Camera
Camera	Service
mediaplayer
MediaPlayer	Service
OpenCore
StageFright	PlayerCamera	
Hardware
UI	lib
Surface	
Flinger
Audio	
Flinger
Alsa	lib
Audio	
(Alsa)
Main	
framebuffer
Video	
Plane
Hardware	Codec
V412	
Capture
Native
system
Service
Media
Server
Process
nu	
Player
Awesome	Player
NHN	NEXT	Eunjoo	Im
안드로이드
미디어 재생
▪ 오디오,	비디오	재생을	모
두	담당하는	기본	API	
▪ 파일과	스트림	지원	
▪ 볼륨과	ringer	mode(벨,	
진동	무음)	등	오디오	자
원과	출력을	담당	
▪ 다양한	자원에서	영상을	
불러올	수	있는	동영상	재
생	전담	위젯	
▪ UI를	제공하고	확대/축소
와	tint	기능	제공
MediaPlayer
AudioManager
VideoView
NHN	NEXT	Eunjoo	Im
안드로이드
미디어 재생
media sources Local

Media

resources
Internal
URIs
External
URLs
content://directory/words
content URI 표준 접두어
content authority =>
content provider 식별
path
with
NHN	NEXT	Eunjoo	Im
OpenCore
StageFright	Player nu	
Player
Awesome	Player
Media
Player
Media Playback
libaudio
Java	
Application
Java	
FrameWork
Native
Driver
Media	Player
android.media	
.MediaPlayer
android.view	
.Surface
mediaplayer
MediaPlayer	Service
UI	lib
Surface	
Flinger
Audio	
Flinger
Alsa	lib
Audio	
(Alsa)
Main	
framebuffer
Video	
Plane
Hardware	Codec
stream	
media
media	
file
video	
stream
audio	
stream
android.view	
source	URI	
ISurface	
audio	type
Media
Server
Process
ISurface
audio	type
http://markmail.org/download.xqy?id=obl5o53uo3is5hoi&number=1
NHN	NEXT	Eunjoo	Im
Media
Player
SurfaceView
▪ 뷰	위계질서	내에	그릴	수	
있는	표면을	제공	
▪ 백그라운드	스레드에서	
화면을	업데이트하여	
ANR을	방지	
▪ Surface	객체를	관리하는	
홀더	
▪ MediaPlayer에서	비디오
를	재생하려면	surface를	
지정해야함	
▪ SurfaceHolder	생성	후		
setDisplay(SurfaceHol
der	surfaceHolder)
NHN	NEXT	Eunjoo	Im
Media
Player
constructors
: with default constructor
public	MediaPlayer()	
+
+	
setDisplay(SurfaceHolder	surfaceHolder)	
+	
prepare()	or	prepareAsync()
NHN	NEXT	Eunjoo	Im
Media
Player
constructors
: factory method
prepare()	or	prepareAsync()
성공적으로 로드될 경우
자동으로 동기적인 prepare()가 불리기 때문에
대용량 미디어에는 비효율적
surfaceHolder를
지정하지 않으면
audio만 재생
NHN	NEXT	Eunjoo	Im
Media
Player
Sample code
: set up
MediaPlayer	mediaPlayer	=	new	MediaPlayer();	
mediaPlayer.setDataSource(path);	
mediaPlayer.setDisplay(surfaceHolder);	
mediaPlayer.prepare();	
//	mediaPlayer.prepareAsync();	
mediaPlayer.start();
MediaPlayer	mediaPlayer	
	=	MediaPlayer.create(context,	R.raw.file1);	
mediaPlayer.setDisplay(surfaceHolder);	
mediaPlayer.prepare();	
mediaPlayer.start();	
with default constructor
With create()
factory method
NHN	NEXT	Eunjoo	Im
Media
Player
Idle
Initialized
Prepared
Started
Playback

Completed
Preparing
End
Error
reset() release()
setDataSource()
OnErrorListener().
onError()
prepareAsync()
prepare()OnPrepareListener.
onPrepared()
prepareAsync()
stop()
stop()
Looping == false &&
onCompletion()
* from

OnCompletion

Listener
start()
* from beginning
seekTo()
seekTo()/pause()pause()
start()
Looping == true &&
playback completes
seekTo()/start()
stop()
prepare()
start()
seekTo()
stop()
PausedStopped stop()
state diagram
NHN	NEXT	Eunjoo	Im
Media
Player
callbacks
NHN	NEXT	Eunjoo	Im
Media
Player
Sample code
: Manifest
<uses-permission	android:name=	
"android.permission.INTERNET"	/>
<uses-permission	android:name=	
"android.permission.WAKE_LOCK"	/>
Internet
Permission
for network
streaming
Wake
Lock Permission
for wake-up
NHN	NEXT	Eunjoo	Im
Media
Player
Sample code
: prepare surface
<SurfaceView	android:id=“+id/surface”	
android:layout_width=“400dp”	
android:layout_height=“240dp”	/>
xml
Activity
public	class	MediaPlayerActivity	extends	Activity	implements	SurfaceHolder.Callback	{	
SurfaceView	surfaceView;	
Surfaceholder	surfaceHolder;	
MediaPlayer	mediaPlayer;	
@override	
public	void	onCreate(Bundle	savedInstanceState)	{	
//	
surfaceView	=	(SurfaceView)	findViewById(R.id.surface);	
surfaceHolder	=	surfaceView.getHolder();	
surfaceHolder.addCallback(this);	
//	
}
NHN	NEXT	Eunjoo	Im
Media
Player
Sample code
: MediaPlayer set up
Activity - Cont.
public	class	MediaPlayerActivity	extends	Activity	implements	SurfaceHolder.Callback	{	
//	
@override	
public	void	surfaceCreated(SurfaceHolder	holder)	{	
try	{	
mediaPlayer.setDataSource(	//	);	
mediaPlayer.setDisplay(holder);	
//	
}	catch	(Exception	e)	{	//	}	
}	
}
NHN	NEXT	Eunjoo	Im
Media
Player
Sample code
: controll
public	class	MediaPlayerActivity	extends	Activity	implements	SurfaceHolder.Callback	{	
//	
mediaPlayer.start();	
//	
mediaPlayer.stop();	
try	{	
mediaPlayer.prepare();	//	다음	영상	재생	준비	
}	catch	(Exception	e)	{	//	}	
//	
@Override	
public	void	onDestory()	{	
super.onDestroy();	
if	(mediaPlayer	!=	null)	{	
mediaPlayer.release();	
}	
}	
}
해당 button의 onClickListener에 구현
지원하지 않는 상태에서는
IllegalStateException throw
Android: mediaplayer went away with unhandled events
NHN	NEXT	Eunjoo	Im
Media
Player
Sample code
: full size
<SurfaceView	android:id=“+id/surface”	
android:layout_width=“match_parent”	
android:layout_height=“match_parent”	/>
xml
Activity
public	class	MediaPlayerActivity	extends	Activity	implements	SurfaceHolder.Callback	{	
//	
@Override	
public	void	surfaceCreated(SurfaceHolder	holder)	{	
//	
try	{		
//	
mediaPlayer.setOnVideoSizeChangedListener(sizeChangeListener);	
}	catch	(Exception	e)	{	e.printStackTrace();	}		
}	
//
Full screen videoview without stretching the video
NHN	NEXT	Eunjoo	Im
Media
Player
Sample code
: full size
Activity - Cont.
public	class	MediaPlayerActivity	extends	Activity	implements	SurfaceHolder.Callback	{
//	
MediaPlayer.OnPreparedListener	preparedListener	=		
new	MediaPlayer.OnPreparedListener()	{		
@Override		
public	void	onPrepared(MediaPlayer	mp)	{		
Point	size	=	new	Point();		
int	videoWidth	=	mediaPlayer.getVideoWidth();		
int	videoHeight	=	mediaPlayer.getVideoHeight();		
float	videoProportion	=	(float)	videoWidth	/	(float)	videoHeight;	
getWindowManager().getDefaultDisplay().getSize(size);	
int	screenWidth	=	size.x;	
int	screenHeight	=	size.y;	
float	screenProportion	=	(float)	screenWidth	/	(float)	screenHeight;	
android.view.ViewGroup.LayoutParams	layoutParams	=	
surfaceView.getLayoutParams();	
//	
}	
//	
}
NHN	NEXT	Eunjoo	Im
Media
Player
Sample code
: full size
Activity - Cont.
public	class	MediaPlayerActivity	extends	Activity	implements	SurfaceHolder.Callback	{
//	
MediaPlayer.OnPreparedListener	preparedListener	=		
new	MediaPlayer.OnPreparedListener()	{		
@Override		
public	void	onPrepared(MediaPlayer	mp)	{		
//	
if	(videoProportion	>	screenProportion)	{	
layoutParams.width	=	screenWidth;		
layoutParams.height	=	(int)	((float)	screenWidth	/	videoProportion);		
}	else	{		
layoutParams.width	=	(int)	(videoProportion	*	(float)	screenHeight);	
layoutParams.height	=	screenHeight;	
}		
surfaceView.setLayoutParams(layoutParams);	
}	
};	
}
NHN	NEXT	Eunjoo	Im
Video
View
introduction
▪ 다양한	자원에서	영상을	불러
올	수	있는	동영상	재생	전담	
위젯	
▪ UI를	제공하고	확대/축소와	
tint	기능	제공
NHN	NEXT	Eunjoo	Im
Video
View
MediaController
▪ MediaPlayer의	컨트롤
을	담은	뷰	
▪ Play/Pause,	Rewind,	
Fast	Forward

												+

progress	slider
NHN	NEXT	Eunjoo	Im
Video
View
set up
public	VideoView	(//)
+	
setVideoPath(path)	or	setVideoURI(uri)
NHN	NEXT	Eunjoo	Im
Video
View
Sample code
: set up
<VideoView	android:id=“@+id/videoView”	
android:layout_width=“400dp”	
android:layout_height=“240dp”	/>
xml
Activity
public	class	VideoViewActivity	extends	Activity	{	
@override	
public	void	onCreate(Bundle	savedInstanceState)	{	
//	
VideoView	videoView	=	(VideoView)findViewById(R.id.videoView);	
//	
videoView.setVideoPath(	//	);	
//	videoView.setVideoURL(url);	
//	
final	MediaController	mediaController	=	new	MediaController(this);	
videoView.setMediaController(mediaController);	
}	
} 예제:	김상형.	『안드로이드	프로그래밍	정복』.	서울:	한빛미디어,	2013.
NHN	NEXT	Eunjoo	Im
Video
View
Sample code
: controll
Activity - Cont.
public	class	PlayVideoActivity	extends	Activity	{	
@override	
public	void	onCreate(Bundle	savedInstanceState)	{	
//	
videoView.postDelayed(new	Runnable()	{	
public	void	run()	{	
mediaController.show(0);	
}	
},	100);	
}
예제:	김상형.	『안드로이드	프로그래밍	정복』.	서울:	한빛미디어,	2013.
NHN	NEXT	Eunjoo	Im
▪ http://developers.google.com/youtube/android/player/	
▪ 앱	등록으로	개발자	키	발급	필요	
▪ 프로젝트에	YouTube	Data	API	v3	서비스	추가	필요	
▪ 사용자의	기기에서	YouTube	앱	4.2.16+	실행	필요	
▪ YouTubePlayerFragment나	YouTubePlayerView를	View에	배치하
고	YouTubePlayer를	사용하여	View에서	동영상	재생을	제어	
▪ 재생	환경의	세밀한	조정	가능	
▪ YouTubeStandalonePlayer를	사용	
▪ 더	간편하고	전체	화면	모드	또는	라이트박스	모드	지원	
▪ 동영상	재생	관련	유연성과	제어	능력	감소
Play
YouTube
Video
YouTube API
클라이언트
라이브러리
Playing youtube video in Android app
NHN	NEXT	Eunjoo	Im
Examples
https://github.com/luvgaram/android_GDG_examples
https://goo.gl/J8sGKI
NHN	NEXT	Eunjoo	Im
참고

자료 http://developer.android.com/intl/ko/guide/topics/media/mediaplayer.html	
http://developer.android.com/intl/ko/reference/android/media/MediaPlayer.html	
Android	Developers
http://www.slideshare.net/jerrinsg/android-media-framework-overview
Android	media	framework	overview
http://www.netmite.com/android/mydroid/2.0/external/opencore/doc/mio_developers_guide.pdf
Media	I/O	developer’s	Guide	
OpenCORE	2.02,	rev.	1
http://markmail.org/download.xqy?id=obl5o53uo3is5hoi&number=1
Android	MultiMedia	Framwork	Overview	
Li	Li,	Solution	and	Service	Wind	River
http://developers.google.com/youtube/android/player/
YouTube	Android	Player	API
안드로이드	프로그래밍	정복	
김상형.	『안드로이드	프로그래밍	정복』.	서울:	한빛미디어,	2013.
NHN	NEXT	Eunjoo	Im
Thank	
You

안드로이드 MediaPlayer & VideoView