2013-12-11 12 views
10

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

+0

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"? –

+0

Để 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. –

Trả lời

14

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.

+1

Cảm ơn bạn, câu trả lời rất hữu ích. –

+0

@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. ? –

+0

@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. –

2

* 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 "); 
    } 
+0

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. –

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