Как хранить аудио файлы в базе данных sqlite3 и воспроизводить их на iphone? - PullRequest
3 голосов
/ 29 июня 2009

Я хочу хранить аудиофайлы (любой из этих форматов, поддерживаемых mp3, wav и iphone) в базе данных. и играть в них в iphone ... есть идеи, как это сделать?

Ответы [ 3 ]

5 голосов
/ 29 июня 2009

Я не знаю, почему вы хотите хранить аудиофайлы в базе данных SQL, но sqlite3 поддерживает BLOB. Так что храните их как BLOB и извлекайте их.

В качестве альтернативы, почему бы не хранить ссылки на файлы, которые вы хотите воспроизвести?

2 голосов
/ 29 сентября 2012

Не всегда лучше хранить файл на диске. Посмотрите на это сравнение:

http://www.sqlite.org/intern-v-extern-blob.html

Вот как я это делаю, используя ruby ​​и сиквел:

Создать таблицу с использованием этой схемы. Файл представляет собой BLOB-объект, а Sha - это имя файла. В этом случае все мои файлы - монофонические mp3-файлы с переменной скоростью передачи данных, размером 2K-3K. У меня около 40 000 файлов в БД. Я использую значение sha1 в качестве имени файла, так как у меня много записей с одинаковым звуком, поэтому я экономлю место.

CREATE TABLE `sound` (`id` integer PRIMARY KEY AUTOINCREMENT, `sha` text, `file` blob); CREATE INDEX `sound_sha_index` ON `sound` (`sha`);

Используя ruby, вы можете создать БД следующим образом:

db = Sequel.sqlite('./sound.db')     
db.create_table :sound do
  primary_key :id, :index => true   
  column :sha, :text, :index => true
  column :file, :blob 
end

Загрузить файлы в базу данных. Предполагая, что у вас есть файлы в каталоге с именем 'sound', вот как:

DB = Sequel.sqlite('./sound.db')
files = Dir['./sound/*.mp3']
files.each_with_index do |f, i|
  # progress
  print "\r #{((i.to_f / files.size)*100).round(2)}%"
  # get the file name without directory and extension
  f =~ /\/sound\/(.+)\.mp3/
  # insert into db
  DB[:sound].insert :sha => $1, :file => File.read("#{f}").to_sequel_blob
end

Воспроизведение звука в приложении iPhone. Скопируйте файл sound.db в ваш проект iPhone. Это код, который я использую. Он основан на FMDB и AVAudioPlayer.

SoundPlayer.h

#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
#import "FMDatabase.h"
#import "FMDatabaseQueue.h"

@interface SoundPlayer : NSObject
{
    FMDatabaseQueue *db;
}

@property (nonatomic, retain) AVAudioPlayer *audioPlayer;

- (void)play:(NSString *)sha;
- (void)free;
@end

SoundPlayer.m

#import "SoundPlayer.h"
#import "DictAppDelegate.h"

@implementation SoundPlayer

- (SoundPlayer*)init
{
    NSString *dbPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"sound.db"];
    db = [FMDatabaseQueue databaseQueueWithPath: dbPath];

    return self;
}

- (void)play:(NSString *)sha
{
    [db inDatabase:^(FMDatabase *connection) {
        // Execute and fetch result
        NSString *query = [NSString stringWithFormat:@"select file from sound where sha = '%@' limit 1", sha];

        FMResultSet *rs = [connection executeQuery:query];

        while([rs next]) {

            NSData *file = [rs dataForColumn: @"file"];

            NSError *error;

            self.audioPlayer = [[AVAudioPlayer alloc] initWithData: file error:&error];
            self.audioPlayer.numberOfLoops = 0;
            self.audioPlayer.volume = 1.0f;
            [self.audioPlayer prepareToPlay];

            if (self.audioPlayer == nil) {
                NSLog(@"Error playing sound: %@", [error description]);
            } else {
                [self.audioPlayer play];
            }
        }
    }];
}

// Cleanup
- (void)free {
    [db close];
}

@end

Используйте файл где-нибудь в вашем коде так:

self.soundPlayer = [[SoundPlayer alloc] init];
[self.soundPlayer play:[entry valueForKey:@"sha"]];

где [entry valueForKey: @ "sha"]] возвращает строку NSString, которая является именем файла, которое я сохранила в другой моей таблице записей.

2 голосов
/ 16 июля 2009

В общем случае лучше не хранить двоичные файлы в любой базе данных. Вам лучше записать этот файл на диск в виде файла и затем сохранить путь в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...