Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bug修正 #9

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
apply plugin: 'com.android.application'

android {
compileSdkVersion 27
compileSdkVersion 28
buildToolsVersion '28.0.3'
defaultConfig {
applicationId "jaygoo.demo.mp3converter"
minSdkVersion 16
targetSdkVersion 27
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
Expand All @@ -21,7 +22,7 @@ android {

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.yanzhenjie:permission:2.0.0-rc12'
implementation project(path: ':library')
}
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.1'
classpath 'com.android.tools.build:gradle:3.5.1'
}
}

Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
1 change: 1 addition & 0 deletions library/.gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
/build
.cxx
23 changes: 17 additions & 6 deletions library/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,21 @@ buildscript {
apply plugin: 'com.github.dcendents.android-maven'
group='com.github.Jay-Goo'


//名称
static def getModuleName() {
return "Mp3Converter"
}

android {
compileSdkVersion 27
compileSdkVersion 28
buildToolsVersion '28.0.3'

defaultConfig {
minSdkVersion 16
targetSdkVersion 27
versionCode 1
versionName "1.0"
targetSdkVersion 28
versionCode 10000
versionName "1.0.0"

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
Expand Down Expand Up @@ -56,12 +63,16 @@ android {
pickFirst 'lib/mips64/liblame-mp3-utils.so'
pickFirst 'lib/x86_64/liblame-mp3-utils.so'
}

//自动重命名AAR
android.libraryVariants.all { variant ->
variant.outputs.all {
outputFileName = "${getModuleName()}-${defaultConfig.versionName}.aar"
}
}
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
}


Expand Down
116 changes: 77 additions & 39 deletions library/src/main/cpp/lame-mp3-utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,25 @@
#include"jni.h"
#include"lamemp3/lame.h"
#include"android/log.h"

#define LOG_TAG "lameUtils"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define BUFFER_SIZE 8192

static lame_global_flags *lame = NULL;
long nowConvertBytes = 0;

struct lame_config {
int inSampleRate = 44100;
int channel = 2;
int mode = 0;
int outSampleRate = 44100;
int outBitRate = 96;
int quality = 7;
};

lame_config default_lame_config;

void resetLame() {
if (lame != NULL) {
lame_close(lame);
Expand All @@ -18,14 +30,13 @@ void resetLame() {
}


unsigned char* convertJByteArrayToChars(JNIEnv *env, jbyteArray bytearray)
{
unsigned char *convertJByteArrayToChars(JNIEnv *env, jbyteArray bytearray) {
unsigned char *chars = NULL;
jbyte *bytes;
bytes = env->GetByteArrayElements(bytearray, 0);
int chars_len = env->GetArrayLength(bytearray);
chars = new unsigned char[chars_len + 1];
memset(chars,0,chars_len + 1);
memset(chars, 0, chars_len + 1);
memcpy(chars, bytes, chars_len);
chars[chars_len] = 0;
env->ReleaseByteArrayElements(bytearray, bytes, 0);
Expand All @@ -36,63 +47,93 @@ void lameInit(jint inSampleRate,
jint channel, jint mode, jint outSampleRate,
jint outBitRate, jint quality) {
resetLame();
//记录参数
default_lame_config.inSampleRate = inSampleRate;
default_lame_config.channel = channel;
default_lame_config.mode = mode;
default_lame_config.outSampleRate = outSampleRate;
default_lame_config.outBitRate = outBitRate;
default_lame_config.quality = quality;

lame = lame_init();
lame_set_in_samplerate(lame, inSampleRate);
lame_set_num_channels(lame, channel);
lame_set_out_samplerate(lame, outSampleRate);
lame_set_brate(lame, outBitRate);
lame_set_quality(lame, quality);
if(mode == 0) { // use CBR
if (mode == 0) { // use CBR
lame_set_VBR(lame, vbr_default);
} else if(mode == 1){ //use VBR
} else if (mode == 1) { //use VBR
lame_set_VBR(lame, vbr_abr);
} else{ // use ABR
} else { // use ABR
lame_set_VBR(lame, vbr_mtrh);
}
lame_init_params(lame);
}

extern "C" JNIEXPORT void JNICALL
Java_jaygoo_library_converter_Mp3Converter_init(JNIEnv *env, jclass type, jint inSampleRate,
jint channel, jint mode, jint outSampleRate,
jint outBitRate, jint quality) {
jint channel, jint mode, jint outSampleRate,
jint outBitRate, jint quality) {
lameInit(inSampleRate, channel, mode, outSampleRate, outBitRate, quality);
}

extern "C" JNIEXPORT
void JNICALL Java_jaygoo_library_converter_Mp3Converter_convertMp3
(JNIEnv * env, jobject obj, jstring jInputPath, jstring jMp3Path) {
const char* cInput = env->GetStringUTFChars(jInputPath, 0);
const char* cMp3 = env->GetStringUTFChars(jMp3Path, 0);
(JNIEnv *env, jclass obj, jstring jInputPath, jstring jMp3Path) {
const char *cInput = env->GetStringUTFChars(jInputPath, 0);
const char *cMp3 = env->GetStringUTFChars(jMp3Path, 0);
//open input file and output file
FILE* fInput = fopen(cInput,"rb");
FILE* fMp3 = fopen(cMp3,"wb");
FILE *fInput = fopen(cInput, "rb");
FILE *fMp3 = fopen(cMp3, "wb");
short int inputBuffer[BUFFER_SIZE * 2];
unsigned char mp3Buffer[BUFFER_SIZE];//You must specified at least 7200
int read = 0; // number of bytes in inputBuffer, if in the end return 0
int write = 0;// number of bytes output in mp3buffer. can be 0
long total = 0; // the bytes of reading input file
nowConvertBytes = 0;
//if you don't init lame, it will init lame use the default value
if(lame == NULL){
lameInit(44100, 2, 0, 44100, 96, 7);
if (lame == NULL) {
lameInit(
default_lame_config.inSampleRate,
default_lame_config.channel,
default_lame_config.mode,
default_lame_config.outSampleRate,
default_lame_config.outBitRate,
default_lame_config.quality
);
}

int channel_num = lame_get_num_channels(lame);
//convert to mp3
do{
read = static_cast<int>(fread(inputBuffer, sizeof(short int) * 2, BUFFER_SIZE, fInput));
total += read * sizeof(short int)*2;
do {
if (channel_num == 1) {
//单声道
read = static_cast<int>(fread(inputBuffer, sizeof(short int), BUFFER_SIZE, fInput));
total += read * sizeof(short int);
} else {
//双声道
read = static_cast<int>(fread(inputBuffer, sizeof(short int) * 2, BUFFER_SIZE, fInput));
total += read * sizeof(short int) * 2;
}
nowConvertBytes = total;
if(read != 0){
write = lame_encode_buffer_interleaved(lame, inputBuffer, read, mp3Buffer, BUFFER_SIZE);
if (read != 0) {
if (channel_num == 1) {
//单声道
write = lame_encode_buffer(lame, inputBuffer, NULL, read, mp3Buffer,
BUFFER_SIZE);
} else {
//双声道
write = lame_encode_buffer_interleaved(lame, inputBuffer, read, mp3Buffer,
BUFFER_SIZE);
}
//write the converted buffer to the file
fwrite(mp3Buffer, sizeof(unsigned char), static_cast<size_t>(write), fMp3);
}
//if in the end flush
if(read == 0){
lame_encode_flush(lame,mp3Buffer, BUFFER_SIZE);
if (read == 0) {
lame_encode_flush(lame, mp3Buffer, BUFFER_SIZE);
}
}while(read != 0);
} while (read != 0);

//release resources
resetLame();
Expand All @@ -105,18 +146,18 @@ void JNICALL Java_jaygoo_library_converter_Mp3Converter_convertMp3

extern "C" JNIEXPORT int JNICALL
Java_jaygoo_library_converter_Mp3Converter__encode(
JNIEnv * env, jclass cls, jshortArray buffer_l, jshortArray buffer_r,
jint samples, jbyteArray mp3buf) {
jshort* j_buffer_l = env->GetShortArrayElements(buffer_l, NULL);
JNIEnv *env, jclass cls, jshortArray buffer_l, jshortArray buffer_r,
jint samples, jbyteArray mp3buf) {
jshort *j_buffer_l = env->GetShortArrayElements(buffer_l, NULL);

jshort* j_buffer_r = env->GetShortArrayElements(buffer_r, NULL);
jshort *j_buffer_r = env->GetShortArrayElements(buffer_r, NULL);

const jsize mp3buf_size = env->GetArrayLength(mp3buf);
unsigned char * c_mp3buf = convertJByteArrayToChars(env, mp3buf);
unsigned char *c_mp3buf = convertJByteArrayToChars(env, mp3buf);
int result = lame_encode_buffer(lame, j_buffer_l, j_buffer_r,
samples, c_mp3buf, mp3buf_size);

env-> ReleaseShortArrayElements(buffer_l, j_buffer_l, 0);
env->ReleaseShortArrayElements(buffer_l, j_buffer_l, 0);
env->ReleaseShortArrayElements(buffer_r, j_buffer_r, 0);
*c_mp3buf = NULL;
return result;
Expand All @@ -126,9 +167,9 @@ Java_jaygoo_library_converter_Mp3Converter__encode(

extern "C" JNIEXPORT int JNICALL
Java_jaygoo_library_converter_Mp3Converter__flush(
JNIEnv *env, jclass cls, jbyteArray mp3buf) {
JNIEnv *env, jclass cls, jbyteArray mp3buf) {
const jsize mp3buf_size = env->GetArrayLength(mp3buf);
unsigned char * c_mp3buf = convertJByteArrayToChars(env, mp3buf);
unsigned char *c_mp3buf = convertJByteArrayToChars(env, mp3buf);

int result = lame_encode_flush(lame, c_mp3buf, mp3buf_size);

Expand All @@ -137,17 +178,14 @@ Java_jaygoo_library_converter_Mp3Converter__flush(
}

extern "C" JNIEXPORT jstring JNICALL
Java_jaygoo_library_converter_Mp3Converter_close
(JNIEnv *env, jclass cls) {
lame_close(lame);
lame = NULL;
Java_jaygoo_library_converter_Mp3Converter_close(JNIEnv *env, jclass cls) {
resetLame();
}


extern "C" JNIEXPORT jstring JNICALL
Java_jaygoo_library_converter_Mp3Converter_getLameVersion(
JNIEnv *env, jobject /* this */) {
return env->NewStringUTF(get_lame_version());
Java_jaygoo_library_converter_Mp3Converter_getLameVersion(JNIEnv *env, jobject /* this */) {
return env->NewStringUTF(get_lame_version());
}

extern "C" JNIEXPORT jlong JNICALL
Expand Down
Binary file modified library/src/main/jniLibs/arm64-v8a/liblame-mp3-utils.so
Binary file not shown.
Binary file modified library/src/main/jniLibs/armeabi-v7a/liblame-mp3-utils.so
Binary file not shown.
Binary file modified library/src/main/jniLibs/x86/liblame-mp3-utils.so
Binary file not shown.
Binary file modified library/src/main/jniLibs/x86_64/liblame-mp3-utils.so
Binary file not shown.