mciSendString 再生スピードについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
記事: 58
登録日時: 13年前
住所: 大阪府

mciSendString 再生スピードについて

#1

投稿記事 by » 13年前

こんばんは。お久しぶりです。
今回はmciSendStringについての質問なのですが、
再生スピードを変更をすると再生位置が狂ってしまいます。
というのは、mciSendString("set my_sound speed 500",null, 0, 0) ;
のようにしてスピードを変えてから再生し、再生中に
mciSendString("status my_sound position", sb, sb.Capacity, 0);
として再生位置を取得しても間違った値(遅すぎる)が返ってきてしまうのです。
分かりづらいと思うのでソース張らせていただきます。

コード:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices; 

namespace test
{
    public partial class Form1 : Form
    {

        [DllImport("winmm.dll")]
        extern static int mciSendString(string s1, StringBuilder s2, int i1, int i2);

        StringBuilder sb = new StringBuilder(32);
        float ms = 0.0f;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
             timer1.Enabled = true;
            mciSendString("open \"" + "xxx.mp3" + "\" alias my_sound", null, 0, 0);
            mciSendString("set my_sound speed 500",null, 0, 0) ;
            // 再生を開始
            mciSendString("play my_sound", null, 0, 0);
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            // play 中のファイルの位置を ms単位 で返す
            mciSendString("status my_sound position", sb, sb.Capacity, 0);
            ms = int.Parse(sb.ToString());
            label1.Text = ms.ToString();
        }
    }
}
音ゲーのように再生位置が重要で、狂ってはいけないものを作っているので、スローにしてゆっくり確かめようと思ったらこうなりました。
(スピードを変えずに再生すると正確に出来るのですが、スローや早送りでは狂いました)
再生時間を正確に表示したいのですが、どなたか教えていただけますでしょうか?

環境はVisual C# 2010で、OSはWin7 Homeです。

よろしくお願いします。

“C言語何でも質問掲示板” へ戻る