5

着信AMR_NBをストリーミングしようとしています。シーク可能なファイルが必要なため、MediaPlayerを直接使用することはできません。MediaCodecを使用したいのですが、MediaCodecを使用するには、presentationTimeなどを提供するMediaExtractorが必要です(私は...訂正してください!)。本当?MediaExtractorなしでMediaCodecを使用できますか?

MediaExtractorはシーク可能なファイルを必要としているようです。ドキュメントには、setDataSource操作の1つについてのみ具体的に記載されていますが、他の操作のいずれかを使用しようとすると、シークの試行が失敗したために失敗しました。

では、着信AMRストリームを再生するにはどうすればよいですか?受信データをファイルに保存し、そのファイルのコピーを定期的に作成してMediaPlayerにフィードするスキームを知っていますが、本当に正直なストリーミングソリューションを見つけたいと思います。

MediaExtractorを使用せずにMediaCodecを使用することは可能ですか?もしそうなら、MediaCodec.createDecoderByTypeに渡すプレゼンテーション時間と文字列を見つけるにはどうすればよいですか?ドキュメントには、「audio / 3gpp」が必要であると記載されていますが、これを使用しようとすると、次のエラーが発生します。

codec = MediaCodec.createDecoderByType("audio/3gpp");

01-02 03:59:36.980: E/OMXMaster(21605): A component of name 'OMX.qcom.audio.decoder.aac' already exists, ignoring this one.

ですから、MediaCodecにアクセスする方法もわかりません。

4

1 に答える 1

0

「シーク可能なファイルが必要なため、MediaPlayer を直接使用することはできません」 これは一般的に当てはまりません。ストリームで試してみて、何が起こるかを正確に報告してください.

「MediaExtractor なしで MediaCodec を使用できますか?」私はそれを疑います: 私はそれらが一緒に使用されるように設計されていると信じています.

これらのコンポーネントを使用してストリームを再生しました。ただし、MediaExtractor には文書化されていない制限があります (私の知る限り)。そのため、小さなプロキシ サーバーを使用して、消化できるものをフィードします。そして、MediaExtractor を実行するスレッドが 1 つと、MediaCodec から出力を取得する別のスレッドがあります。次に、デッドロックを回避し、同期に対処する必要があります。しかし、フォワードだけをプレイしたいだけなら、それほど悪くはありません。あとはどうやって止めるかだけです!

最初に MediaPlayer を試すことをお勧めします。それ以外の場合は、MediaExtractor を試してみたいという熱意があれば、消化できるものと消化できないものについての発見を共有できます。当然のことと考えないでください。たとえば、MP3 ファイルを再生するように見えますが、その期間を検出したり、シークしたりできません。

于 2013-01-29T23:56:56.857 に答える