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

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

ただいまの
回答率

87.61%

AVFoundationで〇〇秒に1回音を鳴らす処理を行いたい

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 721

score 141

困っていること

Swiftでメトロノームアプリを作成しているのですが、音をどのようなタイミングで鳴らしたら良いのかわからず困っています。
現状スタートボタンを押すと1度だけ音が再生されてそれ以降再生されない状況です。ImageViewのアニメーションが変わったタイミングで一緒に音を鳴らしたいのですが、どのようにすれば良いのかわかりません。

現状

現状としては、スタートボタンが押された際に、画像を切り替えるようにしてアニメーションをさせています。この、振り子の針と同じタイミングで音を鳴らしたいと考えているのですが、どうハンドリングすれば良いのかわからず、音を正しくならせていない状況です。

//振り子の画像
let pendulumImg:[UIImage] = [
        UIImage(named: "img1")!,
        UIImage(named: "img2")!]
//メトロノームの振り子の画像を変更している処理
pendulumImage.animationImages = pendulumImg
        pendulumImage.animationDuration = TimeInterval(speed)
        pendulumImage.animationRepeatCount = 0
pendulumImage.stopAnimating()
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

お疲れ様です。

数年前に作ったアプリなんですが:
https://itunes.apple.com/tz/app/russian-new-year/id1067621325?mt=8

hodoru3seiさんが実現したい機能と似ているのではないかと考えています。
そのアプリではTimer.scheduledTimerを利用しました。

タイマーによりupdate_screenの関数を1秒ごとに一回実行し、アニメーションと音もupdate_screenの中で実行されました。1秒単位だと、一番簡単で適切だと思われます。0.1秒か0.1秒以下の単位だと、別の方法を考えた方がいいです。

よろしくお願いします。

サンプルコード:

//
//  SomeController.swift
//  Some App
//
//  Created by Lvov Yury on 12/7/15.
//

import UIKit

class SecondScreenController: UIViewController {

    var mytimer: Timer?
    var tictac = "clock";

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.
        self.mytimer = Timer.scheduledTimer(timeInterval: 1, target:self, selector: #selector(SecondScreenController.update_screen), userInfo: nil, repeats: true);
        self.update_screen();
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    }

    func update_screen() {

        self.play_animation();
        self.playSound( self.tictac )
    }

    func playSound( _ melody: String ) {
       // NSLog(melody)
        let audioFilePath = Bundle.main.path(forResource: melody, ofType: "mp3")

        if audioFilePath != nil {

            let audioFileUrl = URL(fileURLWithPath: audioFilePath!)
            do {
                self.audioPlayer = try AVAudioPlayer(contentsOf: audioFileUrl, fileTypeHint: nil)
            } catch _ {
                return // if it doesn't exist, don't play it
            }

            self.audioPlayer.numberOfLoops = 0;
            self.audioPlayer.play()
        } else {
            //  println("audio file is not found")
        }
    }

    func play_animation() {
        // Some animation
    }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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