Sen tüm kontrol edilmelidir:
ekstra veri kendisi (eğer varsa), şu şekilde görünecektir byte başlık uzunluğunu tespit etmek için 36.
Yani basit bir C# programı başlıyor gerçek boyutların ne olduğunu görmek için başlık verileri. Yayın Dalga Biçimi dosyaları daha büyük bir uzantı alt yığını içerecektir. Pro Tools'un WAV ve AIFF dosyalarının, sesin yanı sıra belgelenmemiş olan daha fazla uzantı parçası vardır. Örnek verilerinin nerede başladığını ve bittiğini bildiğinizden emin olmak istiyorsanız, gerçekte veri yığınını (WAV dosyaları için 'veri' ve AIFF için 'SSND') aramanız gerekir.
gözden gibi, tüm WAV subchunks şu biçimde:
Subchunk Descriptor (4 bytes)
Subchunk Size (4 byte integer, little endian)
Subchunk Data (size is Subchunk Size)
Bu işlemek için çok kolaydır. Tek yapmanız gereken tanımlayıcıyı okumaktır, eğer aradığınız kişi değilse, veri boyutunu okuyun ve ileriye atlayın. Bunun için basit bir Java rutin şu şekilde görünecektir: Burada Özellikle
found 'RIFF' descriptor
found 'bext' descriptor
found 'fmt ' descriptor
found 'minf' descriptor
found 'elm1' descriptor
found 'data' descriptor
found 'regn' descriptor
found 'ovwf' descriptor
found 'umid' descriptor
end of file
, hem 'fmt' ve 'veri' meşru görünür: Burada Örneğin
//
// Quick note for people who don't know Java well:
// 'in.read(...)' returns -1 when the stream reaches
// the end of the file, so 'if (in.read(...) < 0)'
// is checking for the end of file.
//
public static void printWaveDescriptors(File file)
throws IOException {
try (FileInputStream in = new FileInputStream(file)) {
byte[] bytes = new byte[4];
// read first 4 bytes
// should be RIFF descriptor
if (in.read(bytes) < 0) {
return;
}
printDescriptor(bytes);
// first subchunk will always be at byte 12
// there is no other dependable constant
in.skip(8);
for (;;) {
// read each chunk descriptor
if (in.read(bytes) < 0) {
break;
}
printDescriptor(bytes);
// read chunk length
if (in.read(bytes) < 0) {
break;
}
// skip the length of this chunk
// next bytes should be another descriptor or EOF
in.skip(
(bytes[0] & 0xFF)
| (bytes[1] & 0xFF) << 8
| (bytes[2] & 0xFF) << 16
| (bytes[3] & 0xFF) << 24
);
}
System.out.println("end of file");
}
}
private static void printDescriptor(byte[] bytes)
throws IOException {
String desc = new String(bytes, "US-ASCII");
System.out.println("found '" + desc + "' descriptor");
}
Ben rastgele WAV dosyası Diğer öğeler arasında, Microsoft's RIFF specification, alt bölümlerin herhangi bir sırada görünebileceğini söylüyor. Bildiğim bazı büyük ses sistemleri bile yanlış anlıyorlar ve bunu hesaba katmıyorlar.
Belirli bir yığın bulmak istiyorsanız, aradığınız dosyayı bulana kadar her tanıtıcıyı kontrol ederek dosyaya geçin.
Verilerin başka bir yerde başladığı birçok WAV dosyası var: belki dosyanın başlangıcından yüzlerce bayt, kim bilir? WAV yığın başlıklarının ayrıştırılması gerçekten kolaydır, bunları ayrıştırmadığınız için herhangi bir mazeretiniz yoktur. –
Başlığın ayrıştırılması için bir mazeret olmadığı doğru, ancak bu konuda bir sürü yanlış bilgi var. Google'da "wav parser" kelimesini arayın ve en çok sayıda hit, tartışma olmadan 44 bayt uzunluğa sahip olan kod içeriyor. SO, daha büyük bir şeye yönelik ipuçlarını içeriyordu. Bakmaya giden bir sonraki sinirli insan için bu konuya dikkat çekmeye çalışıyorum. –
Her zaman [WAVE PCM ses dosyası formatı] (https://ccrma.stanford.edu/courses/422/projects/WaveFormat/) sayfasında Müzik ve Akustik (Standford) Web sitesinde Bilgisayar Araştırmaları Merkezi sayfasında yer aldım. Bu tür bir şey için yararlı bir kaynak ol. – Sheridan