Android Uygulamalarında Akan(Streaming) Video
Turkish (Türkçe) translation by Nevres Emre Alsancak (you can also view the original English article)
Android platformu uzaktaki videolar gibi medya dosyalarını uygulamalarınızda oynatabilmeniz için kullanabileceğiniz kütüphaneler sağlar. Bu yazıda uzaktan video akıtıp bunu VideoView
bileşeni ile görüntüleyip MediaController
nesnesi ilede kullanıcının videoyu kontrol edebilmesini sağlayacağız.
Ayrıca videoyu MediaPlayer
sınıfını kullanarak sunma süreci üzerindende kısaca geçeceğiz. Android için bir müzik çalar yaratma serisini tamamladıysanız, onu daha da geliştirmek için bu yazıda öğrendiklerinizi kullanabilirsiniz. Daha önce birkaç Android uygulaması geliştirdiyseniz bu eğitimi tamamlayabilmeniz kolay olacaktır.
1. Yeni Bir Uygulama Oluşturun
1. Adım
Bu yazıdaki kodu, üzerinde çalıştığınız mevcut bir uygulamayı geliştirmek için kullanabilir veya Eclipse veya Android Studio'da yeni bir uygulama oluşturabilirsiniz. Yeni bir Android projesi oluşturun, istediğiniz bir ismi verin, detayları ayarlayın ve buna ana başlangıç Activity
sınıfını ve düzenini verin.
2. Adım
İlk olarak, akan medya için projenin manifest(manifesto)'sunu yapılandıralım. IDE'nizde projenizin manifest dosyasını açın ve XML düzenleme moduna geçin. Akış medyası için internet erişimine ihtiyacınız vardır, bu nedenle manifest
öğesinin altına aşağıdaki izni ekleyin:
1 |
<uses-permission android:name="android.permission.INTERNET" /> |
2. VideoView
'ı Ekleyin
1. Adım
Android platformu video dosyalarını oynatabileceğiniz VideoView
sınıfını sağlar. Ana düzen dosyasına bir tane ekleyelim:
1 |
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" |
2 |
xmlns:tools="http://schemas.android.com/tools" |
3 |
android:layout_width="match_parent" |
4 |
android:layout_height="match_parent" |
5 |
android:paddingBottom="@dimen/activity_vertical_margin" |
6 |
android:paddingLeft="@dimen/activity_horizontal_margin" |
7 |
android:paddingRight="@dimen/activity_horizontal_margin" |
8 |
android:paddingTop="@dimen/activity_vertical_margin" |
9 |
android:background="#000000" |
10 |
tools:context=".MainActivity" > |
11 |
|
12 |
<VideoView
|
13 |
android:id="@+id/myVideo" |
14 |
android:layout_width="fill_parent" |
15 |
android:layout_height="fill_parent" |
16 |
android:layout_centerInParent="true" /> |
17 |
|
18 |
</RelativeLayout>
|
İsterseniz ana düzeni kendi uygulamanıza uyacak şekilde düzenleyin. VideoView
örneğine daha sonra tekrar ulaşabilmemiz bir id
niteliği veriyoruz. Kendi tasarımınıza göre diğer düzen özelliklerini değiştirmeniz gerekebilir
2. Adım
Şimdi kodda VideoView
örneğine(instance) bir referans alalım. Uygulamanızın ana Activity
sınıfını açın ve aşağıdaki destek dosyalarını ekleyin:
1 |
import android.net.Uri; |
2 |
import android.widget.MediaController; |
3 |
import android.widget.VideoView; |
Activity
sınıfınız, içerik görünümünün ayarlandığı bir onCreate
yöntemi zaten içermelidir:
1 |
@Override
|
2 |
protected void onCreate(Bundle savedInstanceState) { |
3 |
super.onCreate(savedInstanceState); |
4 |
setContentView(R.layout.activity_main); |
5 |
}
|
setContentView
satırından sonra, XML düzeninde ayarladığımız id
'yi kullanarak VideoView
örneğine aşağıdaki gibi bir referans alalım:
1 |
VideoView vidView = (VideoView)findViewById(R.id.myVideo); |
3. Video Dosyasının Akıtılması
1. Adım
Artık uygulamaya bir video dosyası akıtabiliriz. Bitiş noktası için URI'ı şu şekilde hazırlayın:
1 |
String vidAddress = "https://archive.org/download/ksnn_compilation_master_the_internet/ksnn_compilation_master_the_internet_512kb.mp4"; |
2 |
Uri vidUri = Uri.parse(vidAddress); |
Akıtma yapmak istediğiniz video dosyası için elbette uzaktaki bir adresi kullanmanız gerekecektir. Buradaki örnek, İnternet Arşivinde bulunan genel kullanıma açık bir video dosyasıdır. VideoView
nesnesine iletebilmek için adres string(dize)'ini URI olarak ayrıştırırız.
1 |
vidView.setVideoURI(vidUri); |
Şimdi oynatmaya başlayabilirsiniz.
1 |
vidView.start(); |
Android işletim sistemi bir dizi video ve medya formatını desteklemektedir; her cihaz bunlarla beraber genellikle ek formatlarlarda desteklemektedir.
Geliştirici Kılavuzunda görebileceğiniz gibi desteklenen video dosya türleri, kullanılan türe ve kullanıcının hangi platform düzeyinde yüklediğine bağlı olarak 3GP, MP4, WEBM ve MKV'yi içerir.
Ses dosyası formatlarını olarakda standart olarak MP3, MID, OGG ve WAV desteği vardır. RTSP, HTTP ve HTTPS (Android 3.1'den) üzerinden Android'de medya akışını gerçekleştirebilirsiniz.
4. Oynatım Kontrollerinin Eklenmesi
1. Adım
Video oynatma işlemini gerçekleştirdik, ancak kullanıcı genel olarak alışık olduğu gibi bunu kontrol etmeyi isteyecektir. Yine, Android platformu MediaController
sınıfı aracılığıyla bu bilindik etkileşim için kaynaklar sağlar.
Activity
sınıfının onCreate
yönteminde, VideoView
'de start
'ı çağırdığımız satırdan önce, sınıfın bir örneğini oluşturun:
1 |
MediaController vidControl = new MediaController(this); |
Ardından, VideoView
örneğini bağlantı noktası olarak kullanacak şekilde ayarlayın:
1 |
vidControl.setAnchorView(vidView); |
Sonra onu VideoView
nesnesinin medya denetleyicisi olarak ayarlayın:
1 |
vidView.setMediaController(vidControl); |
Şimdi uygulamayı çalıştırdığınızda, kullanıcı hızlı ileri ve geri sarma düğmeleri, oynat/duraklat düğmesi ve arama çubuğu kontrolü de dahil olmak üzere akan videonun oynatımını kontrol edebilecektir.
Arama çubuğunun sağinda medya dosyasının uzunluğu ve solunda şu andaki oynatma konumu bulunacaktır. Dosyadaki bir konuma atlamak için arama çubuğuna dokunmanın yanı sıra akış durumu kullanıcının YouTube veya benzeri sitelerden alışık olduğu şekilde gösterilir.



Uygulamayı çalıştırdığınızda göreceğiniz gibi varsayılan davranış kontrollerin bir kaç saniye sonra kaybolması ve kullanıcı ekrana dokunduğunda tekrar görünmesidir. MediaController
nesnesinin davranışını çeşitli şekillerde değiştirebiliriz. Bunun bir örneği için Android için müzik çalar uygulaması oluşturma serisine bakınız. Uygulamanızın davranışını yapılandırmak için çeşitli dinleyiciler(listeners) ayarlayarak medya oynatımını dahada geliştirebilirsiniz.
5. MediaPlayer
Kullanımı
1. Adım
Bitirmeden önce, müzik çalar serisini oluştururken kullandığımız için MediaPlayer
sınıfını kullanarak video akışı için alternatif bir yol izleyelim. Surface view(Yüzey görünümü) kullanarak, video'da dahil olmak üzere, bir medyayı MediaPlayer
nesnesine akıtabilirsiniz. Örneğin, aşağıdaki düzeni kullanabilirsiniz:
1 |
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" |
2 |
xmlns:tools="http://schemas.android.com/tools" |
3 |
android:layout_width="match_parent" |
4 |
android:layout_height="match_parent" |
5 |
android:background="#000000" |
6 |
android:paddingBottom="@dimen/activity_vertical_margin" |
7 |
android:paddingLeft="@dimen/activity_horizontal_margin" |
8 |
android:paddingRight="@dimen/activity_horizontal_margin" |
9 |
android:paddingTop="@dimen/activity_vertical_margin" |
10 |
tools:context=".MainActivity" > |
11 |
|
12 |
<SurfaceView
|
13 |
android:id="@+id/surfView" |
14 |
android:layout_width="fill_parent" |
15 |
android:layout_height="fill_parent" /> |
16 |
|
17 |
</RelativeLayout>
|
Activity
sınıfının uygulanmasında SurfaceView
'e atıfta bulunacağız.
2. Adım
Activity
sınıfınızda aşağıdaki arabirimleri ekleyin:
1 |
public class MainActivity extends Activity implements SurfaceHolder.Callback, OnPreparedListener |
IDE'niz bu uygulanmamış yöntemleri eklemenizi isteyecektir.
1 |
@Override
|
2 |
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { |
3 |
// TODO Auto-generated method stub
|
4 |
}
|
5 |
|
6 |
@Override
|
7 |
public void surfaceCreated(SurfaceHolder arg0) { |
8 |
//setup
|
9 |
}
|
10 |
|
11 |
@Override
|
12 |
public void surfaceDestroyed(SurfaceHolder arg0) { |
13 |
// TODO Auto-generated method stub
|
14 |
}
|
15 |
|
16 |
@Override
|
17 |
public void onPrepared(MediaPlayer mp) { |
18 |
//start playback
|
19 |
}
|
surfaceCreated
ve onPrepared
yöntemlerine eklemeler yapacağız.
3. Adım
Oynatmayı uygulamak için sınıfa aşağıdaki örnek değişkenlerini ekleyin:
1 |
private MediaPlayer mediaPlayer; |
2 |
private SurfaceHolder vidHolder; |
3 |
private SurfaceView vidSurface; |
4 |
String vidAddress = "https://archive.org/download/ksnn_compilation_master_the_internet/ksnn_compilation_master_the_internet_512kb.mp4"; |
Bu değişkenleri Activity
'in onCreate
yönteminde, düzene eklediğiniz SurfaceView
nesnesini kullanarak başlatabilirsiniz:
1 |
vidSurface = (SurfaceView) findViewById(R.id.surfView); |
2 |
vidHolder = vidSurface.getHolder(); |
3 |
vidHolder.addCallback(this); |
4. Adım
surfaceCreated
yönteminde, medya oynatma kaynaklarınızı ayarlayın:
1 |
try { |
2 |
mediaPlayer = new MediaPlayer(); |
3 |
mediaPlayer.setDisplay(vidHolder); |
4 |
mediaPlayer.setDataSource(vidAddress); |
5 |
mediaPlayer.prepare(); |
6 |
mediaPlayer.setOnPreparedListener(this); |
7 |
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); |
8 |
}
|
9 |
catch(Exception e){ |
10 |
e.printStackTrace(); |
11 |
}
|
Son olarak, onPrepared
yönteminde oynatmayı başlatın:
1 |
mediaPlayer.start(); |
Uygulamanızı çalıştırdığınızda, videonuz MediaPlayer
örneğinde oynamalıdır.
Sonuç
Bu yazıda VideoView
ve MediaPlayer
sınıflarını kullanarak Android'de video akışının temellerini açıkladık. Örnek olarak oluşturduğumuz müzik çalar uygulamasına video veya akış medyası desteği ekleyerek burada oluşturduğumuz koda pek çok yenilik ekleyebilirsiniz. Android ile alakalı YouTube Android Player API'ı gibi kaynaklarada bakmak isteyebilirsiniz.