2011-07-27 39 views
23

Tại sao MediaPlayer.seekTo(int msec) không chính xác?Độ chính xác của MediaPlayer.seekTo (int msecs)

Đôi khi sớm hơn 30 giây (với cả bit có tốc độ bit biến đổi và không đổi của mp3)! Đang tìm kiếm với âm thanh vốn có vấn đề hoặc là phương pháp này bị hỏng? Nó có liên quan đến đệm hay không?

Tôi cũng nhận thấy rằng tổng thời gian chạy getDuration() có thể sai (đó không phải là vấn đề lớn) và tôi đã thử nghiệm rằng getCurrentPosition() là đủ chính xác (như cứ sau mỗi giây phát lại)). Tôi đang sử dụng Android 2.2.

Cuối cùng, không ai biết định dạng nào nếu bất kỳ định dạng nào thực sự hoạt động liên tục (tốt hơn là wav mà có lẽ là nó có)?

EDIT:

Tôi chủ yếu nghe podcast. Smodcast và Thinking Allowed đã được giải quyết nhiều lần, ngay cả sau khi được chuyển đổi/tái mã hóa thành CBR. Các tệp không bị hỏng.

QuickMediaConverter (Windows) có vẻ hoạt động tốt nhưng Sound Converter (Ubuntu) đã tạo ra một số tệp dodgy. Tôi sẽ cố gắng gắn bó với tên cũ ...

CẬP NHẬT: QuickMediaConverter hoạt động thực sự tốt nhưng không biết tại sao. Không có vấn đề từ!

Trả lời

0

tôi không biết gì về Android. Nhưng tôi biết rằng trong hầu hết các định dạng tập tin phương tiện truyền thông có một điều khoản gọi là tìm kiếm mục nhập hoặc tín hiệu nhập .. cho thấy cho thời gian cụ thể từ đây video & âm thanh nên được bắt đầu để chơi

nếu thời gian dưới đây có dấu hiệu entry 10 giây
12 giây
14 giây

sau đó nếu bạn tìm cách 11 giây sau đó nó sẽ luôn luôn chơi từ 10 giây nếu bạn tìm cách 12 giây sau đó nó sẽ luôn luôn chơi từ 12 giây

để tốt hơn tìm tập tin cần được kết hợp với các dấu hiệu cao ..

27

Có hai cách để khung đa phương tiện thực hiện thao tác tìm kiếm trên một tập tin đa phương tiện (AV).

  1. Tìm cách khung Key - Đoạn video khi mã hóa thường sẽ có một cái gì đó gọi là khung I hoặc khung Key, nó có nghĩa là khung này có rất nhiều thông tin và có thể được sử dụng để giải mã một khung toàn bộ . Để giảm dung lượng, tất cả các khung hình không được mã hóa thành khung chính thay vì chúng được mã hóa thành khung P (Dự đoán) hoặc khung dự đoán, nghĩa là bạn có thể giải mã khung hình P với sự trợ giúp từ khung chính.

    Vì vậy, trong quá trình tìm kiếm, trong trường hợp này việc tìm kiếm được thực hiện đến khung khóa gần nhất trong một khoảng thời gian nhất định. Ví dụ: nếu người dùng tìm 40 giây và khung hình gần nhất là ở giây thứ 35 thì tìm kiếm được thực hiện ở giây thứ 35 và không phải là giây thứ 40.

  2. Tìm kiếm thời gian - Điều này đang tìm kiếm thời gian chính xác mà người dùng yêu cầu.

    Tìm kiếm vẫn được thực hiện ở khung chính gần nhất vì nếu không bạn sẽ thấy các mảng màu xanh lá cây hoặc pixel của video không mong muốn.Vì vậy, thay vì tìm kiếm được thực hiện cho khung chính và sau đó khung được giải mã cho đến thời gian yêu cầu nhưng các khung hình này bị loại bỏ và không được hiển thị cho người dùng. Trong ví dụ trên, tất cả các khung đã giải mã từ giây thứ 35 đến thứ 40 đều bị loại bỏ và chỉ các khung hình vượt quá 40 giây mới được hiển thị cho người dùng.

Trong trường hợp của âm thanh duy nhất tập tin có thể có hai trường hợp (Nếu không có phân tích cú pháp hoặc một phân tích cú pháp mà doesnot xây dựng bảng timestamp sau đó -)

  1. CBR - Liên tục Bit Rate - Kể từ tốc độ bit là hằng số, chúng ta có thể bỏ qua số lượng byte cần thiết đến một thời điểm nhất định (bitrate * timeToSeek = byte bị bỏ qua)

  2. VBR - Tốc độ bit thay đổi - Tốc độ bit không đổi liên tục thay đổi. Vì vậy, trong trường hợp này, tìm ra tốc độ bit trung bình của tệp và sau đó sử dụng phương thức trên, trong trường hợp này, việc tìm kiếm sẽ không chính xác.

Bây giờ quay trở lại câu hỏi của bạn, tôi có thể tự tin rằng nó hoạt động tốt và chính xác cho phần lớn các tệp phương tiện.

Lý do duy nhất khiến bạn gặp phải vấn đề như vậy là do tệp phương tiện bị hỏng. (Nó chỉ là không thể có một sự khác biệt của 30 giây trong khi tìm kiếm + bạn đang nói rằng thời gian không được trả lại một cách chính xác. Và không có API mediaplayer nào bị hỏng cho Android 2.2)

Định dạng được Android hỗ trợ này link

Vì vậy, bạn có thể thử với một tệp mp3 khác không?

+0

Holy crap, cảm ơn bạn một triệu lần. Tôi đã cố gắng để bọc webapp của tôi với Phonegap và sprites âm thanh của tôi đã được tắt. Tôi cho rằng đó là vì hiệu suất của phonegap ... Sau khi học android và làm cho ứng dụng đầu tiên của tôi, thấy rằng tôi đã nhận được cùng một vấn đề về độ chính xác. Sau 2 ngày phát triển, tôi đọc câu trả lời này và nhận ra rằng tôi đang sử dụng một tệp nén ogg rất nén và điều này có ý nghĩa. Tôi đã sử dụng âm thanh chất lượng cao hơn và bùng nổ tất cả các đoạn âm thanh của tôi đã hoạt động hoàn hảo. – ilovett

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