WAV Dosya Yapısı ve C# ile WAV Dosyası Oluşturmak

Kullanıcı Oyu:  / 2
En KötüEn İyi 

Ses dosyalarını birleştirmek, bölmek, belirli bir süre sessizlik üretmek isteyenlerin ilgisini çekebilecek bir konuda anlatımlı örnek hazırladım.

"WAV File Format" anahtar kelimesi ile Google araması yaptığınızda daha ayrıntılı ve görsel anlatımlı bilgiler bulacaksanız. Buradaki örnekte amacımız, programlarımızda kullanmak üzere, istediğimiz uzunlukta ve isimde sessiz WAV dosyaları oluşturmak. Niye peki? Hem anlamak için hem de yazılımlarımızda ses dosyalarını birleştirirken aralara belli sürelerde sessizlik eklemek isteyebileceğimiz için.

Önce gerekli kütüphaneleri belirtelim:

1
2
using System.Text; // Encoding.ASCII.GetBytes gibi komutlar için gerekli 
using System.IO; // Dosya işlemleri içim gerekli

Fonksiyonumuzu programımızın herhangi bir yerinden şöyle çağıracağız:

1
wavOlustur(17 , @"c:\deneme.wav"); // 17 saniye uzunluğunda C:\deneme.wav isminde bir ses dosyası oluşturur.

Kod aşağıdaki gibidir:

C# İle WAV Formatında Dosya Oluşturan Örnek Kod
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
		  public void wavOlustur(int saniye, string dosyaadi)
        {
		       	if (File.Exists(dosyaadi))
		       	{
		       		File.Delete(dosyaadi);
		       	}
		       	byte[] bosVeri = new byte[saniye * 48000 * 4];
                     	 //1
                     	FileStream bosWavDosyasi = null;
                        BinaryWriter w;
bosWavDosyasi = new FileStream(dosyaadi, FileMode.CreateNew);
                       w = new BinaryWriter(bosWavDosyasi);
                                          #region wavheader
                                            //2
  byte[] riff = Encoding.ASCII.GetBytes("RIFF"); w.Write(riff, 0, riff.Length); byte[] chunkSize = BitConverter.GetBytes(bosVeri.Length + 44 - 8); w.Write(chunkSize, 0, chunkSize.Length); byte[] wave = Encoding.ASCII.GetBytes("WAVE"); w.Write(wave, 0, wave.Length);   //3 string SubChunk1ID = "fmt "; int Subchunk1Size = 16; //For PCM int AudioFormat = 1; //For no compression int NumChannels = 2; //1 For Mono, 2 For Stereo int SampleRate = 48000; int BitsPerSample = 16; int ByteRate = SampleRate * NumChannels * (BitsPerSample / 8); int BlockAlign = NumChannels * (BitsPerSample / 8); byte[] _subchunk1ID = Encoding.ASCII.GetBytes(SubChunk1ID); w.Write(_subchunk1ID, 0, _subchunk1ID.Length); byte[] _subchunk1Size = BitConverter.GetBytes(Subchunk1Size); w.Write(_subchunk1Size, 0, _subchunk1Size.Length); byte[] _audioFormat = BitConverter.GetBytes(AudioFormat); w.Write(_audioFormat, 0, 2); byte[] _numChannels = BitConverter.GetBytes(NumChannels); w.Write(_numChannels, 0, 2); byte[] _sampleRate = BitConverter.GetBytes(SampleRate); w.Write(_sampleRate, 0, _sampleRate.Length); byte[] _byteRate = BitConverter.GetBytes(ByteRate); w.Write(_byteRate, 0, _byteRate.Length); byte[] _blockAlign = BitConverter.GetBytes(BlockAlign); w.Write(_blockAlign, 0, 2); byte[] _bitsPerSample = BitConverter.GetBytes(BitsPerSample); w.Write(_bitsPerSample, 0, 2);   //4 byte[] _subChunk2ID = Encoding.ASCII.GetBytes("data"); w.Write(_subChunk2ID, 0, _subChunk2ID.Length); byte[] _subChunk2Size = BitConverter.GetBytes(bosVeri.Length); w.Write(_subChunk2Size, 0, _subChunk2Size.Length);   #endregion wavheader //---------buraya kadar ilk 0-43 byteları hazırladık   w.Write(bosVeri, 0, bosVeri.Length);   w.Close(); bosWavDosyasi.Close();
                              bosWavDosyasi = null;
}

Örneğimiz, 48000 Hz, 16 bit, stereo(2 kanal), PCM, 17 saniye uzunluğunda sessiz bir WAV ses dosyası oluşturur.

Yukarıdaki örnek boş bir WAV dosyası oluşturmak içindi.

WAV Dosya Yapısı

 

Eğer WAV dosyalarını birleştirmek isterseniz;

İlk 44 byte içerisinde dosyanın özellikleri bulunur. Sonraki veri sadece ses verisidir.

4 numaralı byte dan itibaren 4 byte lık yerin formülü;

bosVeri.Length + 44 - 8

ve 40 numaralı byte dan itibaren 4 byte lık yerin formülü;

bosVeri.Length

olup, WAV birleştirme veya bölme işlemlerinde dikkat etmeniz ve hesaplatmanız gereken değişken kısımlar bu ikisidir.

Dosya özelliklerindeki diğer bilgiler, eğer benim bu örnekteki özellikler ile çalışıyorsanız sabit olacağından, hesaplama yapmanızı gerektirmezler.

Örneğin WAV dosyalarını birleştirmek isterseniz, önce oluşacak tek wav dosyası için sıfır bir dosya açın ve yukarıdaki header bilgilerini yani ilk 44 bytelık bilgiyi aynen yazdırın.
Sonra birleşecek her WAV dosyasının 44 üncü byte dan dosya sonuna kadarını okuyup oluşacak wav dosyasının içine sırayla yazdırın.
İşiniz bitince oluşacak tek WAV dosyasını kapatın(burada kullanmadığımız özellik: kapatmadan Seek komutlarını kullanarak da konumlandırma da yapabilirdik çünkü dosya üzerinde geri dönüp bazı alanları güncelleme işimiz var).
Sonra oluşmuş WAV dosyasını tekrar açın ve 4 ile 40 ıncı byte alanlarında bulunan 4 bytelık sayıları, yukarıda verdiğim formüllere göre tekrar kaydedin. Birincisi dosya uzunluğu - 8 olacak, diğeri dosya uzunluğu - 44 olacak.
Dosyayı kapatın.
Böylece birden fazla WAV dosyası tek bir WAV dosyası olarak birleşmiş olur.

Daha ayrıntılı bilgi ve dosya çeşitlilikleri için, internette "WAV File Format" kelimelerini arattırdığınızda karşınıza çıkacak olan dökümanlardan faydalanabilirsiniz.

Bilişim Haberleri

Windows Live Hotmail Türkiye Kullanım Sayıları

Internete her gün 32 milyon vatandaşımız erişiyormuş ve de 20 milyon kişi hem Hotmail mail hesabı hem de MSN instant messaging kullanıyormuş.

turkerHR Yayınlandı!

Kodları tamamen bana ait olan turkerHR yazılımımı hemen indirip kurup kullanabilirsiniz. Kaynak kodları herkese açık, şimdilik biraz kötü görünebilir, iyileştireceğim.

Joomla 1.6.1 Güvenlik Sürümü Yayınlandı

Joomla 1.6 kullananların 1.6.1 sürümüne güncelleme yapmaları gerekiyor güvenlik gereği.

PayPal ile Türk Lirası Kullanabiliriz

PayPal’ın ne zaman Türk Lirası ödemelerini kabul edeceğini merak ediyorsanız, artık ediyor.


Social Widget