2011-01-12 27 views
5

Tôi đang trong giai đoạn rất nhiệt tình phát triển ứng dụng này nhưng nhìn vào nó tôi đã đạt đến một vấn đề. Tôi cần để có thể chơi một tập tin âm thanh ngược (bạn biết như để tiết lộ tin nhắn ẩn;)). Tôi không có kinh nghiệm làm việc với âm thanh trên Android và không có ý tưởng nếu điều này thậm chí có thể.Đảo ngược tập tin âm thanh trong Android

Tôi tìm thấy một câu hỏi trên đây mà giải quyết vấn đề trong java (Click Here For Question)

Nhưng điều này làm cho việc sử dụng thư viện javax.sound mà android không hỗ trợ. Tôi có cần thư viện này để giải quyết vấn đề này hay có cách khác để đảo ngược một tệp âm thanh không?

+0

Xin chào @SamRowley Bạn có đạt được mục tiêu của mình bằng thuật toán được mô tả không? Tôi sao chép tiêu đề 44-byte đầu tiên chính xác từ bản gốc để đảo ngược tập tin âm thanh, và tôi không thể làm cho âm thanh wav để chơi? Tôi sử dụng sox và đảo ngược âm thanh và kiểm tra rằng tiêu đề 44-byte là không chính xác? Xin vui lòng nếu bạn có thể giúp tôi với bất kỳ lời khuyên nào tôi sẽ đánh giá cao nó –

Trả lời

5

Tệp WAV điển hình bao gồm tiêu đề 44 byte theo sau là giá trị mẫu thực tế. Kích thước của một "khung" phụ thuộc vào các thuộc tính của tệp WAV: một tệp là âm thanh nổi và 16 bit mỗi mẫu sẽ có kích thước khung 4 byte (hai byte cho mẫu bên trái và hai byte cho mẫu bên phải).

Vì vậy, trong mã, bạn sẽ tạo một tệp WAV thứ hai bằng cách tạo một mảng byte có kích thước tổng thể giống như bản gốc. Bạn sao chép tiêu đề 44-bit từ bản gốc vào bản sao, và sau đó lặp qua các khung gốc bắt đầu từ cuối cùng và làm việc chuyển tiếp đến đầu tiên. Bạn sao chép từng khung vào vị trí nghịch đảo trong mảng sao chép (tức là khung gốc cuối cùng được sao chép vào mảng sao chép ngay sau tiêu đề; khung thứ hai đến cuối được sao chép sau khung đầu tiên, v.v.). Sau đó, chỉ cần chơi tập tin đảo ngược.

Vì vậy, bạn không cần thư viện javax.sound để thực hiện việc này - bạn chỉ cần có khả năng sao chép và thao tác các byte. FYI, không phải tất cả các tệp WAV đều "kinh điển" như thế này (chuẩn có nghĩa là tiêu đề 44 byte cùng với các giá trị mẫu và không có gì khác). Định dạng WAV thực sự là một định dạng RIFF, có nghĩa là trong lý thuyết bạn cần phải khai thác phức tạp hơn các giá trị mẫu. Trong thực tế (đặc biệt là nếu bạn đang tạo ra các tập tin WAV chính mình) bạn thường có thể nhận được đi với một cách tiếp cận đơn giản hơn nhiều như tôi đã mô tả ở đây.

LƯU Ý: nếu âm thanh của bạn là tệp MP3 thì việc đảo ngược là một tác vụ phức tạp hơn vì dữ liệu mẫu không được lưu trữ dưới dạng mẫu trong tệp MP3. Nếu bạn đang sử dụng MP3, một cách để đảo ngược chúng là chuyển đổi chúng thành WAV và sau đó đảo ngược tệp WAV.

+0

Tôi đang tạo tệp WAV bằng cách ghi lại âm thanh từ micrô bằng cách sử dụng MediaRecorder, vì vậy tôi đoán cách này sẽ ổn? Làm thế nào tôi sẽ đi về nhận được các tập tin được lưu từ sdcard vào một mảng byte và sao chép các tiêu đề 44bit? Cảm ơn bạn đã trả lời đầu tiên của bạn nó đã được hữu ích cho đến nay và tôi hiểu khái niệm. – SamRowley

+1

Vâng, tệp WAV bạn nhận được từ MediaRecorder có lẽ là chuẩn, vì vậy bạn nên ổn. Đây là một liên kết với một số mã hơn sẽ giúp bạn làm những gì bạn cần làm: http://www.dreamincode.net/forums/topic/171550-converting-short-array-to-byte-array-using-java- trên thiết bị Android / – MusiGenesis

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