Viblo Learning
0

ANDROID MEDIA

ANDROID MEDIA

Khi đề cập đến đa phương tiện trong Android thì chúng ta nghĩ ngay tới việc sử dụng âm thanh, hình ảnh... Đây cũng chính là một trong những tiện ích được người sử dụng smartphone hay dùng nhất. Ở bài viết này, chúng ta bắt đầu làm quen với Media với cách tiếp cận dễ dàng nhất.

Android cung cấp khá nhiều API để chúng ta sử dụng với Media như SoundPool, Music.. để chơi nhạc; VideoView để chạy video...; MediaController, MediaPlayer được sử dụng để dùng với cả video và nhạc. MediaRecord dùng để ghi âm hoặc Camera để quay video...

Với khá nhiều API như vậy, ở bài này chúng ta đi sâu vào việc sử dụng MediaPlayer do nó có thể chơi được cả nhạc và xem video một cách dễ dàng mà không cần phải sử dụng các đối tượng khác.

Để tiện theo dõi, mình sử dụng một ví dụ tại đây và sau đó thêm thắt chút ít.

Khai báo một MediaPlayer rất đơn giản như sau:

MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.song);

Như vậy ta có một mediaPlayer với một bài hát được load có tên là song ở trong thư mục res/raw. Đây là cách chúng ta load những file nhạc được đặt sẵn ở trong app.

Sau đó, ta chỉ việc gọi lệnh start để chơi bản nhạc hay video này. mediaPlayer.start()

I) File nhạc

Khi mở nhạc từ địa chỉ khác trong bộ nhớ máy hay từ trên mạng thì ta sử dụng cách sau:

  1. Mở file nhạc trong bộ nhớ Ta cần phải có uri hay địa chỉ của file nhạc:
Uri myUri1 = Uri.parse("file:///sdcard/music/mai_co_nhau.mp3");
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();
  1. Mở file nhạc online

Ta cần phải có link trực tiếp tới bản nhạc đó:

VD

    String url = "http://dl7.mp3.zdn.vn/fsdd1131lwwjA/65d84ca835eecb76873f88075bbee6b6/5590fb00/2015/06/25/0/c/0cf7acce8f3848f09101b43bc0eeecd4.mp3?filename=Du%20Da%20Cach%20Xa%20-%20Vu%20Bao.mp3";
    MediaPlayer mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mediaPlayer.setDataSource(url);
    mediaPlayer.prepare(); // might take long! (for buffering, etc)
    mediaPlayer.start();

ở đây ta thấy trước khi start ta cần phải chạy mediaPlayer.prepare() là do cần có thời gian để chuẩn bị khi buffering với file nhạc này. Với file trong local thì ta không cần. Việc gọi prepare() ta coi như là việc load file về để chuẩn bị chạy.

II) Với file video

Việc mở và tạo file video với file nhạc thì cũng gần như nhau. Nhưng khi hiển thị video thì ta cần phải có layout cho nó để hiển thị. Còn với file nhạc thì không cần.

Đầu tiên ta tạo một SurfaceView trong file xml mà ta muốn hiển thị. Ở đây ta có thể tùy chỉnh được chiều rộng và chiều cao của view này.

 <SurfaceView
        android:layout_width="500px"
        android:layout_height="500px"
        android:id="@+id/surfaceView"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/imageView" />

Sau đó, ta setDisplay() cho SurfaceView như sau.

 SurfaceView surfaceView = (SurfaceView)findViewById(R.id.surfaceView);
 SurfaceHolder surfaceHolder = surfaceView.getHolder();
 mediaPlayer.setDisplay(surfaceHolder);
 mediaPlayer.prepare();
 mediaPlayer.start();

III) Các hàm cơ bản với MediaPlayer

  1. isPlaying()

check xem mediaPlayer có đang chạy bản nhạc hay video nào không? 2. seekTo(int position)

nhảy đến giây tương ứng
  1. getCurrentDuration()

trả về vị trí hiện tại khi chơi nhạc (giây thứ bao nhiêu- đơn vị milliseconds) 4. getDuration()

trả về tổng thời gian của video hay nhạc 5. reset()

khởi tạo mediaPlayer về trang thái ban đầu vẫn còn object trong media 6. release()

giải phóng object ra khỏi mediaPlayer 7. setVolume(float leftVolume, float rightVolume)

cài đặt âm lượng to nhỏ

  1. setDataSource(FileDescriptor fd)

gán object cho mediaPlayer

  1. selectTrack (int index)

chọn bài hát từ danh sách trên chỉ số

Đối với các hàm như trên thì ta chỉ cần sử dụng một mediaPlayer khai báo từ đầu là có thể chơi nhạc hay video với các tùy chỉnh của riêng mình như tăng giảm âm lượng, tua nhanh, lùi lại...

Với việc kết hợp các kỹ thuật khác thì ta có thể chuyển qua lại bài hát mặc định, hay những bản nhạc online.

Khi chúng ta muốn tạo một play list thì chúng ta sử dụng mảng trong Java để lưu lại id hoặc là đường dẫn của bản nhạc hay video đó. Chũng ta sẽ dựa vào mảng đó để chơi chúng. Khi chuyển qua lại giữa các bài hát thì hãy nhớ sử dụng hàm release() để giải phóng bài hát, video trước đo rồi hãy load bài hát, video mới vào mediaPlayer nếu không thì rất dễ bị crash app.

Ở ví dụ này, tôi sử dụng mảng int gồm có 3 phẩn tử chính là id của chúng trong thư mục res/raw. Với 2 bài hát và 1 video.

songs = new int[] {R.raw.ldta, R.raw.rp28_3, R.raw.tmtyh};

(tạm dịch: ldta - lâu đài tính ái, rp28_3: video report ngày 28-3, tmtyh - take me to your heart)

Và khi tua nhanh 5s thì chúng ta phải sử dụng hàm seekTo(int) + getCurrentPosition() Lưu ý là khi tua chúng ta phải nhớ tới giới hạm trên và dưới thời gian của bài hát hay video. Không để cho thời gian âm và vượt quá thời gian tối da của bài hát.

finalTime = mediaPlayer.getDuration();
startTime = mediaPlayer.getCurrentPosition();
...
int temp = (int)startTime;
// Tua lên 5s
if((temp+forwardTime)<=finalTime){
    startTime = startTime + forwardTime;
    mediaPlayer.seekTo((int) startTime);
    Toast.makeText(getApplicationContext(),"You have Jumped forward 5 seconds",Toast.LENGTH_SHORT).show();
}
else{
    Toast.makeText(getApplicationContext(),"Cannot jump forward 5 seconds",Toast.LENGTH_SHORT).show();
}

// Lùi lại 5s
int temp = (int)startTime;

if((temp-backwardTime)>0){
    startTime = startTime - backwardTime;
    mediaPlayer.seekTo((int) startTime);
    Toast.makeText(getApplicationContext(),"You have Jumped backward 5 seconds",Toast.LENGTH_SHORT).show();
}
else{
    Toast.makeText(getApplicationContext(),"Cannot jump backward 5 seconds",Toast.LENGTH_SHORT).show();
}

Ở ví dụ này, mình sử dụng SurfaceView để hiện thị video lên. Khi đối tượng đang được chơi là bài hát thì mình sử dụng logo của Framgia để hiển thị cho đỡ trống :v

if (isVideo(value.string.toString())) {
    surfaceView.setBackground(null);
    surfaceHolder = surfaceView.getHolder();
    mediaPlayer.setDisplay(surfaceHolder);
    mediaPlayer.prepare();
} else {
    surfaceView.setBackground(this.getDrawable(R.drawable.fr_logo));
    mediaPlayer.prepare();
}

Như đoạn code trên các bạn sẽ thấy mình phải surfaceView.setBackground(null); để cho video được chạy và hiển thị trên surfaceView nếu không thì khi chạy video màn hình cũng sẽ chỉ hiển thị back ground mà mình cài trước đó.

Khi set volume chúng ta nên để biến dưới dạng int để quản lý cho dễ dàng. Khi set volume thì chúng ta sẽ convert sang dạng float để cài đặt.

int MAX_VOLUME = 5;
int volume = 2;
...
// Tăng âm
if (volume < MAX_VOLUME) volume += 1;
float v = (float)volume / (float)MAX_VOLUME;
mediaPlayer.setVolume(v, v);

// Giảm âm
if (volume > 0) volume -= 1;
float v2 = (float)volume / (float)MAX_VOLUME;
mediaPlayer.setVolume(v2, v2);

BONUS cách lấy được tên file bao gồm cả extension của file

value = new TypedValue();
this.getResources().getValue(songs[currentIndex], value, true);

//lấy tên file
value.string.toString() // => ldta.mp3 (dịch là lâu đài tình ái nhé :v)

songs[currentIndex] chính là id của file trong thự res/raw mà mình đã đề cập ở trên

Hẹn gặp lại các bạn ở bài sau bye bye ~~ ####Video demo + code

github https://github.com/banlv54/MonthlyReport-06-2015

####Tài liệu tham khảo

http://www.tutorialspoint.com/android/android_mediaplayer.htm http://developer.android.com/guide/topics/media/mediaplayer.html http://developer.android.com/reference/android/content/res/Resources.html


All Rights Reserved