2012-01-08 12 views
5

Đầu tiên, tôi cần phải tạo ra 2 âm thanh sóng trên cùng một tần số, nhưng các pha ngược lại và phát lại những âm thanh đó thành kênh phải và trái ở chế độ âm thanh nổi trên Android. Việc phát lại cần phải được đồng bộ hoàn hảo sao cho các kênh của kênh trái và phải được "nhân đôi" (khi kênh trái có, giá trị mẫu là 120 kênh phải có -120).Cách phát kênh riêng và kênh trái với AudioTrack?

Điều này là tôi chưa tìm thấy bất kỳ bằng chứng nào về cách thiết lập kiểu này hoạt động. Có khả năng cấp 2 âm/mẫu riêng biệt cho AudioTrack để phát lại ở kênh trái và phải riêng biệt và đồng thời không? Nếu không, bất kỳ giải pháp nào khác để đạt được kết quả cuối cùng đều được đánh giá cao.

Tôi đoán một tùy chọn sẽ là sử dụng các tệp sóng âm thanh stereo được tạo trước và phát trực tuyến các tệp đó với AudioTrack, nhưng điều này dường như không linh hoạt đối với giải pháp trong công trình. Đồng thời, nếu AudioTrack có thể phát lại các tệp âm thanh đã được ghi trước này ở chế độ âm thanh nổi "thực", tôi mong đợi điều tương tự cũng có thể xảy ra với âm thanh được tạo.

+2

Nhờ niko20 trong nhóm người dùng dành cho nhà phát triển Android: "Bạn không cần bộ đệm riêng biệt cho phải và trái. Âm thanh nổi là xen kẽ. Để loại bỏ âm thanh nổi, bạn chỉ cần đổ bộ đệm bằng trái sang phải trái-phải".Điều này thực sự hoạt động tốt, được thử nghiệm với AudioTrack – rar

Trả lời

0

Ok điều này có thể hoạt động vì chỉ có hai mẫu.

Trước hết hãy kiểm tra SoundPool. Nó rất hữu ích khi bạn có các bài hát cần hiệu suất tốt khi chúng được tải vào bộ nhớ hoàn toàn. Điều này tuy nhiên có nhược điểm của nó là một trong những chính là giới hạn kích thước của các bài hát được lưu trữ trong bộ nhớ. Khi tôi lần đầu tiên sử dụng này, tôi đã thử đặt 2 x 4Mb tập tin vào một dòng - đây không phải là một ý tưởng tốt.

Soundpool có chức năng này:

setVolume(int streamID, float leftVolume, float rightVolume) 

Chú ý làm thế nào bạn có thể thiết lập âm lượng cho trái và phải cho mỗi dòng? Đối với luồng 1, bạn có thể có một khối lượng tối đa ở bên trái và sau đó cho luồng 2 một khối lượng tối đa bên phải.

Tôi sẽ thiết lập các luồng với các tệp để phát và âm lượng như mong muốn rồi phát lại chúng.

Một hướng dẫn đơn giản có thể được tìm thấy tại http://www.vogella.de/articles/AndroidMedia/article.html

+0

OK Tôi hiểu ý của bạn, nhưng SoundPool không giúp tôi nhiều khi tôi cần tạo âm thanh trong mã của tôi và sử dụng AudioTrack và MODE_STREAM để nạp bộ đệm phát khi đang di chuyển . AudioTrack hỗ trợ CHANNEL_OUT_MONO và CHANNEL_OUT_STEREO cấu hình, nhưng tôi đã không tìm thấy tùy chọn để thực sự cung cấp các âm thanh được tạo mã khác nhau cho kênh trái và phải. – rar

5

AudioTrack có cùng một phương pháp như Soundpool. Nó gọi

AudioTrack.setStereoVolume();

Nếu bạn muốn chơi kênh trái/phải cùng lúc với các dữ liệu khác nhau. Bạn nên xử lý dữ liệu để đáp ứng mục tiêu này. Nếu bạn chọn chế độ stereo với 16Bit PCM, dữ liệu là một byte cho bên trái và một byte cho bên phải. Ví dụ:

kênh trái muốn chơi: 12, 23, 34, 45

cầu môn bên mình muốn chơi: 54, 43, 32, 21 cùng lúc với kênh trái.

dữ liệu cần được tạo ra như: {12, 54, 23, 43, 34, 32, 45, 21}

Sau đó, sử AudioTrack.write (dữ liệu). Nó sẽ hoàn toàn đáp ứng mục tiêu của bạn.

+0

Điều này có đúng không? Tôi có phải đặt một phần tử của mỗi kênh thay thế cho bộ đệm đầu ra không? –

+0

Tôi đang cố gắng thực hiện kênh đơn cho âm thanh đơn âm nhưng tôi thấy nó hiện được thực hiện bởi int setVolume công cộng (float gain) Được thêm vào trong cấp API 21 Đặt giá trị gia tăng đầu ra được chỉ định trên tất cả các kênh của tuyến đường này. API này được ưu tiên hơn setStereoVolume (float, float), vì nó giảm cân một cách duyên dáng thành mono và lên đến nội dung đa kênh ngoài âm thanh nổi. Vì vậy, làm thế nào tôi sẽ kiểm soát nó bây giờ? – VMMF