最近在研究音视频编辑功能,在网上找到一个开源的音频编辑工具ringdroid效果挺好的就贴出来,先看效果
我只是简单的改了点界面,功能基本保留
先新建个项目,把ringdroid所有文件都复制到这个项目中,run一下,报错,由于ringdroid项目时代久远,不支持动态权限,所以要自己添加,简单的方法就是新建一个activity获取权限,再跳转到RingdroidSelectActivity
修改AndroidManifest.xml
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
好了,这样就可以编辑音频了,如果要编辑视频音轨就要改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
昨天忘贴一段代码了不然有些视频会只加载前5秒的数据后边就没有了,把
int newSize = (int)((position * (1.0 * mFileSize / tot_size_read)) * 1.2);
if (newSize - position < info.size + 5 * (1<<20)) {
newSize = position + info.size + 5 * (1<<20);
}
改成
int newSize = position + info.size + 5 * (1<<20);
把
mAvgBitRate = (int)((mFileSize * 8) * ((float)mSampleRate / mNumSamples) / 1000);
改成
mAvgBitRate = (int)((tot_size_read * 8) * ((float)mSampleRate / mNumSamples) / 1000);
好了,这次是真的大功告成了,重新上传demo
下载:百度云
密码:k9q3