DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: deliping
今日帖子: 2
在线用户: 2
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 fu510558553 (凡人的快乐) ★☆☆☆☆ -
普通会员
2024/1/10 20:46:12
标题:
delphi 把一首mp3歌曲存入SQLite 要如何做 浏览:1376
加入我的收藏
楼主: delphi 如何把一首mp3歌曲存入SQLite3里面
----------------------------------------------
-
作者:
男 xuchuantao (暗黑天使) ★☆☆☆☆ -
普通会员
2024/1/10 21:00:08
1楼: 以二进制保存呀!
----------------------------------------------
按此在新窗口浏览图片
作者:
男 wj7927 (元素) ★☆☆☆☆ -
盒子活跃会员
2024/1/10 21:58:24
2楼: 存个路径就好了吧
----------------------------------------------
-
作者:
男 qq81709989 (战石电子) ▲▲△△△ -
普通会员
2024/1/10 22:21:08
3楼: // 导入需要的单元
uses
  System.IOUtils, System.SysUtils, FMX.Media, FMX.Types, Data.DB, FireDAC.Comp.Client, FireDAC.Stan.Param;

// 定义一个全局变量,表示数据库连接
var
  DBConnection: TFDConnection;

// 定义一个函数,初始化数据库连接
procedure InitDBConnection;
begin
  // 创建一个TFDConnection对象
  DBConnection := TFDConnection.Create(nil);
  // 设置数据库驱动为SQLite
  DBConnection.DriverName := 'SQLite';
  // 设置数据库文件的路径,如果不存在则自动创建
  DBConnection.Params.Values['Database'] := TPath.Combine(TPath.GetDocumentsPath, 'songs.db');
  // 打开数据库连接
  DBConnection.Open;
end;

// 定义一个函数,创建一个表,用于存储歌曲的信息
procedure CreateTable;
var
  SQL: string;
begin
  // 定义一个SQL语句,创建一个名为songs的表,包含三个字段:id(整数,主键),name(字符串),data(二进制)
  SQL := 'create table if not exists songs (id integer primary key, name text, data blob)';
  // 执行SQL语句
  DBConnection.ExecSQL(SQL);
end;

// 定义一个函数,把一首mp3歌曲存入数据库
procedure SaveSongToDB(const FileName: string);
var
  SongStream: TFileStream;
  SongName: string;
  SQL: string;
  Query: TFDQuery;
begin
  // 检查文件是否存在
  if not TFile.Exists(FileName) then
    raise Exception.Create('File not found: ' + FileName);
  // 检查文件是否为mp3格式
  if not SameText(TPath.GetExtension(FileName), '.mp3') then
    raise Exception.Create('File is not mp3: ' + FileName);
  // 获取歌曲的文件名(不含扩展名)
  SongName := TPath.GetFileNameWithoutExtension(FileName);
  // 创建一个文件流,用于读取歌曲的数据
  SongStream := TFileStream.Create(FileName, fmOpenRead);
  try
    // 定义一个SQL语句,向songs表中插入一条记录,使用参数化查询
    SQL := 'insert into songs (name, data) values (:name, :data)';
    // 创建一个TFDQuery对象,用于执行SQL语句
    Query := TFDQuery.Create(nil);
    try
      // 设置TFDQuery对象的连接为DBConnection
      Query.Connection := DBConnection;
      // 设置TFDQuery对象的SQL语句为SQL
      Query.SQL.Text := SQL;
      // 为SQL语句中的参数赋值,分别为歌曲的文件名和数据
      Query.ParamByName('name').AsString := SongName;
      Query.ParamByName('data').LoadFromStream(SongStream, ftBlob);
      // 执行SQL语句
      Query.ExecSQL;
    finally
      // 释放TFDQuery对象
      Query.Free;
    end;
  finally
    // 释放文件流
    SongStream.Free;
  end;
end;

// 定义一个函数,从数据库中读取一首mp3歌曲,并播放
procedure PlaySongFromDB(const SongName: string);
var
  SQL: string;
  Query: TFDQuery;
  SongStream: TMemoryStream;
  MediaPlayer: TMediaPlayer;
begin
  // 定义一个SQL语句,从songs表中查询一条记录,根据歌曲的文件名,使用参数化查询
  SQL := 'select data from songs where name = :name';
  // 创建一个TFDQuery对象,用于执行SQL语句
  Query := TFDQuery.Create(nil);
  try
    // 设置TFDQuery对象的连接为DBConnection
    Query.Connection := DBConnection;
    // 设置TFDQuery对象的SQL语句为SQL
    Query.SQL.Text := SQL;
    // 为SQL语句中的参数赋值,为歌曲的文件名
    Query.ParamByName('name').AsString := SongName;
    // 执行SQL语句,打开查询结果集
    Query.Open;
    // 检查查询结果集是否为空
    if Query.IsEmpty then
      raise Exception.Create('Song not found: ' + SongName);
    // 创建一个内存流,用于存储歌曲的数据
    SongStream := TMemoryStream.Create;
    try
      // 从查询结果集中的第一条记录的第一个字段(data)中读取歌曲的数据,保存到内存流中
      Query.Fields[0].SaveToStream(SongStream);
      // 将内存流的位置设置为0,以便从头开始读取
      SongStream.Position := 0;
      // 创建一个TMediaPlayer对象,用于播放歌曲
      MediaPlayer := TMediaPlayer.Create(nil);
      try
        // 设置TMediaPlayer对象的文件名为内存流的文件名
        MediaPlayer.FileName := SongStream.FileName;
        // 设置TMediaPlayer对象的媒体类型为音频
        MediaPlayer.MediaType := TMediaType.Audio;
        // 打开TMediaPlayer对象
        MediaPlayer.Open;
        // 播放TMediaPlayer对象
        MediaPlayer.Play;
      finally
        // 释放TMediaPlayer对象
        MediaPlayer.Free;
      end;
    finally
      // 释放内存流
      SongStream.Free;
    end;
  finally
    // 释放TFDQuery对象
    Query.Free;
  end;
end;

// 定义一个函数,关闭数据库连接
procedure CloseDBConnection;
begin
  // 如果数据库连接已经打开,关闭数据库连接
  if DBConnection.Connected then
    DBConnection.Close;
  // 释放数据库连接对象
  DBConnection.Free;
end;

// 定义一个例程,演示如何使用上述函数
procedure Demo;
var
  SongFileName: string;
begin
  // 初始化数据库连接
  InitDBConnection;
  try
    // 创建表
    CreateTable;
    // 设置要存入数据库的歌曲的文件名,这里假设歌曲文件在当前目录下
    SongFileName := TPath.Combine(TPath.GetDocumentsPath, 'song.mp3');
    // 把歌曲存入数据库
    SaveSongToDB(SongFileName);
    // 从数据库中读取歌曲,并播放
    PlaySongFromDB('song');
  finally
    // 关闭数据库连接
    CloseDBConnection;
  end;
end;
----------------------------------------------
《Z-Gantt战石智慧时间管理进度计划甘特图软件》:WWW.Z-SHi.NET
作者:
男 fu510558553 (凡人的快乐) ★☆☆☆☆ -
普通会员
2024/1/11 0:29:00
4楼: @qq81709989  谢谢了
----------------------------------------------
-
作者:
男 tulater (tulater) ★☆☆☆☆ -
普通会员
2024/1/11 18:23:12
5楼:   @qq81709989  谢谢了
----------------------------------------------
http://www.cnblogs.com/tulater/
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/1/12 1:33:15
6楼: 3 楼的代码,每行都给注释,赞!
----------------------------------------------
-
作者:
男 hardnut (麦轲数据管家) ★☆☆☆☆ -
普通会员
2024/1/12 9:04:23
7楼: 这注释, 着实是太多, 应该大量减少对语法的注释. 函数命名已经很好的, 大部分注释没有必要
----------------------------------------------
UniKeeper V10.40 -- 您最贴心的个人数据管理助手
作者:
男 kenliaoliao (ben) ★☆☆☆☆ -
普通会员
2024/1/12 9:14:18
7楼: 可以通过下面的方法获取MP3的信息,并将这些信息写进数据库里方便管理。
你可以将MP3的文件的路径存放到数据库里,不建议将MP3的文件以流的形式写进数据库,否则会将数据库撑得很大。
type
  TId3Tag=packed record
    tagID :array[0..2] of Char
    title :array[0..29] of Char
    artist :array[0..29] of Char
    album :array[0..29] of Char
    Year  :array[0..3] of Char
    Comment :array[0..29] Char
    Genre  :Byte;//种类标识

procedure TForm1.Button1Click(Sender :TObject);
var
  _mp3File :string;
  id3tag :Tid3tag;
  mp3file :TFileStream;
begin
  _mp3file :='D:\mp3\敢爱敢做.mp3';
  mp3file :=TFileSteam.Create(_mp3file,fmOpenRead);
  try
    mp3file.position :=mp3file.size-128;
    mp3file.read(id3tag,sizeof(id3tag));
    ShowMessage('Title:'+id3tag.title+#13
          +'Artist :'+id3tag.Artist+#13
          +'album :'+id3tag.album+#13
          +'Year :'+id3tag.Year+#13
          +'Comment :'+id3tag.Comment+#13
          +'Genre :'+IntToStr(id3tag.Genre));
  finally
    mp3file.free;
  end;
end;
----------------------------------------------
-
作者:
男 tony2u (tony2u) ★☆☆☆☆ -
普通会员
2024/1/12 13:48:09
8楼: SQLite3本身就是文件型,不是真正的数据库,优点是轻便简易,在嵌入设备上一般都运行在内存里。
你把MP3一股脑的作为BLOB存进去,岂非多此一举?建议只放文件路径,这样性能也不会损失
----------------------------------------------
-
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2024/1/12 15:00:22
9楼: SQLite3 是不是真正的数据库?

ChatGPT:
  SQLite3是一个关系型数据库系统,被称为嵌入式数据库,因为它并不需要一个独立的服务器来运行。
  它被设计成轻量级、快速、自包含的库,适用于嵌入式设备和小型应用程序。
  尽管它在某些方面与常用的客户端-服务器数据库系统(例如MySQL和PostgreSQL)有所不同,
  但它仍然被认为是一个真正的数据库系统。
  它具有诸如事务支持、ACID属性(原子性、一致性、隔离性、持久性)和标准的SQL查询语言等功能。

  虽然SQLite3通常用于轻量级用途,但它也可以处理相当大型的数据库。
  它被广泛用于移动设备和嵌入式系统,也被许多桌面和服务器应用程序使用。
  SQLite3在许多场景下都被证明是一个可靠、灵活的数据库系统。
----------------------------------------------
武汉天气不好
作者:
男 tony2u (tony2u) ★☆☆☆☆ -
普通会员
2024/1/12 16:16:41
10楼: 楼上,若支持标准SQL查询语句就算数据库,Excel比SQLite使用广泛的多
----------------------------------------------
-
作者:
男 fu510558553 (凡人的快乐) ★☆☆☆☆ -
普通会员
2024/1/13 0:34:52
11楼: 我现在问题是mp3是放到DB库了,但无法用MediaPlayer直接播放,
MediaPlayer好像也不能直接用TStream 方法播放,各位大佬有什么放法播放呢
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/1/15 1:10:15
12楼: 如果你的 MediaPlayer 只能播放文件,那你就从数据库里面读出来先保存为文件再让 MediaPlayer 去播放。

其实,大的文件,如果没必要,直接保存为文件,数据库里面只存文件名就好了。
----------------------------------------------
-
作者:
男 hardnut (麦轲数据管家) ★☆☆☆☆ -
普通会员
2024/1/15 8:05:11
13楼: 可以采用我的软件的办法: 定义一个阈值,大于阈值的放目录,小于的放数据库中.
----------------------------------------------
UniKeeper V10.40 -- 您最贴心的个人数据管理助手
作者:
男 xuchuantao (暗黑天使) ★☆☆☆☆ -
普通会员
2024/1/15 21:15:47
14楼: 播放时从数据库里取出导入到临时文件播放,或者可以用Bass.dll来播放内存数据
----------------------------------------------
按此在新窗口浏览图片
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行78.125毫秒 RSS