[OpenSLES]ADPCMの再生について

1,012 views
Skip to first unread message

武田 直樹

unread,
May 31, 2011, 5:43:03 AM5/31/11
to 日本Androidの会
お世話になっております。武田です。

AndroidNDKでOpenSLESを利用したADPCMサウンドの再生を目指しているのですが、
AndroidSimpleBufferQueueを利用したリニアPCMの再生はできたのですが、
YAMAHA ADPCMの再生がうまくいきません。

調べてみたところ、AndroidSimpleBufferQueueではリニアPCMのみのサポートのようで
YAMAHA ADPCMのデコードを自前で書かなければいけないのですが、仕様がなく検討がつきません。

探している途中で、YM2608 ADPCMという形式があったので、この方式のデコードで
試してみたところ、それらしい音が聞こえるのですが、ノイズまみれで再生できているとはいえません。

圧縮サウンドを鳴らすいい方法があればご教授いただきたいのですが、
基本的に仕様が公開されていない形式はあきらめたほうが良いのでしょうか・・・。

tyone

unread,
May 31, 2011, 11:32:31 PM5/31/11
to android-g...@googlegroups.com
tyoneと申します。

私はこの分野に明るくないのですが、近くにいた詳しい人に聞いてみたところ、
下記のような回答でした。

ffmpeg の libavcodec に YAMAHA ADPCM 用の係数テーブルもあるので、それを参考にデコーダを
自前で作るか、ffmepg を NDK で build してその library を使う手もあるんじゃないか、とのことです。

試していませんが、以下なんか使えそうです。
http://odroid.foros-phpbb.com/t338-ffmpeg-compiled-with-android-ndk

ご参考になれば幸いです。


2011年5月31日18:43 武田 直樹 <tellu...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>
>

武田 直樹

unread,
May 31, 2011, 11:56:23 PM5/31/11
to 日本Androidの会
tyone様

ご返信いただきありがとうございます。

完全に詰まっていたので、さっそく試してみたいと思います。
自前で作ろうとしていたものがあるので、係数テーブルをまずは参考にしてみます。

何か進展があれば投稿したいと思います。

On 6月1日, 午後12:32, tyone <teruhito.yoney...@gmail.com> wrote:
> tyoneと申します。
>
> 私はこの分野に明るくないのですが、近くにいた詳しい人に聞いてみたところ、
> 下記のような回答でした。
>
> ffmpeg の libavcodec に YAMAHA ADPCM 用の係数テーブルもあるので、それを参考にデコーダを
> 自前で作るか、ffmepg を NDK で build してその library を使う手もあるんじゃないか、とのことです。
>
> 試していませんが、以下なんか使えそうです。http://odroid.foros-phpbb.com/t338-ffmpeg-compiled-with-android-ndk
>
> ご参考になれば幸いです。
>
> 2011年5月31日18:43 武田 直樹 <telluriu...@gmail.com>:

Masakazu Nakano

unread,
Jun 1, 2011, 12:05:50 AM6/1/11
to android-g...@googlegroups.com

なかのです

真空波動研関係者に声かけてみます。
http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q=%E7%9C%9F%E7%A9%BA%E6%B3%A2%E5%8B%95%E7%A0%94
<http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q=%E7%9C%9F%E7%A9%BA%E6%B3%A2%E5%8B%95%E7%A0%94>

ソース公開可能であれば解決早いかも知れませんが、
この辺り、いかがですか?

なかの

tyone

unread,
Jun 1, 2011, 12:43:16 AM6/1/11
to android-g...@googlegroups.com
武田様

tyoneです。
お役に立てると幸いです。

ちなみに個人的な興味なので、可能な範囲で教えていただければありがたいのですが
どういったものをつくろうとされてるんですか?


2011年6月1日12:56 武田 直樹 <tellu...@gmail.com>:

武田 直樹

unread,
Jun 1, 2011, 9:44:28 PM6/1/11
to 日本Androidの会
なかの様

諸事情で全てのソースは上げられないのですが、
波形の初期値を0
予測変化量の初期値を127
また、変化量のテーブルとして、
{
230, 230, 230, 230, 307, 409, 512, 614,
230, 230, 230, 230, 307, 409, 512, 614
}
の並びの配列を使っています。
(libavcodecのソースに書いてあったものを使用しています)

デコードの流れとして

ファイルからデータ部分を抽出
波形の初期値を0
予測変化量の初期値を127とする・・・①

先頭1byteを取得・・・②

下位4bitと予測変化量から波形データを算出・・・③
(算出したデータを出力バッファに格納)

波形データを-32768~32767にクリッピング・・・④

次の予測変化量を現在の変化量とテーブルから算出・・・⑤
( ( 現在の予測変化量×テーブルの変化量 ) >> 8 )

次の予測変化量を127~24567にクリッピング・・・⑥

②~⑥の手順で上位4bit分を行う・・・⑦

②~⑦までをデータ分だけ繰り返す・・・⑧

としています。

また、OpenSLES側に渡すデータフォーマットとしては
16KHz,モノラルの場合
SLDataFormat_PCM.numChannels = 1
SLDataFormat_PCM.samplesPerSec = 16000000(SL_SAMPLINGRATE_16)
SLDataFormat_PCM.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16
SLDataFormat_PCM.containerSize = SL_PCMSAMPLEFORMAT_FIXED_16
SLDataFormat_PCM.channelMask = SL_SPEAKER_FRONT_CENTER
SLDataFormat_PCM.endianness = SL_BYTEORDER_LITTLEENDIAN
としてフォーマットを指定しています。

On 6月1日, 午後1:05, Masakazu Nakano <emplant2...@gmail.com> wrote:
> なかのです
>
> 真空波動研関係者に声かけてみます。http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q=%E7%9C%9F%E...
> <http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q=%E7%9C%9F%E...>
>
> ソース公開可能であれば解決早いかも知れませんが、
> この辺り、いかがですか?
>
> なかの
>
>
>
>
>
>
>
> (2011/06/01 12:32), tyone wrote:
> > tyoneと申します。
>
> > 私はこの分野に明るくないのですが、近くにいた詳しい人に聞いてみたところ、
> > 下記のような回答でした。
>
> > ffmpeg の libavcodec に YAMAHA ADPCM 用の係数テーブルもあるので、それを参考にデコーダを
> > 自前で作るか、ffmepg を NDK で build してその library を使う手もあるんじゃないか、とのことです。
>
> > 試していませんが、以下なんか使えそうです。
> >http://odroid.foros-phpbb.com/t338-ffmpeg-compiled-with-android-ndk
>
> > ご参考になれば幸いです。
>
> > 2011年5月31日18:43 武田 直樹 <telluriu...@gmail.com>:

武田 直樹

unread,
Jun 1, 2011, 10:02:51 PM6/1/11
to 日本Androidの会
tyone様

libavcodecのソース中に該当する処理があり、参考にしてみました。
元の音に近いものが再生されてはいるのですが、ちりちりとノイズが混じってしまいました。

YAMAHA ADPCMの再生ツールで再生した限りではデータ自体は壊れていないようです。
デコード時の数値が微妙に違うのか、SLに渡すデータフォーマットが悪いのか調査中です。

ADPCMデコードはフィーチャーフォンでADPCMを鳴らしていたアプリがあるので、それの資産流用のためです。
アプリ内に組み込みあれば別フォーマットで対応できたかもしれませんが、アプリとは別にサーバ側からDLするため、
資産管理部分を変更したくない→同じ形式で鳴らせないか→ソフトウェアでデコードを書くという流れになった次第です。

On 6月1日, 午後1:43, tyone <teruhito.yoney...@gmail.com> wrote:
> 武田様
>
> tyoneです。
> お役に立てると幸いです。
>
> ちなみに個人的な興味なので、可能な範囲で教えていただければありがたいのですが
> どういったものをつくろうとされてるんですか?
>
> 2011年6月1日12:56 武田 直樹 <telluriu...@gmail.com>:

武田 直樹

unread,
Jun 10, 2011, 5:41:32 AM6/10/11
to 日本Androidの会
変換用ツールでデコードした内容と自前でデコードした内容を比べてみたところ、
どうやらデータチャンク内のADPCMデータが一定間隔で区切られているようで、
こちらを調整したところうまく再生することができました。

アドバイス頂きありがとうございました。
Reply all
Reply to author
Forward
0 new messages