2012-07-29 42 views
13

Tôi đang phát âm thanh bằng MediaPlayer trên Android.Dừng truyền phát trên Android MediaPlayer trên mạng thay đổi

Khi thiết bị chuyển từ Wi-Fi sang mạng di động hoặc ngược lại, MediaPlayer sẽ ngừng phát lại.

Thông thường có một vài giây giá trị của âm thanh trong bộ đệm, do đó phát lại không ngừng ngay lập tức.

Lý tưởng nhất là tôi muốn chọn luồng để phát lại không bị gián đoạn, nhưng tôi không thể xem cách thực hiện.

Tôi đang làm việc với cả hai tệp mp3 được lưu trữ trên máy chủ và luồng phát trực tiếp.

+0

Bất kỳ mã nào để chia sẻ với chúng tôi? – Erol

+0

Có rất nhiều ví dụ trong thanh bên nếu bạn cần trợ giúp với MediaPlayer nhưng thực sự đơn giản: 'MediaPlayer mMediaPlayer = MediaPlayer.create (ngữ cảnh, Uri.parse (url));' 'mMediaPlayer.prepare(); ' ' mMediaPlayer.start(); ' sẽ giúp bạn bắt đầu. Nếu bạn kết nối với Wi-Fi và có vùng phủ sóng 3G, hãy tắt Wi-Fi trong khi phát trực tuyến và phát lại sẽ dừng. – lightversusdark

+2

Có, tôi biết cách sử dụng trình phát đa phương tiện. Tôi chỉ hỏi nếu bạn đã thử bất cứ điều gì thay mặt đó và muốn chia sẻ sự tiến bộ của bạn để chúng tôi có thể cải thiện điều đó. – Erol

Trả lời

0

Tôi không biết tại sao trình phát đa phương tiện của bạn dừng lại, nhưng có thể bạn có thể thêm phương thức onReceive và đặt "mp.start()" trong phương pháp để làm cho trình phát khởi động lại.
Android, How to handle change in network (from GPRS to Wi-fi and vice-versa) while polling for data

Bạn có thể cần phải thực hiện một lớp riêng biệt, nhưng đó phải giải thích làm thế nào để tạo ra một phương pháp đó được gọi là khi bạn chuyển đổi mạng, lúc này bạn có thể gọi là "mp.start()" để tiếp tục phát lại (giả sử mp là MediaPlayer của bạn).
Giả định này, tất nhiên, MediaPlayer của bạn chỉ bị tạm dừng khi bạn đang chuyển đổi mạng, không dừng lại.

14

Từ quan điểm của máy chủ, thay đổi chế độ mạng từ WiFi sang 3G (ngược lại), sẽ giống như một kết nối hoàn toàn mới từ một IP riêng (máy khách).

Nếu máy chủ bạn tải xuống không hỗ trợ theo dõi luồng (ví dụ: số giây, chuỗi, byte) (không giống như máy chủ phương tiện), nó sẽ phải bắt đầu phân phát mp3 từ 0 byte một lần nữa.

Nếu URL của bạn trỏ đến tệp MP3 nằm ở máy chủ HTTP chuẩn, tình huống của bạn sẽ là điều mong đợi. Bạn nên xem xét sử dụng máy chủ Truyền trực tuyến, vì vậy bạn có thể tiếp tục tải xuống/phát trực tiếp theo ý bạn. Khi bạn nhận được ý định rằng kết nối bị mất/tiếp tục, bạn có thể trỏ trình phát phương tiện của mình đến URL mới có vị trí tệp trong URL (ví dụ: giây = 19, byte = 57365).

Không chắc chắn nếu điều này giúp bạn, nhưng nó giải thích một chút những gì đang xảy ra "đằng sau hậu trường".

1

Thử đặt setOnCompletionListenersetOnErrorListener của bạn. Ở trên hoàn chỉnh với một luồng trực tiếp, bạn chỉ có thể gọi lại prepareAsync() và điều này sẽ bắt đầu lại luồng. Không có cách nào duyên dáng để làm điều này thực sự trừ khi bạn viết khung phương tiện truyền thông của riêng bạn.

Bạn cũng có thể nghe trong số onError() cho số MEDIA_ERROR_SERVER_DIED sau đó bạn có thể kích hoạt lại prepareAsync().

Bạn sẽ thấy rằng MediaPlayer sẽ là Lỗi hoặc Hoàn thành. Nếu bạn xử lý cả hai callbacks này, ít nhất bạn có thể làm là khởi động lại luồng khi thay đổi mạng, như để phát lại mượt mà .. sẽ yêu cầu mediaframework tùy chỉnh như android là khá kém chất lượng.

0

Như Vidar cho biết, việc thiết lập lại kết nối sẽ được máy chủ xử lý dưới dạng kết nối mới.

Dường như tôi phải đệm hai lần phát lại âm thanh, điều đó có nghĩa là tạo trình phát phương tiện tùy chỉnh. Điều này có thể cung cấp âm thanh liên tục, nhưng nó vẫn sẽ bỏ qua khi nghe một luồng trực tiếp.

Tệp MP3 dễ hơn một chút vì tôi có thể biết vị trí phát lại. Không phải như vậy với luồng trực tiếp.

Như gmaster nói, tôi sẽ cần một máy thu phát sóng để thiết lập kết nối mới khi mạng thay đổi. Bộ đệm âm thanh từ kết nối mạng trước đó sẽ tiếp tục phát trong khi bộ đệm âm thanh mới được lấp đầy thông qua kết nối mới.

Khi bộ đệm mới đủ đầy đủ để bắt đầu phát lại, tôi có thể chuyển phát lại. Nếu tôi đang phát một tệp, với hỗ trợ máy chủ và một chút công việc, tôi có thể đảm bảo rằng dữ liệu vị trí phát lại hiện tại ở cả hai bộ đệm và chuyển đổi liền mạch.

Vì bộ đệm phát trực tiếp không thể đồng bộ hóa, chắc chắn sẽ có trục trặc khi chúng chuyển đổi.

Bộ đệm lớn hơn sẽ tránh mất âm thanh nếu kết nối mất một lúc để thiết lập, nhưng sẽ làm chậm thời gian phát lại đầu tiên. Một tập tin MP3 có thể được tải về và điền vào bộ đệm nhanh hơn thời gian thực, nhưng luồng trực tiếp sẽ đệm trong thời gian thực.

Chris.Jenkins đề cập đến một số phương pháp MediaPlayer có thể giúp nhưng chỉ ra rằng điều này dường như cần một khung tùy chỉnh. Nó sẽ cần phải xử lý các điều kiện ông đề cập và những điều kiện khác.

Nếu tôi có thể làm cho nó trông đẹp, tôi sẽ đăng nó ở đây. Tôi sẽ tiếp tục mở câu hỏi.

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