Как использовать lame для кодирования в MP3 в IOS
Я знаю, что раньше было несколько вопросов по этой теме, но у монахини там, кажется, есть полный ответ.
Я пытаюсь закодировать AFF в MP3, обнаружил, что единственный бесплатный способ - использовать "LAME". к сожалению, он имеет поддержку только в Mac, поэтому я получаю ошибки компоновщика при попытке использовать его в проекте IOS.
Кому-нибудь удалось использовать эту библиотеку для этого использования? Любая помощь будет высоко ценится, это очень важно для меня..
1 ответ
Вы можете скомпилировать библиотеку libmp3lame
используя автоконф. Я использую следующий скрипт bash для настройки параметров configure
:
#!/bin/sh
# The device's architecture
export ARCH="armv7-apple-darwin12"
# SDK setup
export SDKVER="7.1"
export SDKROOT="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk"
export PREFIX="/tmp/iphone-$SDKVER-armv7"
export PKG_CONFIG_PATH="$SDKROOT/usr/lib/pkgconfig":"$PREFIX/lib/pkgconfig"
# Flags
export CPPFLAGS="-arch armv7 -isysroot $SDKROOT -I$PREFIX/include"
export CFLAGS="-std=gnu99"
export CXXFLAGS="-std=gnu++11 -stdlib=libc++"
export LDFLAGS="-arch armv7 -isysroot $SDKROOT -L$PREFIX/lib"
# Run configure
./configure \
--prefix="$PREFIX" \
--host="$ARCH" \
--enable-static \
--disable-shared $@
Если вы сохраните код выше в ios-configure.sh
в исходном каталоге LAME вы можете настроить и скомпилировать следующие команды:
% ./ios-configure.sh
% make libmp3lame
#import <Foundation/Foundation.h>
#import <lame/lame.h>
NS_ASSUME_NONNULL_BEGIN
const int PCM_SIZE = 4096;
const int MP3_SIZE = 4096;
@interface AudioFile : NSObject
-(BOOL) encode: (float*) recordedData
datasize : (int) size
sampleRate: (int) nSampleRate
docName: (char*) fileName;
@end
NS_ASSUME_NONNULL_END
#import "AudioFile.h"
#import <AVFoundation/AVFoundation.h>
@implementation AudioFile
short int pcm_buffer_I_L[PCM_SIZE];
short int pcm_buffer_I_R[PCM_SIZE];
unsigned char mp3buf[MP3_SIZE];
-(BOOL) encode: (float*) recordedData // Float Array
datasize : (int) size // Size of Float Array
sampleRate: (int) nSampleRate // Sample rate
docName: (char*) fileName // File Name
{
NSString *file = [NSString stringWithCString:fileName encoding:NSASCIIStringEncoding];
NSString *tmpUrl = [NSString stringWithFormat:@"%@/%@", NSTemporaryDirectory(), file];
NSLog(@"Mp3 File Path: %@", tmpUrl);
float write;
//Converting into mp3, so we need the mp3 file ready!
FILE *mp3 = fopen((char*)[tmpUrl UTF8String], "wb");
lame_t lame = lame_init();
lame_set_in_samplerate(lame, nSampleRate);
lame_set_out_samplerate(lame, nSampleRate);
lame_set_VBR(lame, vbr_max_indicator);
lame_set_mode(lame, MONO); //if this is enabled the channels will be set to 1 by default
// lame_set_num_channels(lame, 1);
lame_set_quality(lame, 0); //0 is the best .. 9 is the worst
lame_init_params(lame);
NSLog(@"Sample Rate: %d " , lame_get_in_samplerate(lame));
/*
lame_encode_buffer_interleaved_ieee_float
1st pram = lame config
2nd pram = float
3rd pram = frame
4th pram = mp3buf //mp3buf is an array of unsigned char with size of 4096
5th pram = size of Mp3 which is 4096
*/
int i;
for (i = 0; i < size; i++)
{
write = lame_encode_buffer_interleaved_ieee_float(lame, &recordedData[i], 1, mp3buf, MP3_SIZE);
fwrite(mp3buf, write, 1, mp3);
}
lame_close(lame);
fclose(mp3);
return YES;
}
@end
Вы можете использовать мою ссылку git. код находится в Цели C
https://gitlab.com/a.raza/lame-encoder-and-decoder-for-ios-unity-plugin