Bu derste uç birimde çalışan basit ses çalıcısına devam ediyoruz
Bu ders uç birimde çalışan basit ses çalıcısının devamıdır.
Bu derste çalıcıyı nasıl ileri sarabileceğimize bakacağız.
Bu sefer C kodunu da ekleyeceğiz.
Aşağıdaki kütüğü ilk.c
olarak kaydediniz.
#include <gst/gst.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
char* birlestir(const char *ilk, const char *ikinci)
{
char *sonuc = malloc(strlen(ilk) + strlen(ikinci) + 1);
strcpy(sonuc, ilk);
strcat(sonuc, ikinci);
return sonuc;
}
int oynat(int argc, char *argv[])
{
GstElement *oynatici;
GstBus *veriYolu;
GstMessage *ileti;
gst_init(&argc, &argv);
char* dosyaAc = "playbin uri=file://";
char* kutuk = "ses.mp3";
char* sonuc = birlestir(dosyaAc, kutuk);
printf("Birleştikten sonra %s", sonuc);
oynatici = gst_parse_launch(sonuc, NULL);
/* durakla */
gst_element_set_state(oynatici, GST_STATE_PAUSED);
/* gerekiyor */
gst_element_get_state(oynatici, NULL, NULL, GST_CLOCK_TIME_NONE);
long birSaniye = 1000000000;
long sarmaZamani = 71 * birSaniye;
/* ileri sar */
if (!gst_element_seek (oynatici,
1.0,
GST_FORMAT_TIME,
GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT |
GST_SEEK_FLAG_ACCURATE,
GST_SEEK_TYPE_SET,
sarmaZamani,
GST_SEEK_TYPE_NONE,
-1))
{
g_print ("Sarma başarısız!\n");
}
gst_element_set_state(oynatici, GST_STATE_PLAYING);
veriYolu = gst_element_get_bus(oynatici);
ileti = gst_bus_timed_pop_filtered (veriYolu, GST_CLOCK_TIME_NONE,
GST_MESSAGE_ERROR |
GST_MESSAGE_EOS);
if (GST_MESSAGE_TYPE (ileti) == GST_MESSAGE_ERROR)
{
g_error("Bir hata oluştu");
}
/* Kaynakları geri ver */
gst_message_unref(ileti);
gst_object_unref(veriYolu);
gst_element_set_state(oynatici, GST_STATE_NULL);
gst_object_unref(oynatici);
free(sonuc);
return 0;
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL, "tr_TR.utf8");
return oynat(argc, argv);
}
Eğer bash
kabuğu kullanıyorsanız C kodunu aşağıdaki gibi derleyebilirsiniz.
gcc ilk.c -o ilk `pkg-config --cflags --libs gstreamer-1.0`
Eğer 'fish' kabuğu kullanıyorsanız ~/.config/fish/functions/
dizininde derle.fish
isminde bir işlev oluşturunuz.
İçine aşağıdakileri giriniz.
function derle
set kutuk (string join '' $argv[1] .c)
gcc $kutuk -o $argv[1] (pkg-config --cflags --libs gstreamer-1.0 | string split -n " ")
end
Artık kaynak kodunu derle ilk
yazarak derleyebilirsiniz.
Aşağıdaki kütüğü ilk.vala
olarak kaydediniz.
using Gst;
void ileriSar(Gst.Element oynatici, int baslangic, int bitis)
{
/* durakla */
oynatici.set_state(Gst.State.PAUSED);
/* gerekiyor */
oynatici.get_state(null, null, Gst.CLOCK_TIME_NONE);
long birSaniye = 1000000000;
long sarmaZamani = baslangic * birSaniye;
long sarmaBitis = bitis * birSaniye;
if (!oynatici.seek(1.0,
Gst.Format.TIME,
Gst.SeekFlags.FLUSH | Gst.SeekFlags.SEGMENT |
Gst.SeekFlags.ACCURATE,
Gst.SeekType.SET,
sarmaZamani,
Gst.SeekType.SET,
sarmaBitis))
{
stdout.printf("Bir hata oluştu\n");
}
}
int main (string [] secenekler)
{
Gst.Element oynatici;
Gst.Bus veriYolu;
Gst.Message ileti;
Gst.init (ref secenekler);
var dosyaAc = "playbin uri=file://";
var kutukIsmi = "ses.mp3";
stdout.printf("Birleştikten sonra %s%s\n", dosyaAc, kutukIsmi);
oynatici = Gst.parse_launch(dosyaAc + kutukIsmi, null);
ileriSar(oynatici, 71, 87);
oynatici.set_state(Gst.State.PLAYING);
veriYolu = oynatici.get_bus();
ileti = veriYolu.timed_pop_filtered (Gst.CLOCK_TIME_NONE,
Gst.MessageType.ERROR |
Gst.MessageType.EOS);
if (ileti.type == Gst.MessageType.ERROR)
{
stdout.printf("Bir hata oluştu\n");
}
oynatici.set_state(Gst.State.NULL);
return 0;
}
Uygulamayı derlemek için aşağıdaki komutu veriniz.
valac --pkg gstreamer-1.0 ilk.vala
Aşağıdaki kütüğü ilk.d
ismi ile kaydediniz.
import glib.MainLoop : Döngü = MainLoop;
import gstreamer.GStreamer : SesKütüphanesi = GStreamer;
import gstreamer.Parse : İşle = Parse;
import gstreamer.Message : Durum = GstState;
import gstreamer.Element : Eleman = Element;
import gstreamer.c.types : GstClockTime;
import gstreamer.c.types : SÜRESİZ = GST_CLOCK_TIME_NONE;
import gstreamer.c.types : Bayraklar = GstSeekFlags;
import gstreamer.c.types : Biçim = GstFormat;
import gstreamer.c.types : SarmaŞekli = GstSeekType;
import gstreamer.c.types : İleti = MessageType;
import gtk.Main : Ana = Main;
import std.stdio: yaz = writeln;
alias çalıştır = İşle.launch;
alias ÇALIYOR = Durum.PLAYING;
alias DURAKLADI = Durum.PAUSED;
alias BOŞTA = Durum.NULL;
alias NANOSANİYE = Biçim.TIME;
alias TAMKONUM = SarmaŞekli.SET;
alias HATAİLETİSİ = İleti.ERROR;
alias DOSYASONU = İleti.EOS;
void ileriSar(Eleman oynatıcı, int başlangıç, int bitiş)
{
/* durakla */
oynatıcı.setState(DURAKLADI);
Durum boşta = BOŞTA;
/* gerekiyor */
oynatıcı.getState(boşta, boşta, SÜRESİZ);
long birSaniye = 1000000000;
long sarmaZamanı = başlangıç * birSaniye;
long sarmaBitiş = bitiş * birSaniye;
Bayraklar tümBayraklar = Bayraklar.FLUSH | Bayraklar.SEGMENT | Bayraklar.ACCURATE;
if (!oynatıcı.seek(1.0,
NANOSANİYE,
tümBayraklar,
TAMKONUM,
sarmaZamanı,
TAMKONUM,
sarmaBitiş))
{
yaz("Bir hata oluştu\n");
}
}
int main (string[] seçenekler)
{
SesKütüphanesi.init(seçenekler);
auto kütükİsmi = "ses.mp3";
auto oynatıcı = çalıştır("playbin uri=file://" ~ kütükİsmi);
ileriSar(oynatıcı, 71, 87);
oynatıcı.setState(ÇALIYOR);
auto veriYolu = oynatıcı.getBus();
auto ileti = veriYolu.timedPopFiltered(SÜRESİZ,
HATAİLETİSİ | DOSYASONU);
if (ileti.type == HATAİLETİSİ)
{
yaz("Bir hata oluştu\n");
}
oynatıcı.setState(BOŞTA);
return 0;
}
Derlemek için aşağıdaki komutu veriniz.
gdc ilk.d -I/usr/include/d/gtkd-3 -L /usr/lib -lgtkd-3 -lgstreamerd-3 -o ilk
Uygulama sesi çalmadan önce 71. saniyeye sarıyor.
71 ve 87 saniyeler arasını çalıyor.
Burada ileri sarma ("seek") işlevine nano saniye cinsinden değer gönderiyoruz.
Yorumlar