- PR -

[ASP.NET]SQLServerのテーブルにインサートしたwavファイルのバイナリデータの再生が途中で途切れる

1
投稿者投稿内容
masao
会議室デビュー日: 2008/02/03
投稿数: 2
投稿日時: 2008-10-31 21:53
はじめまして。masaoと申します。

ASP.NETでSQLServerに保存されたwavファイルのバイナリデータを
WEB上で再生しようと以下のようにプログラムを作成しました。

SQLServer Expressエディションに
TESTDBというデータベースを作成し、以下のような設定で
MEDIATABLEというテーブルを作成しました。
MEDIA_CD (PrimaryKey varchar(50)) 呼び出したいデータを識別するキーコード
MEDIA_TYP (varchar(50)) 保存データのMIMEタイプ
MEDIA_DATA (varbinary(max)) 保存データのバイナリ

FileUploadを使って上記テーブルにレコードをインサートし、
以下のようなウェブファイルデータ出力ページを作成しました。
セッションキー「MEDIA_ID」に入っている値をMEDIA_IDにして
上記テーブルからデータをSELECTしてBinaryWriteで出力します。

---------ImageFileOut.aspx-------------

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MediaFileOut.aspx.cs" Inherits="ImageFileOut" %>

---------ImageFileOut.aspx.cs-------------

public partial class ImageFileOut : System.Web.UI.Page
{
 protected void Page_Load(object sender, EventArgs e)
 {
  SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
  builder.DataSource = "localhost¥¥SQLExpress";
  builder.InitialCatalog = "TESTDB";
  builder.UserID = "sa";
  builder.Password = "sqladmin";
  SqlConnection con = new SqlConnection();
  con.ConnectionString = builder.ConnectionString;
  con.Open();
  SqlCommand command = con.CreateCommand();
  command.CommandText = "SELECT * FROM MEDIATABLE WHERE MEDIA_ID = @MEDIA_ID";

  SqlParameter param1 = command.CreateParameter();
  param1.SqlDbType = SqlDbType.VarChar;
  param1.ParameterName = "@MEDIA_ID";
  param1.Value = this.Session["MEDIA_ID"].ToString();
  command.Parameters.Add(param1);

  SqlDataReader reader = command.ExecuteReader();

  if(reader.Read())
  {
   Response.ContentType = reader["MEDIA_TYP"].ToString();
   Response.Flush();
   Response.BinaryWrite((byte[])reader["MEDIA_DATA"]);
   Response.End();

  }
  reader.Close();
  con.Close();

 }
}

実際に音を再生するページでは、
ImageIDTextBoxという「asp:TextBox」にセッションに保存するMEDIA_IDの値を入力し、

PlayButtonというボタンをクリックして、
以下のようにLiteral1というLiteralに
embed タグを生成し MIME_TYPを記載しています。

embedタグのsrcにmapping.wavと記載がありますが、
Web.Configに以下のようにマッピングして、MediaFileOut.aspx
を呼び出すようにしています。

----------Web.Confing------------------------

 <urlMappings enabled="true">
  <add url="~/mapping.wav" mappedUrl="~/MediaFileOut.aspx" />
 </urlMappings>

----------PlayButtonクリックイベント------------------------

protected void PlayButton_Click(object sender, EventArgs e)
{
 if (PlayButton.Text == "再生")
 {
   PlayButton.Text = "停止";
 
   SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
   builder.DataSource = "localhost¥¥SQLExpress";
   builder.InitialCatalog = "TESTDB";
   builder.UserID = "sa";
   builder.Password = "sqladmin";
   SqlConnection con = new SqlConnection();
   con.ConnectionString = builder.ConnectionString;
   con.Open();
   SqlCommand command = con.CreateCommand();
   command.CommandText = "SELECT MEDIA_TYP FROM MEDIATABLE WHERE MEDIA_ID = @MEDIA_ID";
 
   SqlParameter param1 = command.CreateParameter();
   param1.SqlDbType = SqlDbType.VarChar;
   param1.ParameterName = "@MEDIA_ID";
   param1.Value = ImageIDTextBox.Text;
   command.Parameters.Add(param1);
 
   SqlDataReader reader = command.ExecuteReader();
 
   if (reader.Read())
   {
   this.Session["MEDIA_ID"] = ImageIDTextBox.Text;
   Literal1.Text = "<embed src=¥"mapping.wav" +
     "¥¥" type=¥¥"" + reader["MEDIA_TYP"].ToString() + "¥" autostart=¥"true¥" loop=¥"3¥" hidden=¥"false¥"></embed>";
   }
   reader.Close();
   con.Close();
 }
 else
 {
   PlayButton.Text = "再生";
   Literal1.Text = "";
 }
}

ポストバック後には、Literal1に記載した内容が以下のようなHTMLになるのですが、

<embed src="mapping.wav" type="audio/wav" autostart="true" loop="3" hidden="false"></embed>

再生された音が途中で途切れてその後音がしなくなってしまいます。

ImageFileOut.aspx.csのPage_Loadの最初でブレイクポイントをかけると、
2回ブレイクするので、1回のEmbedタグの生成につき、2回、ImageFileOut.aspxが呼び出されているような気がします。

また、同ファイルの同関数で、
(byte[])reader["MEDIA_DATA"]
の部分でブレイクし、ウォッチで確認したところ、ファイルサイズは、
FileUploadを使ってインサートしたそれぞれのものと同じでした。

ファイルは44MBと4KBの2つをDBにインサートし試したのですが、どちらも最初の1秒ほどで途切れてしまいます。

wavファイルのバイナリデータを上記のようにSQLServerから取得して、
再生するには、どのように行えばよいのでしょうか。

ご教授よろしくお願いいたします。

環境
OS Windows XP Home Edition
.NET Framework 3.5
Visual Web Developer 2008 Express Edition
DB SQLServer2005 ExpressEdtion
ブラウザ FireFox 3.0.3

masao
会議室デビュー日: 2008/02/03
投稿数: 2
投稿日時: 2008-10-31 22:05
すみません。以下の部分の記載を間違えました。

訂正前
MEDIA_CD (PrimaryKey varchar(50)) 呼び出したいデータを識別するキーコード
訂正後
MEDIA_ID (PrimaryKey varchar(50)) 呼び出したいデータを識別するキーコード
1

スキルアップ/キャリアアップ(JOB@IT)