2012-05-02 38 views
6

Vâng, chỉ đơn giản là đây là yêu cầu của tôi ..Android MediaPlayer với AudioEffect: Bắt Lỗi (-22,0)

Tôi có một tập tin WAV, tôi muốn mở nó, thêm một số hiệu ứng, và vui chơi.

Tôi đang sử dụng MediaPlayer để phát tệp và PresetReverb để thêm một số hiệu ứng.

Đây là mã của tôi

public void playSound(){ 
    String fullPath = MainActivity.this.filePath + "tmpaudio.wav"; 

    final MediaPlayer player = new MediaPlayer(); 
    player.setDataSource(this, Uri.parse(fullPath)); 

    PresetReverb pReverb = new PresetReverb(0,player.getAudioSessionId()); 
    pReverb.setPreset(PresetReverb.PRESET_LARGEROOM); 
    pReverb.setEnabled(true); 
    player.attachAuxEffect(eReverb.getId()); 
    player.setAuxEffectSendLevel(1.0f); 

    //prepare for playback 
    player.prepare(); 

    // Media prepared listener 
    player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     public void onPrepared(MediaPlayer mp) { 
     //play 
     player.start(); 
     } 
    }); 
} 

Khi tôi chạy mã này, tôi nhận được một bản ghi trong logcat

05-02 12 (Không đăng nhập của tôi.): 02: 42,356: E/MediaPlayer (17250): Lỗi (-22,0)

Nhưng khi tôi nhận xét những dòng

PresetReverb pReverb = new PresetReverb(0,player.getAudioSessionId()); 
pReverb.setPreset(PresetReverb.PRESET_LARGEROOM); 
pReverb.setEnabled(true); 
player.attachAuxEffect(eReverb.getId()); 
player.setAuxEffectSendLevel(1.0f); 

MediaPlayer đang phát tệp thành công. Vì vậy, không có gì sai với tập tin WAV của tôi.

Bị hơi thất vọng, tôi đã cố gắng EnvironmentalReverb, thay vì PresetReverb,

EnvironmentalReverb eReverb = new EnvironmentalReverb(1, player.getAudioSessionId()); 
eReverb.setDecayHFRatio((short) 1000); 
eReverb.setDecayTime(10000); 
eReverb.setDensity((short) 1000); 
eReverb.setDiffusion((short) 1000); 
eReverb.setReverbLevel((short) -1000); 
eReverb.setEnabled(true); 
player.attachAuxEffect(eReverb.getId()); 
player.setAuxEffectSendLevel(1.0f); 

còn tôi đã cùng một lỗi (Error (-22,0)).

Vì vậy, hoặc tôi thiếu một cái gì đó rất rõ ràng, hoặc có một số vấn đề với các lớp học gia đình AudioEffect (trong tài liệu hoặc api chính nó). Có ai có thể làm sáng tỏ không?

EDIT: Tôi quên để thêm, khi tôi sửa lỗi mã lỗi được đăng nhập khi

player.start(); 

được thực thi. Tôi đã xóa các phần xử lý ngoại lệ trước khi đăng phân đoạn mã ở trên. Nhưng tôi tích cực, không có ngoại lệ bị bắt khi tôi thực hiện.

EDIT LẠI:

Từ this liên kết Tôi đã hiểu lỗi -22 là PVMFErrLicenseRequiredPreviewAvailable

/* 
Error due to the lack of a valid license for the content. However 
a preview is available. 
*/ 
const PVMFStatus PVMFErrLicenseRequiredPreviewAvailable = (-22); 

Tôi googled với PVMFErrLicenseRequiredPreviewAvailable, và tôi đã nhận this tài liệu. Và trên trang 87

14.10.5 Xem trước DRM Content mà không có một giấy phép hợp lệ sẵn

Một biến thể của kịch bản được đề cập trong mục 14.10.3 là trường hợp không có giấy phép hợp lệ cho phát lại đầy đủ một đoạn nội dung, nhưng ở đó nó có thể được xem trước. Kịch bản này có thể là cách phổ biến của nội dung phân phối ban đầu để người tiêu dùng có thể xem trước nội dung đó trước khi quyết định mua giấy phép đầy đủ.Trong trường hợp này, phương thức Init() sẽ trở lại với mã số PVMFErrLicenseRequiredPreviewAvailable, cho biết rằng giấy phép là bắt buộc để phát lại đầy đủ nhưng có sẵn bản xem trước. Để phát bản xem trước, ứng dụng phải xóa nguồn hiện tại rồi thêm lại với cờ được đặt trên nguồn dữ liệu cục bộ để chỉ ra chế độ xem trước .

Bây giờ các tệp WAV tôi đã phát được tạo bởi tôi bằng cách sử dụng công cụ SpeechToText trong SDK Android. Tôi không biết giấy phép nào đang giữ tôi chơi tệp này.

+0

Xin chào Krishnabhadra tôi đã thử giải pháp của bạn nhưng trong thiết bị của tôi tôi đã không tìm thấy bất kỳ hiệu ứng echo. Bạn có thể xin vui lòng gửi cho tôi mã mẫu của bạn. Thanks trước. – Rojesh

+0

Tôi gặp Lỗi (1, -22) trong trường hợp của mình. Đây có phải là vấn đề tương tự không? –

Trả lời

12

Vâng, cuối cùng tôi cũng làm việc đó. Tôi đọc lại tài liệu, chơi với mã và đột nhiên mọi thứ hoạt động. Đây là những phát hiện của tôi trong trường hợp nó giúp đỡ bất cứ ai trong tương lai.

Trong trường hợp của PresetReverb

Trong tài liệu presetReverb

Các PresetReverb là kết quả pha trộn hiệu lực phụ trợ và nên tạo ra trên âm thanh phiên 0. Để MediaPlayer hoặc AudioTrack được đưa vào hiệu ứng này, chúng phải được rõ ràng gắn liền với nó và mức gửi phải được chỉ định. Sử dụng hiệu ứng ID được trả về bằng phương thức getId() để chỉ định hiệu ứng cụ thể này khi gắn nó vào MediaPlayer hoặc AudioTrack.

Điều đó nói

PresetReverb pReverb = new PresetReverb(0,player.getAudioSessionId()); <== error 

không được phép. Bạn chỉ có thể sử dụng phiên âm thanh toàn cục 0 để xây dựng PresetReverb.

PresetReverb pReverb = new PresetReverb(1,0); <== correct 

Bây giờ chúng ta có thể gắn nó với MediaPlayer hoặc AudioTrack sử dụng

player.attachAuxEffect(pReverb.getId()); 
player.setAuxEffectSendLevel(1.0f); 

đang PresetReverb đầy đủ của tôi là

PresetReverb pReverb = new PresetReverb(1,0); 
player.attachAuxEffect(pReverb.getId()); 
pReverb.setPreset(PresetReverb.PRESET_LARGEROOM); 
pReverb.setEnabled(true); 
player.setAuxEffectSendLevel(1.0f); 

Lưu ý: Nếu bạn đang tìm kiếm hiệu ứng reverb tốt hay tiếng vang , sử dụng tốt hơn EnvironmentReverb. Tôi hơi thất vọng với hiệu suất của PresetReverb.

Trong trường hợp của EnvironmentalReverb

Từ các tài liệu của EnvironmentalReverb

Các EnvironmentalReverb là kết quả pha trộn hiệu lực phụ trợ và cần được tạo ra trên âm thanh phiên 0. Để cho một MediaPlayer hoặc AudioTrack để được đưa vào hiệu ứng này, chúng phải được rõ ràng gắn liền với nó và mức gửi phải được chỉ định. Sử dụng hiệu ứng ID được trả về bằng phương thức getId() để chỉ định hiệu ứng cụ thể này khi gắn nó vào MediaPlayer hoặc AudioTrack.

Chính xác như PresetReverb, nhưng khi tôi đã viết

Log.e("DEBUG","sessionId : " + player.getAudioSessionId()); <== printed "454" 
EnvironmentalReverb eReverb 
      = new EnvironmentalReverb(0,player.getAudioSessionId()); //should be error as per documentation 
//player.attachAuxEffect(eReverb.getId()); <== Yes this one was commented 

không có lỗi và tôi nhận được hiệu ứng reverb tốt và echo. Vì vậy, nó có vẻ giống như một lỗi trong tài liệu. Ngoài ra khi chúng ta chuyển id phiên của trình phát tới hàm tạo (player.getAudioSessionId()), có vẻ như không cần phải đính kèm trình phát với cá thể EnvironmentReverb. Strange ..

Vì mục đích hoàn chỉnh, tính năng này cũng hoạt động giống như tài liệu nói.

EnvironmentalReverb eReverb 
      = new EnvironmentalReverb(0,0); 
player.attachAuxEffect(eReverb.getId());  <== No,not comment this one 

Đối với trẻ em AudioEffect khác (Equalizer, BassBoost, Bộ ảo hóa)

Những người không phải là một phần của câu hỏi của tôi. Nhưng đối với bất cứ ai nhìn thấy điều này trong tương lai ..

LƯU Ý: gắn hiệu ứng chèn (equalizer, tăng bass, virtualizer) để sự pha trộn âm thanh đầu ra toàn cầu bằng cách sử dụng các phiên 0 bị phản đối.

thấy documentation

Về Lỗi (-22,0)

Vâng, công bằng mà nói nó không phải là một thông báo lỗi thông tin. Tôi không biết tại sao một lỗi Lỗi giấy phép không hợp lệ xuất hiện khi chúng tôi gỡ rối phiên âm thanh. Dù sao khi tôi sửa chữa các tham số phiên âm thanh lỗi này biến mất. Đó là tất cả những gì tôi biết.

+0

Giải thích thực sự thú vị. Tôi sẽ thực hiện Equalizer. Đã làm như bạn đã nói nhưng nó bị rơi vào việc xây dựng Equalizer. Vì vậy, những gì nên là giải pháp của nó. Làm ơn giúp tôi. Mã của tôi giống với Mã mẫu của AudioFxDemo –

+0

Xin chào Krishnabhadra tôi đã thử giải pháp của bạn nhưng trong thiết bị của tôi tôi không tìm thấy bất kỳ hiệu ứng echo nào. Bạn có thể xin vui lòng gửi cho tôi mã mẫu của bạn. Thanks trước. – Rojesh

+0

Tại sao bạn viết PresetReverb (1,0). Ở khắp mọi nơi tôi thấy PresetReverb (0,0). Giải thích mục đích ghi 1 là tham số. – Nepster

1

Tôi có cùng một vấn đề, sử dụng phiên âm thanh 0 bạn phải sử dụng các MODIFY_AUDIO_SETTINGS phép

0

dòng trong bản chất này, giải quyết một trong những vấn đề này, nhưng nó vẫn đòi hỏi quyền.

PresetReverb pReverb = new PresetReverb(1,0); 

Vì vậy, thêm dòng dưới đây để AndroidManifest.xml của bạn thực sự giải quyết được vấn đề gốc:

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> 

OH, cũng có, bạn cần phải thiết lập PresetReverb và gắn nó vào AudioTrack của bạn để xảy ra TRƯỚC bạn thực hiện AudioTrack.write() và AudioTrack.play().

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