zipファイルから音声データを再生したいのですが……

239 views
Skip to first unread message

ふるちん

unread,
Dec 5, 2012, 2:14:39 AM12/5/12
to android-g...@googlegroups.com
zipファイルから音声データを再生したいのですが、
error(-38,0)とError(-38,0)が表示されるだけで、
全く再生されません。

ZipInputStreamも使ってみたのですが、うまくいきません。

どなたかアドバイスをいただけないでしょうか。

<!-- 以下SE部分のソース -->
//SEを再生する
public void sound(){
  //音声ファイルがあればファイルクラスを生成
  mediaPlayerFileMP3 = meltFileName(zipPath, zipFile + File.separator + Integer.toString(pageNo) + "_" + Integer.toString(tapNo) + ".mp3");
  mediaPlayerFileWAV = meltFileName(zipPath, zipFile + File.separator + Integer.toString(pageNo) + "_" + Integer.toString(tapNo) +".wav");
  mediaPlayerFileOGG = meltFileName(zipPath, zipFile + File.separator + Integer.toString(pageNo) + "_" + Integer.toString(tapNo) +".ogg");
    
  try{
    //音声ファイルがあるかどうかを確認
    if(mediaPlayerFileMP3 != null){
      mediaPlayerFile = meltAudioFile(zipPath, zipFile + File.separator + Integer.toString(pageNo) + "_" + Integer.toString(tapNo) + ".mp3");
    }else if(mediaPlayerFileWAV != null){
      mediaPlayerFile = meltAudioFile(zipPath, zipFile + File.separator + Integer.toString(pageNo) + "_" + Integer.toString(tapNo) +".wav");
    }else if(mediaPlayerFileOGG != null){
      mediaPlayerFile = meltAudioFile(zipPath, zipFile + File.separator + Integer.toString(pageNo) + "_" + Integer.toString(tapNo) +".ogg");
    }
   
    //MediaPlayer型の変数を生成
    mediaPlayer = new MediaPlayer();
     
    mediaPlayer.setDataSource(((FileInputStream) mediaPlayerFile).getFD());
     
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
   
    //プレイヤーの準備
    mediaPlayer.prepare();
   
    //プレイヤーの再生
    mediaPlayer.start();
  }catch(Exception e){
  }
}

//zipファイルからとったデータをfile形式にする
public static File meltFileName(String zipPath, String file){
  File result = null;
  try{
    //zipファイルを抽象化
    ZipFile zipFile = new ZipFile(zipPath);
   
    //zipファイルの中身を抽象化
    final ZipEntry entry = zipFile.getEntry(file);
   
    if(entry != null){
    result = new File(entry.getName());
    }
  }catch(Exception e){
  }
  return result;
}

//zipファイルからとったデータをInputStream形式にする
public static InputStream meltAudioFile(String zipPath, String file){
  InputStream result = null;
  try{
    //zipファイルを抽象化
    ZipFile zipFile = new ZipFile(zipPath);
   
    //zipファイルの中身を抽象化
    final ZipEntry entry = zipFile.getEntry(file);
   
    if(entry != null){
      InputStream in = zipFile.getInputStream(entry);
      result = in;
    }
  }catch(Exception e){
    result = null;
  }
  return result;
}

Wadecom Android Dept.

unread,
Dec 5, 2012, 3:19:24 AM12/5/12
to android-g...@googlegroups.com

Wadecom株式会社 Android事業部の前澤と申します。

もしかしたら直接でも可能なのかもしれませんが、
直接ZIPファイルから取り出したストリームを使うのではなく、
再生する音声ファイルを一時ファイルなりに書き出してからのほうがよいかと思います。


2012年12月5日水曜日 16時14分39秒 UTC+9 ふるちん:

ytRino

unread,
Dec 6, 2012, 1:44:59 AM12/6/12
to android-g...@googlegroups.com
meltFileName内でFileをnewしただけで、
zipの中身をファイルに書き出す処理が書かれていないように見えますがいかがでしょうか

--
いいの@ytRino

ytRino

unread,
Dec 6, 2012, 1:53:56 AM12/6/12
to android-g...@googlegroups.com
あ、すいません
このメソッドで実際にFileに書き出してから再生しようとしてるわけではないのですね
はやとちりでした

ふるちん

unread,
Dec 6, 2012, 2:19:08 AM12/6/12
to android-g...@googlegroups.com
Wadecom株式会社 Android事業部の前澤様


先日はアドバイスをいただきありがとうございました。

直接ZIPファイルから取り出せれば便利だと思ったのですが、
調べても全然見つからないんですよね。

もう少し調べてみて、できそうになかったら、
一時ファイルに書き出す方法でやってみようと思います。

どうもありがとうございました。

ふるちん

unread,
Dec 6, 2012, 2:23:31 AM12/6/12
to android-g...@googlegroups.com
ytRino様


そうですね、

Zipのファイルパス(ZipEntry?)を指定して、
それから、再生できないかと考えたのですが、
うまくいかないんですよね。

それと、ZipInputStreamを使って、キャストする方法もやってみたのですが、
うまくいかずって感じです。

Hiroaki GOTO as GORRY

unread,
Dec 6, 2012, 5:24:25 AM12/6/12
to android-g...@googlegroups.com

後藤 浩昭(GORRY)です。

> mediaPlayer.setDataSource(((FileInputStream) mediaPlayerFile).getFD());

このgetFD()の返り値は確認しましたか?
getFD()はストリームに割り当てられている実ファイル操作用の値を
返しますが、このストリームは実ファイルではないので、無効な
ファイルディスクリプタ(FD)値が返っていると思います。

Android(というかAndroid OSが動いているLinux)では「実ファイルに
割り当てられているストリーム」にしかFD値を与えられないため、
mediaPlayer.setDataSource()には実質的に実ファイルしか与えられません。


In message <a143ce3d-017d-4dda...@googlegroups.com>
"[android-group-japan: 21115] Re: zipファイルから音声データを再生したいのですが……"
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-group-japan/-/U1F3SP26_okJ にアクセスしてください。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>



--
Hiroaki GOTO as "GORRY" : 後藤 浩昭
EMAIL: gorr...@gmail.com

ふるちん

unread,
Dec 11, 2012, 3:13:04 AM12/11/12
to android-g...@googlegroups.com
後藤様


返信が遅くなってしまい申し訳ありません。

>このgetFD()の返り値は確認しましたか? 
FD値は確認していませんでした。

>Android(というかAndroid OSが動いているLinux)では「実ファイルに 
>割り当てられているストリーム」にしかFD値を与えられないため、 
>mediaPlayer.setDataSource()には実質的に実ファイルしか与えられません。 
キャストではなく、そのままファイルを渡さなければいけないということですか?
あまり理解できておらず、申し訳ないです。

アドバイスありがとうございました。 

Reply all
Reply to author
Forward
0 new messages