CHAP 18. 멀티미디어
안드로이드의 멀티미디어 지원 멀티미디어 재생->MediaPlayer 클래스를 사용 멀티미디어 녹화-> MediaRecorder 클래스를 사용
안드로이드 지원 파일 형식 종류 형식/코덱 엔코더 디코더 지원파일종류(파일확장자) 오디오 AAC LC/LTP • 3GPP (.3gp) 와 MPEG-4 (.mp4, .m4a). raw AAC (.aac)는 지원하지 않음 HE-AACv1 (AAC+) HE-AACv2 (enhanced AAC+) AMR-NB 3GPP (.3gp) AMR-WB MP3 MP3 (.mp3) MIDI Type 0과 1 (.mid, .xmf, .mxmf). RTTTL/RTX (.rtttl, .rtx), OTA (.ota)와 iMelody (.imy) Ogg Vorbis Ogg (.ogg) PCM/WAVE WAVE (.wav) 이미지 JPEG JPEG (.jpg) GIF GIF (.gif) PNG PNG (.png) BMP BMP (.bmp) 비디오 H.263 3GPP (.3gp) 와 MPEG-4 (.mp4) H.264 AVC MPEG-4 SP VP8 WebM (.webm)
오디오 재생 2가지의 방법 인텐트 사용 MediaPlayer 클래스 사용
(1) 인텐트를 사용하는 방법 public class AudioPlay1Activity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button playButton = (Button) findViewById(R.id.play); playButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent intent =new Intent(Intent.ACTION_VIEW); Uri uri = Uri.parse("file:///sdcard/old_pop.mp3"); intent.setDataAndType(uri, "audio/mp3"); startActivity(intent); } });
실행 결과
(2) MediaPlayer 클래스를 사용한 오디오 예제
코드 작성 public class AudioPlay2Activity extends Activity { MediaPlayer mp = null; EditText edit; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); edit = (EditText) findViewById(R.id.path); } public void startResAudio(View v) { mp = MediaPlayer.create(this, R.raw.old_pop); mp.start(); public void stopResAudio(View v) { if (mp != null) { mp.stop(); mp.release(); mp = null;
코드 작성 public void startFileAudio(View v) { String file; file = edit.getText().toString(); mp = new MediaPlayer(); try { mp.setDataSource(file); mp.prepare(); } catch (Exception e) { e.printStackTrace(); } mp.start(); public void stopFileAudio(View v) { if (mp != null) { mp.stop(); mp.release(); mp = null;
실행 결과
오디오 녹음 2가지의 방법 인텐트 사용 MediaRecorder 클래스 사용
MediaRecorder를 사용하여서 오디오 녹음
예제
실행 결과
이미지 캡처 2가지의 방법 인텐트 사용 Camera 클래스 사용
예제: 인텐트를 이용한 이미지 획득
사용자 인터페이스 작성 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="캡처" android:id="@+id/capture" /> android:text="처리" android:id="@+id/process" /> <ImageView android:id="@+id/imageview" android:layout_height="match_parent" /> </LinearLayout>
코드 작성 public class ImageCapture1Activity extends Activity { private static final int CAMERA_CAPTURE = 0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); Button captureButton = (Button) findViewById(R.id.capture); Button processButton = (Button) findViewById(R.id.process); captureButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent i = new Intent( android.provider.MediaStore.ACTION_IMAGE_CAPTURE); i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File("/sdcard/image.jpg"))); startActivityForResult(i, CAMERA_CAPTURE); } });
코드 작성 processButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { Bitmap captureBmp = null; File file = new File("/sdcard/image.jpg"); try { captureBmp = Images.Media.getBitmap(getContentResolver(), Uri.fromFile(file)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { } int width = captureBmp.getWidth(); int height = captureBmp.getHeight(); Bitmap tmpBmp = captureBmp.copy(Bitmap.Config.ARGB_8888, true); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int value = captureBmp.getPixel(x, y); if (value < 0xff808080) tmpBmp.setPixel(x, y, 0xff000000); else tmpBmp.setPixel(x, y, 0xffffffff); ImageView imgView = (ImageView) findViewById(R.id.imageview); imgView.setImageBitmap(tmpBmp); });
코드 작성 @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { Bitmap captureBmp = null; if (resultCode == RESULT_OK && requestCode == CAMERA_CAPTURE) { File file = new File("/sdcard/image.jpg"); try { captureBmp = Images.Media.getBitmap(getContentResolver(), Uri.fromFile(file)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { } ImageView imgView = (ImageView) findViewById(R.id.imageview); imgView.setImageBitmap(captureBmp);
실행 결과
Camera 클래스를 이용한 영상 캡처 만약 안드로이드에서 기본적으로 제공하는 카메라 서비스를 이용하지 않고 자신만의 카메라 애플리케 이션을 작성하고자 한다면 Camera 클래스를 이용하 면 된다. Camera 클래스를 이용하면 이미지 캡처 설정 변경, 이미지 프리뷰, 비디오에서 프레임 추출 등을 할 수 있다. 자세한 절차는 교과서를 참고하세요!
사용자 인터페이스 작성
핵심 코드
매니페스트 파일
실행 결과 갤럭시 S3에서는 \Phone\Pictures\CameraCapture 폴더에 MyPic20145609055637와 같은 이름으로 저장된다.
내장 사진 선택하기 ACTION_PICK 인텐트에 다음과 같은 URI를 주면 된 다. // 내장 메모리 android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI; // 외장 메모리 android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
예제 실행 화면
비디오 재생 MediaPlayer 클래스는 오디오 재생 뿐만 아니라 비 디오 재생도 담당 VideoView 클래스는 MediaPlayer 객체의 생성과 초 기화를 담당한다.
예제: 비디오 재생
사용자 인터페이스 작성 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <VideoView android:id="@+id/videoview" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
코드 작성 public class VideoPlayActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.main); VideoView videoview = (VideoView)this.findViewById(R.id.videoview); MediaController mc = new MediaController(this); videoview.setMediaController(mc); String folder = Environment.getExternalStorageDirectory().getAbsolutePath(); //videoview.setVideoURI(Uri.parse("http://media.w3.org/2010/05/sintel/trailer.mp4")); videoview.setVideoPath(folder + "/trailer.mp4"); videoview.requestFocus(); videoview.start(); }
실행 결과
비디오 녹화 MediaRecorder 클래스: 비디오 녹화 담당 SurfaceView : 캠코더의 화면을 표시
사용자 인터페이스 작성 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <SurfaceView android:id="@+id/videoview" android:layout_height="400dp" /> <Button android:id="@+id/mybutton" android:layout_height="wrap_content" android:text="녹화시작" android:textSize="12dp" /> </LinearLayout>
코드 작성 public class VideoRecordActivity extends Activity implements SurfaceHolder.Callback { Button myButton; MediaRecorder mediaRecorder; SurfaceHolder surfaceHolder; boolean is_recording; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); is_recording = false; mediaRecorder = new MediaRecorder(); initMediaRecorder(); setContentView(R.layout.main); SurfaceView myVideoView = (SurfaceView) findViewById(R.id.videoview); surfaceHolder = myVideoView.getHolder(); surfaceHolder.addCallback(this); myButton = (Button) findViewById(R.id.mybutton); myButton.setOnClickListener(myButtonOnClickListener); }
코드 작성 private Button.OnClickListener myButtonOnClickListener = new Button.OnClickListener() { public void onClick(View arg0) { if (is_recording) { mediaRecorder.stop(); mediaRecorder.release(); finish(); } else { mediaRecorder.start(); is_recording = true; myButton.setText("녹화중지"); } }; public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { public void surfaceCreated(SurfaceHolder arg0) { prepareMediaRecorder(); public void surfaceDestroyed(SurfaceHolder arg0) {
코드 작성 private void initMediaRecorder() { mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); CamcorderProfile camcorderProfile_HQ = CamcorderProfile .get(CamcorderProfile.QUALITY_LOW); mediaRecorder.setProfile(camcorderProfile_HQ); mediaRecorder.setOutputFile("/sdcard/video.mp4"); mediaRecorder.setMaxDuration(60000); // 최대 시간을 60초로 한정한다. mediaRecorder.setMaxFileSize(5000000); // 최대 파일 크기를 5MB로 한정한다. } private void prepareMediaRecorder() { mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface()); try { mediaRecorder.prepare(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) {
실행 결과