2011-12-06 41 views
16

Tôi đã tạo một ứng dụng đơn giản tạo ra một làn sóng vuông tần số đã cho và phát nó bằng cách sử dụng AudioTrack ở chế độ STREAM (STREAM_MUSIC). Tất cả mọi thứ dường như được làm việc tốt và âm thanh đóng okay, tuy nhiên khi dòng xong tôi nhận được tin nhắn trong nhật ký:AudioTrack khởi động lại ngay cả sau khi nó dừng lại

W/AudioTrack (7579): obtainBuffer() theo dõi 0x14c228 tàn tật, khởi động lại ...

Ngay cả sau khi gọi hàm stop(), tôi vẫn nhận được các giá trị này. Tôi tin rằng tôi đã đặt đúng kích thước bộ đệm AudioTrack, dựa trên kích thước tối thiểu theo yêu cầu của AudioTrack (trong trường hợp của tôi là 6x1024). Tôi ăn nó với bộ đệm nhỏ hơn 1024 quần short.

Tôi có nhận được những điều này hay không và tôi có nên để nó như thế không?

Trả lời

15

Ok, tôi nghĩ rằng sự cố đã được giải quyết. Lỗi được tạo ra khi bộ đệm không hoàn toàn đầy dữ liệu về thời gian (bộ đệm bị tràn). Tôi không biết thời gian chờ là gì nhưng nếu bạn trải nghiệm điều này hãy đảm bảo rằng:

  1. Bạn không gọi phương thức phát cho đến khi bạn có một số dữ liệu trong bộ đệm.

  2. Bạn có thể tạo dữ liệu đủ nhanh để đánh hết thời gian chờ.

  3. Sau khi bạn đã hoàn thành việc cấp bộ đệm với dữ liệu, trước khi bạn gọi phương thức stop(), hãy đảm bảo rằng bộ đệm "cuối cùng" được điền đầy đủ dữ liệu trước khi hết thời gian chờ.

Tôi xử lý vấn đề cuối cùng bằng cách chờ một chút (cho đến khi hết giờ) rồi gửi 1 bộ đệm đầy đủ số 0 và cuối cùng gọi hàm stop().

Hãy nhớ rằng bạn luôn phải gửi bộ đệm theo các đoạn nhỏ hơn, ngay cả khi bạn có sẵn đoạn lớn. Nó vẫn làm phiền tôi một chút rằng tôi không chắc chắn 100% nếu đó là đúng cách nhưng các lỗi đã biến mất vì vậy tôi đoán tôi có thể sống với điều đó :)

5

Tôi đã tìm thấy rằng ngay cả khi bộ đệm là kỹ thuật đủ dài, và đầy byte, nếu chúng không được định dạng đúng (các đoạn âm thanh được chuyển đổi thành một mảng byte) nó sẽ vẫn ném cho bạn lỗi đó.

4

Tôi đã nhận được cảnh báo đó khi tôi khởi tạo Audiotrack, được gọi là audioTrack.play() và có sự chậm trễ nhỏ giữa cuộc gọi play() và số audioTrack.write(). Nếu tôi gọi play() ngay trước write() cảnh báo biến mất.

+0

Đó là điểm - điền bộ đệm với dữ liệu trước khi gọi vở kịch. Sau đó, đảm bảo bạn có thể tạo dữ liệu đúng lúc. Bạn sẽ có độ trễ và nó phụ thuộc vào điện thoại của bạn (kích thước bộ đệm tối thiểu), tỷ lệ mẫu và độ phân giải động mà bạn sử dụng. Im trường hợp của tôi (HTC Desire) 6kB. Đây là khoảng 3000 mẫu đơn 16 bit. Bạn có thể dễ dàng tính toán độ trễ kết quả khi tính tỷ lệ mẫu vào tài khoản. Nếu bạn sử dụng API âm thanh gốc, bạn có thể nhận được độ trễ nhỏ hơn nhiều, nhưng vẫn còn xa 5ms nhỏ của iPhone ... –

0

Tôi đã giải quyết bằng cách này

 if (mAudioTrack.getPlayState()!=AudioTrack.PLAYSTATE_PLAYING) 
      mAudioTrack.play(); 
     mAudioTrack.write(b, 0, sz * 2); 
     mAudioTrack.stop(); 
     mAudioTrack.flush(); 
Các vấn đề liên quan