2017-08-04 24 views
8

Hãy tha thứ cho tôi, nhưng khi tôi đang viết câu hỏi này, một số ý tưởng đã xuất hiện, vì vậy câu hỏi có thể giống như nhật ký sự kiện, nhưng bạn có thể chuyển sang phần TL; DR.Tại sao tôi không thể đặt currentTime và thời lượng bằng 0 trong HTML AudioElement trong Android WebView?

Tôi có mô-đun AAR trong đó tôi sử dụng WebView để hiển thị trang và phát tệp âm thanh với thời gian bắt đầu khác nhau - tùy thuộc vào ngữ cảnh. Tôi có hai ứng dụng để kiểm tra mô-đun AAR: một ứng dụng thử nghiệm là xương trần cần thiết để chạy mô-đun và ứng dụng thực sự cần một khoảng thời gian để tiến hành thông qua luồng ứng dụng để đến phần mô-đun.

Tôi đã được thông báo về một lỗi trên một số thiết bị thử nghiệm, nơi phát lại âm thanh luôn bắt đầu từ 0, không bao giờ quan tâm đến yếu tố âm thanh currentTime cài đặt được sử dụng.

Dưới đây là mã của tôi, nơi phát lại được xử lý:

var instance = this; 
this.playbackCurrentAudioPath = newBufferPath; 
this.playbackCurrentAudio = document.createElement('audio'); 
this.playbackCurrentAudio.src = this.playbackCurrentAudioPath; 
this.playbackCurrentAudio.oncanplaythrough = function() { 
    console.log("file loaded, try to play " + instance.playbackCurrentAudio); 
    instance.loaded = true; 
    // checked here, instance.playbackCurrentAudio.duration is equal 0 
    instance.playbackCurrentAudio.currentTime = audioTrackBeginTime; 
    // instance.playbackCurrentAudio.currentTime is equal 0 
    instance.playbackCurrentAudio.play(); 
    // playback starts from the beginning of the file 
}; 
this.playbackCurrentAudio.onerror = function() { 
    instance.playbackLoadError() 
}; 
this.playbackCurrentAudio.onended = function() { 
    instance.playbackAudioEnded(true) 
}; 
this.playbackCurrentAudio.load(); 

Như đã trình bày trong các ý kiến, tôi đã thêm vài breakpoint để kiểm tra những gì đang xảy ra, và đây là một số kết luận:

  • sau Sự kiện oncanplaythrough được gọi, thời lượng được đặt thành 0,
  • khi đặt thành phần âm thanh là currentTime thành một số giá trị khác ngoài 0, nó vẫn ở 0,
  • tệp âm thanh phát tốt và thời gian phát lại được phản ánh trong giá trị currentTime.

Theo W3Schools trang web, canplaythrough là sự kiện có thể xảy ra cuối cùng được gọi khi tải tệp âm thanh.

Kịch bản được đề cập có thể tạo lại trên 10% thiết bị thử nghiệm của chúng tôi. Các thiết bị này đến từ các nhà sản xuất khác nhau (Lenovo, Samsung) và có các phiên bản Android khác nhau (5.0.1, 6.0.1). Tôi cũng có các thiết bị khác nhau từ những nhà sản xuất này hoạt động tốt.

tôi đã quyết định thử nghiệm sử dụng ứng dụng xương trần của tôi, bởi vì nó nhanh hơn, và một cái gì đó kỳ lạ xảy ra - nó hoạt động tốt trên các đề cập ở trên 10% các thiết bị kiểm tra:

  • thời gian được thông báo một cách chính xác sau khi oncanplaythrough sự kiện được kích hoạt,
  • cài đặt của currentTime được phản ánh trong phần tử âm thanh,
  • âm thanh bắt đầu phát từ thời điểm được yêu cầu.

Tôi đã khá sốc, vì vậy tôi đã kiểm tra tất cả các sự khác biệt có thể có giữa các ứng dụng:

thiết lập gradle
  • cùng xây dựng được sử dụng
  • các phiên bản tương tự của thư viện đã được sử dụng
  • sự các phương thức tương tự được gọi để bắt đầu thư viện
  • cùng một tệp AAR được sử dụng trong cả hai dự án

Tôi đã tìm thấy một sự khác biệt, hai ứng dụng sẽ lưu trữ dữ liệu của chúng ở những nơi khác nhau. Ứng dụng chính, lưu trữ dữ liệu trong thư mục tài liệu, ứng dụng xương trần của tôi lưu trữ dữ liệu của nó trong bộ nhớ ngoài [do đó dễ dàng hơn để gỡ lỗi].

Sau khi tôi đã thay đổi đường dẫn lưu trữ cho ứng dụng chính sang bên ngoài, ứng dụng bắt đầu hoạt động tốt và phát âm thanh chính xác.

Tôi biết rằng tôi không thể truy cập dữ liệu dễ dàng được lưu trữ bên trong APK nhưng dữ liệu này được tải xuống từ mạng và được lưu trữ trong thư mục tài liệu, vì vậy tôi sẽ không có giới hạn nào được áp dụng.

TL; DR

Khi tải tập tin âm thanh ở yếu tố âm thanh HTML từ thư mục tài liệu ứng dụng, trong trường hợp canplaythrough, tôi không thể truy cập âm thanh yếu tố của duration (đã ghi bàn 0) cũng không thiết lập currentTime (trú tại 0 đến chơi). Khi cùng một tệp được tải từ bộ nhớ ngoài (được tích hợp trong bộ nhớ), nó hoạt động tốt và tôi có thể lấy tệp âm thanh duration và đặt thuộc tính currentTime.

Tôi có thể làm gì để làm cho nó hoạt động trong khi âm thanh nằm trong thư mục tài liệu của ứng dụng?

+0

html5-audio dường như sử dụng phần mềm MediaPlayer trong phần lớn thời gian. Điều này có nghĩa là tệp âm thanh cần quyền truy cập có thể đọc trên thế giới để chạy trên trình phát chính xác. Đây là lý do tại sao nó không hoạt động chính xác trên bộ nhớ cục bộ, nhưng không hoạt động trên bộ nhớ ngoài. –

+0

nhưng nếu tệp không có quyền đọc, nó sẽ không hoạt động chút nào, trong trường hợp của tôi, chỉ một số tính năng của WebAudio không hoạt động: thiết lập currentTime và thời lượng đọc. Âm thanh phát tốt. – Krystian

+0

Không, một số yếu tố của quy trình có thể có quyền đọc, một số có thể không. Bạn không thể nhảy đến kết luận đó. Nó rõ ràng là một số loại vấn đề cho phép, vì vị trí của tập tin là sự khác biệt duy nhất. Nếu không, thì thời gian (điều kiện chủng tộc) là điều duy nhất tôi có thể nghĩ là có thể. –

Trả lời

2

Tôi không chắc chắn lý do tại sao nó ảnh hưởng đến một số thiết bị, và nó không ảnh hưởng đến các thiết bị khác, nhưng tôi đã trải qua các nguồn của dự án Chromium và stumbled khi này:

https://chromium.googlesource.com/chromium/src/+/61c6121a6cb9dc16f9786830655049d68dcde67c/content/public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java

và để được chính xác hơn :

private List<String> getRawAcceptableDirectories() { 
    List<String> result = new ArrayList<String>(); 
    result.add("/mnt/sdcard/"); 
    result.add("/sdcard/"); 
    if (PACKAGE_NAME != null) 
     result.add("/data/data/" + PACKAGE_NAME + "/cache/"); 
    return result; 
} 

Tôi đã thay đổi thư mục tài liệu thành thư mục bộ nhớ cache và mọi thứ hoạt động như mong đợi.

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