質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.12%

【Delphi】AVAudioPlayerでwavが再生されない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 195

dorian2019

score 8

前提・実現したいこと

Delphi 10.3.2を使ってiOS上でwavファイルを再生するプログラムを作っています。

iOS 12.4の端末では、問題なく再生されますがiOS 13.2の端末では音が再生されません。
端末がマナーモードでないことを確認し、音量も最大にして試しました。
また、例外も発生しておりません。

どの様に変更すれば、iOS 13.2の端末で正常に再生されるようになりますでしょうか。

八方ふさがりで途方に暮れております。
ヒントだけでも頂けると大変ありがたいです。
よろしくお願いいたします。

該当のソースコード

procedure TFormMain.Button1Click(Sender: TObject);
var
  fname: String;
  newAVAudioPlayer: AVAudioPlayer;
begin
  fname := 'wavファイルへのパス';

  if FileExists(fname) = false then begin
    ShowMessage(fname + ' is not found');
  end;

  newAVAudioPlayer := TAVAudioPlayer.Create;
  newAVAudioPlayer.initWithContentsOfURL(StrtoNSUrl(fname), nil);
  newAVAudioPlayer.prepareToPlay;
  newAVAudioPlayer.play;
end;

試したこと

似たような症状を探したところ以下が見つかり、
AVAudioPlayerの宣言方法を変更すれば良いらしいという事は分かりましたが
AVAudioPlayerの変数をグローバル変数で宣言するなど試しましたが改善は見られませんでした。

https://stackoverflow.com/questions/58105462/app-crashes-when-playing-audio-on-ios13-1

該当のソースコード

また、newAVAudioPlayer.initWithContentsOfURLの第2引数でエラーを取得したいのですが、
以下で試すとShowMessageの行でAccessViolationが発生してしまいます。

恐らく根本的に間違っているのだと思うのですが・・・
こちらも併せてご教示いただけると大変助かります。

procedure TFormMain.Button2Click(Sender: TObject);
var
  fname: String;
  newAVAudioPlayer: AVAudioPlayer;
  error: NSError;
begin
  fname := 'wavファイルへのパス';

  error := TNSError.Create;

  newAVAudioPlayer := TAVAudioPlayer.Create;
  newAVAudioPlayer.initWithContentsOfURL(StrtoNSUrl(fname), error);

  ShowMessage(NSStrToStr(error.localizedDescription));

  newAVAudioPlayer.prepareToPlay;
  newAVAudioPlayer.play;
end;

補足情報(FW/ツールのバージョンなど)

開発環境:Delphi10.3.2
検証端末:iPhone7(iOS 12.4)、iPhone7 plus(iOS 13.2)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • takabosoft

    2019/11/05 16:48

    Delphi読めないのですが、
    var newAVAudioPlayer: AVAudioPlayer;
    は変数を宣言しただけで中身はnull的な感じなんでしょうか?

    キャンセル

  • dorian2019

    2019/11/05 16:59

    質問に興味を持っていただきありがとうございます。
    恐らく初期化されていないため、中身は不定だと思われます。

    キャンセル

  • takabosoft

    2019/11/05 17:05

    不定なら問題ないのかなと思います。
    stackoverflowなんかで報告されているクラッシュは、インスタンスが在るものに対して上書きでインスタンスを生成して代入するとNGと書いてある気がしましたので。

    キャンセル

  • dorian2019

    2019/11/05 17:10

    ご解説ありがとうございます!
    stackoverflowの記事は、そういった意味だったのですね。
    頭の霧が少し晴れました。

    キャンセル

回答 1

check解決した方法

0

Delphiのメーリングリストにて回答を見つけました。
初期化の方法に問題があり正常なインスタンスを取得できていなかった事が原因でした。

procedure TFormMain.Button1Click(Sender: TObject);
var
  fname: String;
  newAVAudioPlayer: AVAudioPlayer;
begin
  fname := 'wavファイルへのパス';

  newAVAudioPlayer := TAVAudioPlayer.Wrap(TAVAudioPlayer.Alloc.initWithContentsOfURL(StrtoNSUrl(fname), nil));
  newAVAudioPlayer.prepareToPlay;
  newAVAudioPlayer.play;
end;

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る