2010-04-14 28 views
5

Ứng dụng của chúng tôi cần biết số lượng mẫu của các tệp âm thanh mà nó tải. Thư viện chúng tôi đang sử dụng có thể xác định một cách đáng tin cậy tốc độ lấy mẫu, nhưng không xác định số lượng mẫu. Có thể tính toán số lượng mẫu từ kích thước tệp và tỷ lệ mẫu không?Với một tệp WAV, kích thước tệp và tỷ lệ mẫu của nó, có thể tính số lượng mẫu không?

Trả lời

4

Giả sử tệp WAV là PCM, bạn có thể tính toán nó bằng cách sử dụng kích thước của đoạn dữ liệu. Số byte trên mỗi mẫu đơn giản là số bit trên mỗi mẫu chia cho tám. Số bit trên mỗi mẫu sẽ có mặt trong cấu trúc WAVEFORMAT. Điều này có thể được sử dụng để có được số lượng mẫu chính xác.

+0

tôi có thể làm việc ra các kích thước của đoạn dữ liệu từ kích thước tập tin, hay tôi cần phải biết nhiều hơn - ví dụ kích thước tiêu đề? – Simon

+0

Các tệp WAV luôn có đoạn định dạng và một đoạn dữ liệu. Họ có thể có những phần khác. Cách duy nhất để đảm bảo kích thước dữ liệu là tìm và đọc thông số kích thước của nó. Bạn đang sử dụng ngôn ngữ và thư viện nào? –

+0

C# và MediaInfoLib. – Simon

5

Dấu hiệu cho biết. Không, thông thường bạn cần phải diễn giải tiêu đề. Nhưng nếu định dạng, số lượng kênh và số bit trên mỗi mẫu được biết và giống nhau đối với tất cả các tệp bạn có thể tính toán theo lý thuyết từ kích thước tệp.

WAV là một định dạng đơn giản, không may đã có nhiều biến thể lạ của định dạng từ các nhà phát triển phần cứng và phần mềm lớn và nhỏ trong những năm qua. Thông thường, bạn có thể đếm trên định dạng được kosher nếu các tập tin đến từ một trình soạn thảo sóng chính thống hiện đại. Vì vậy, nếu các mẫu được chuẩn hóa bằng cách xuất chúng từ WaveLab hoặc tương tự, bạn có thể lưu mã (nhỏ) cho trình thông dịch tiêu đề.

Mô tả định dạng .wav dễ đọc nhất là here. StripWav là một chương trình nhỏ để chuẩn hóa mẫu; cũng có một công cụ dòng lệnh có khả năng hơn: sox. Sox hỗ trợ công việc hàng loạt, do đó, nó sẽ tốt hơn bằng cách sử dụng trình chỉnh sửa wave - giả sử tập hợp các tệp .wav là một tệp đã cho và không phải là 'động'.

Vì vậy: Nếu bạn có thể chuẩn hóa chúng một lần và cho tất cả với một công việc hàng loạt sox, điều đó có thể thực hiện được. Tôi đã sử dụng mô tả định dạng này và Sox để có hiệu quả tuyệt vời nhiều lần, chúc may mắn :)

1

Trong định dạng PCM wav tiêu đề chứa thông tin được gọi là khối lượng bao nhiêu byte một mẫu.

Thông thường nếu bạn có tệp wav PCM wav chuẩn không có siêu dữ liệu được đính kèm với nó (trường hợp thông thường). Blockalign là một số nguyên 2 byte tại offset 32 ​​(từ 33 đến 34 byte từ đầu của tệp wav). Và kích thước tệp dữ liệu được gọi là datasize là số nguyên 4 byte ở độ lệch 40 (byte thứ 41 đến 44 tạo thành tệp khởi tạo của tệp wav).

Bây giờ, dữ liệu hóa/chặn khối là những gì bạn muốn.

PS

Trong trường hợp bạn có một định dạng wav phức tạp hơn, nếu nó RIFF, các Thông tin định dạng và dữ liệu được đưa vào "khối" khác nhau (cùng với một số khối khác mà bạn có thể không cần), và các offsets nói trên có thể không chính xác, sau đó bạn nên nhìn vào khối. Trong trường hợp của bạn, bạn cần phải tìm fmt và dữ liệu chunk.

Mỗi khối bắt đầu bằng một dữ liệu mã ASCII 4 byte được gọi là FOURCC, 'fmt' cho biết rằng đoạn bao gồm thông tin định dạng và 'dữ liệu' biểu thị một đoạn dữ liệu. Ngay sau khi FOURCC là một số nguyên 4 byte cho biết kích thước (tính theo byte) của đoạn sau (FOURCC và 4 byte này không được tính).

Tài liệu tham khảo:

A simple wav header reference HERE

More general RIFF wav format HERE

Các vấn đề liên quan