Tôi đang cố gắng tìm cách sử dụng bộ đệm với AudioTrack để phát nhạc hiệu quả. Tôi biết bạn có thể xếp hàng âm thanh bằng cách sử dụng phương thức write nhưng sau khi âm thanh được xếp hàng đợi thì bạn cho biết số tiền còn lại so với số lượng đã được sử dụng/phát? Xin lỗi nếu đây là một câu hỏi thô sơ. Tôi hiểu khái niệm về một bộ đệm Tôi chỉ không chắc chắn làm thế nào để viết một, đặc biệt là bằng cách sử dụng AudioTrack.Sử dụng bộ đệm với Android AudioTrack
Trả lời
AudioTrack.write() Thu nhập "số byte bằng văn bản" như một int, và bạn chỉ định số byte trong bộ đệm khi xây dựng AudioTrack.
Do đó, để theo dõi lượng bộ nhớ còn lại, bạn có thể giữ biến tích lũy để biết tổng số byte đã được ghi và đặt biến này thành 0 khi bạn gọi AudioTrack.flush(). Tuy nhiên, các tài liệu liên kết nói rằng "nó là điển hình để sử dụng khối 1/2 tổng kích thước để cho phép đệm đôi", do đó, nó có thể đơn giản, đủ để chỉ cần nhớ nếu bạn đã viết số không, một hoặc hai lần kể từ khi gọi tuôn ra .
Để nói bao nhiêu của bộ đệm đã được chơi, sử dụng AudioTrack.getPlaybackHeadPosition() mà trả về số khung đã được chơi của bộ đệm hiện (tức là thiết lập lại để không trên dừng, tuôn ra hoặc tải lại) như đã ký kết Số nguyên 32 bit nhưng được hiểu là số nguyên 32 bit chưa ký. Tất cả điều này thực sự có nghĩa là bạn gán nó cho một int như sau.
int bufferPlaybackFrame = myAudioTrack.getPlaybackHeadPosition() & 0xFF;
Bạn có thể nghĩ các khung tương đương với mẫu. tức là Bạn có thể làm việc từ AudioFormat được sử dụng để xây dựng AudioTrack có bao nhiêu bit (và do đó byte) đang được sử dụng cho mỗi mẫu.
Cuối cùng, trong trường hợp ai đó đang băn khoăn, bạn sẽ không bao giờ có thể biết được tệp hoặc luồng nguồn được để phát thông qua đối tượng này (một lý do được thiết kế để hoạt động với luồng 24/7 cố định, không có kết thúc), vì vậy nếu bạn muốn tính toán như bạn thấy trên một số trang web đang phát video, việc đó tạm dừng luồng cho đến khi đủ id đệm để xem toàn bộ video ở tốc độ tải xuống hiện tại của bạn, bạn sẽ phải chuyển thông tin đó vào một số cách khác.
Cảm ơn bạn, câu trả lời rất hữu ích. –
@Andrew nếu tôi muốn tải xuống (một lần) các tệp âm thanh từ máy chủ và sau đó các tệp sẽ phát ngoại tuyến. ? –
@DevendraSingh sau đó bạn sẽ sử dụng một lớp khác nhau và phương pháp tất cả cùng nhau (tôi không có một trực giác như mà). Điều này là để truy cập các luồng liên tục, bất tận, 24/7 mà bạn không thể thực sự tải xuống và phát ngoại tuyến. –
* Mã này sẽ giúp để chơi âm thanh với bộ đệm *
private void PlayShortAudioFileViaAudioTrack(String filePath) throws IOException
{
// We keep temporarily filePath globally as we have only two sample sounds now..
if (filePath==null)
return;
//Reading the file..
byte[] byteData = null;
File file = null;
file = new File(filePath);
// for ex. path= "/sdcard/samplesound.pcm" or "/sdcard/samplesound.wav"
byteData = new byte[(int) file.length()];
FileInputStream in = null;
try {
in = new FileInputStream(file);
in.read(byteData);
in.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Set and push to audio track..
int intSize = android.media.AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_8BIT);
AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_8BIT, intSize, AudioTrack.MODE_STREAM);
if (at!=null) {
at.play();
// Write the byte array to the track
at.write(byteData, 0, byteData.length);
at.stop();
at.release();
}
else
Log.d("TCAudio", "audio track is not initialised ");
}
Xin lỗi, tôi cần phải cụ thể hơn. Tôi không có quyền truy cập vào toàn bộ tệp vì tôi đang phát trực tuyến, do đó tôi không thể tải toàn bộ tệp vào bộ đệm trước khi phát lại. –
- 1. Sử dụng AudioTrack với bộ AudioManagerĐiện thoại thông minhOn
- 2. Sử dụng AudioTrack trong Android để phát tệp WAV
- 3. Sử dụng bộ đệm stencil với iOS
- 4. Tùy chọn codec AudioRecord và AudioTrack Android?
- 5. AudioTrack lạ Android tai nạn
- 6. Android: Phát các tệp MP3 bằng AudioTrack bằng ffmpeg
- 7. Có thể sử dụng Boost.Format với bộ đệm preallocated không?
- 8. Sử dụng API bộ đệm trong Cython
- 9. Sử dụng bộ đệm tròn là gì?
- 10. Bộ nhớ đệm mùa xuân so với bộ nhớ đệm
- 11. AudioTrack: play() được gọi là AudioTrack chưa được khởi tạo
- 12. Bộ đệm đôi với wxpython
- 13. Bộ đệm bộ đệm giới hạn được sử dụng cho mmap
- 14. Sử dụng đối tượng đệm pixel (PBO) trên Android
- 15. Android Camera takePicture đang sử dụng Xem trước bộ đệm nhỏ
- 16. Tự động xóa bộ đệm trong khi đang sử dụng OpenGL trên Android
- 17. Cách phát kênh riêng và kênh trái với AudioTrack?
- 18. Android AudioTrack không phát tất cả các mẫu
- 19. Dillema với tràn bộ đệm
- 20. Sử dụng nhiều bộ đệm Vertex Trong DX10/DX11
- 21. Sử dụng OpenGL trong Matlab để lấy bộ đệm sâu
- 22. Không thể sử dụng bộ đệm đầu ra trong bộ xử lý hiển thị bộ đệm đầu ra
- 23. trang bộ nhớ đệm bằng cách sử dụng php
- 24. Điều khiển bộ đệm khi sử dụng gdb dưới emacs
- 25. Sử dụng bộ đệm thời gian của Chrome
- 26. NSURLCache sử dụng thuật toán bộ nhớ đệm nào?
- 27. Cách sử dụng nhiều bộ đệm trong đường ray?
- 28. Tiền tố chung dài nhất sử dụng bộ đệm?
- 29. OpenCL - Tại sao sử dụng bộ đệm READ_ONLY hoặc WRITE_ONLY
- 30. cách sử dụng bộ đệm giao thức trong asp.net vnext?
Tại sao bạn muốn biết: "số tiền còn lại so với số tiền đã được sử dụng/phát"? –
Để thông báo cho người dùng rằng ứng dụng đang lưu vào bộ đệm và thực hiện logic liên quan. –