開源音訊編輯工具ringdroid

開源音訊編輯工具ringdroid

最近在研究音視訊編輯功能,在網上找到一個開源的音訊編輯工具ringdroid效果挺好的就貼出來,先看效果

我只是簡單的改了點介面,功能基本保留

先新建個專案,把ringdroid所有檔案都複製到這個專案中,run一下,報錯,由於ringdroid專案時代久遠,不支援動態許可權,所以要自己新增,簡單的方法就是新建一個activity獲取許可權,再跳轉到RingdroidSelectActivity

修改AndroidManifest.xml

<activity android:name="GuideActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="RingdroidSelectActivity"  android:label="@string/main_activity_label">
<intent-filter>
<action android:name="android.intent.action.GET_CONTENT" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.OPENABLE" />
<data android:mimeType="audio/*" />
</intent-filter>
</activity>

GuideActivity就是我獲取許可權的activity

成功進入RingdroidSelectActivity後,點選音樂或鈴聲後沒有反應,出現這中情況是因為包名問題,建立專案的時候預設包名和ringdroid的包名不對應,只要改build.gradle的applicationId和AndroidManifest.xml的package就可以了

build.gradle

android {
compileSdkVersion 26
defaultConfig {
applicationId "com.ringdroid"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ringdroid">

好了,這樣就可以編輯音訊了,如果要編輯視訊音軌就要改soundfile資料夾內的程式碼

先修改RingdroidEditActivity的程式碼,把mFilename寫成固定路徑

然後把

if (!mFilename.equals("record")) {
loadFromFile();
} else {
recordAudio();
}

改成

loadFromFile();

這樣就會直接讀取視訊音軌了,再修改SoundFile的getSupportedExtensions函式

public static String[] getSupportedExtensions() {
return new String[] {"mp3", "wav", "3gpp", "3gp", "amr", "aac", "m4a", "ogg","mp4"};
}

新增一個MP4,這樣就不會不識別MP4了,將下面這段判斷程式碼註釋掉

/                if (firstSampleData
//                        && format.getString(MediaFormat.KEY_MIME).equals("audio/mp4a-latm")
//                        && sample_size == 2) {
//                    // For some reasons on some devices (e.g. the Samsung S3) you should not
//                    // provide the first two bytes of an AAC stream, otherwise the MediaCodec will
//                    // crash. These two bytes do not contain music data but basic info on the
//                    // stream (e.g. channel configuration and sampling frequency), and skipping them
//                    // seems OK with other devices (MediaCodec has already been configured and
//                    // already knows these parameters).
//                    extractor.advance();
//                    tot_size_read  = sample_size;
//                } else

這樣就不會跳過視訊了,然後關於進度條,ringdroid是通過檔案大小來判斷進度的,而視訊有影象所以檔案大小不能用來判斷進度,所以改一下用時間來進行判斷在

if (i == numTracks) {
throw new InvalidInputException("No audio track found in "   mInputFile);
}

下新增

long duration = format.getLong(MediaFormat.KEY_DURATION);

來獲取總時長,再把

if (!mProgressListener.reportProgress((float)(tot_size_read) / mFileSize))

改成

if (!mProgressListener.reportProgress((float)(presentation_time) / duration))

這樣就大功告成,貼demo

下載:百度雲

密碼:3usf