彼は偽アプリのビブラートを作った、と呼ばれるだけの2つの開発プロジェクト終了Langya短いビデオ。プロジェクト後の戻りがアリの楽しいビデオは、今日は記録映像に友人を尋ねたフラッシュバックを使用して、簡単に参照するのは簡単、それを記録するために少し時間がかかります。
動画を記録した後、ページ内に放出、またはバックフラッシュバック点滅も公開に戻ります。
少なくとも200人が質問やテストを依頼する、楽しいビデオコードあなたが書いた文書やアリの公式は正確に同じことを書か与える場合でも、モデルが存在します後のビデオ・リターンを記録した後、フラッシュバック。なぜ?フラッシュバックの問題は、ベータ版の開始後に発見、私は最初のコースのだと思い何度も何度もコードを整理して、自分自身の問題である、完璧なああ、問題はないああ。
その後、コメントアウトすべてのコードの少し後に、徹底的に問題を発見する:とき(onDestoryで)、及びアリ資源回復のいくつかの、いくつかのモデルにリサイクルすることは不動、直接フラッシュバックです。しかし!フラッシュバックされます他のモデルでは、回復していません。最後に、リサイクル資源の4つの方法は、私は、3を保持テスト何百人もの人々 、それ以上の問題のいずれかをコメントしています。
次のようにコードで:
//销毁回收
@Override
protected void onDestroy() {
super.onDestroy();
if (mCompose != null) {
mCompose.release();
//根据阿里11.1号更新版本添加
mCompose = null;
}
// if (aliyunIThumbnailFetcher != null) {
// aliyunIThumbnailFetcher.release();
// }
if (mAsyncTaskOnCreate != null) {
mAsyncTaskOnCreate.cancel(true);
mAsyncTaskOnCreate = null;
}
if (mAsyncTaskResult != null) {
mAsyncTaskResult.cancel(true);
mAsyncTaskResult = null;
}
}
私は、新しいバージョンでは、ないないので、高速更新のアリの楽しいビデオ版を考え、またはでしょう。だからここに、それは価値がある学習経験があり、そして少なくともあなたが知っている場所を、具体的操作方法、または実際のテストへの回復過程における問題の嘘、。
ビデオ時間のかかるをアップロードします。
アリと過ごした時間の同じ長さで書かれた公式文書は、個々のモデルに表示されます。前提はあなたのコードを最適化することで、あなたは、アリのデモの対応バージョンをダウンロードし、実際のテストが発生する可能性があり実施し、アリのデモが遅くなり、行われてきました。だから、最初にこの携帯電話の非常に低い割合(百テストに参加する50社の企業が、唯一の顧客の一の側面だけニッチなモデルを見つけた)され、戦わず、私は実際のマシンを発見し、唯一の赤米note7PROそれをテスト可能な2つまたは3分にビデオをアップロードする問題、15秒があります。
自分のデータのための音楽リストサーバを交換してください:
次のようにAliyunSvideoMusicの依存関係、MusicLoaderクラス次com.aliyun.apsaravideo.music.musicパッケージでは、私が変換します:
package com.aliyun.apsaravideo.music.music;
import android.content.Context;
import android.os.AsyncTask;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;
import com.aliyun.apsaravideo.music.R;
import com.aliyun.apsaravideo.music.utils.SharedPreferenceUtils;
import com.aliyun.common.utils.CommonUtil;
import com.aliyun.common.utils.StorageUtils;
import com.aliyun.common.utils.ToastUtil;
import com.aliyun.downloader.DownloaderManager;
import com.aliyun.downloader.FileDownloaderCallback;
import com.aliyun.downloader.FileDownloaderModel;
import com.aliyun.svideo.base.http.EffectService;
import com.aliyun.svideo.base.http.MusicFileBean;
import com.google.gson.Gson;
import com.liulishuo.filedownloader.BaseDownloadTask;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.StringCallback;
import com.lzy.okgo.model.HttpParams;
import com.lzy.okgo.model.Response;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class MusicLoader {
public static final int EFFECT_MUSIC = 5; //音乐
private final MusicQuery mMusicQuery;
private LoadCallback callback;
private final Context mContext;
public EffectService mService = new EffectService();
public void loadAllMusic() {
loadLocalMusic();
loadMoreOnlineMusic();
}
public MusicLoader(Context context) {
mContext = context;
mMusicQuery = new MusicQuery(context);
}
/**
* 加载本地音乐
*/
public void loadLocalMusic() {
mMusicQuery.setOnResProgressListener(new MusicQuery.OnResProgressListener() {
@Override
public void onResProgress(ArrayList<MusicFileBean> musics) {
List<EffectBody<MusicFileBean>> effectBodyList = new ArrayList<>();
for (MusicFileBean musicFileBean : musics) {
effectBodyList.add(new EffectBody<MusicFileBean>(musicFileBean, true));
}
if (callback != null) {
callback.onLoadLocalMusicCompleted(effectBodyList);
}
}
});
mMusicQuery.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
private int pageSize = 25;
private int pageNo = 1;
/**
* 是否正在加载网络音乐
*/
private boolean isLoadingMusic;
private boolean isMusicEnd;
/**
* 搜索音乐
*/
public void searchOnlineMusic(String keyWord) {
loadOnlineMusic(1, 25, keyWord);
}
public void loadMoreOnlineMusic() {
if (isLoadingMusic || isMusicEnd) {
return;
}
loadOnlineMusic(pageNo, pageSize, "");
}
/**
* 加载网络音乐 小肥龙音乐
*/
List<MusicFileBean> result = new ArrayList<>();
private void loadOnlineMusic(int pageNo, final int pageSize, final String keyWord) {
isLoadingMusic = true;
HttpParams params = new HttpParams();
params.put("page", pageNo);
params.put("token", SharedPreferenceUtils.getToken(mContext));
OkGo.<String>post("http://www.1yft.com/Api/Video/getmusiclist").tag(mContext).params(params).execute(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
List<MusicLineBean> musicLineBeanList = new ArrayList<>();
Gson gs = new Gson();
BaseBean jsonObject = gs.fromJson(response.body(), BaseBean.class);//把JSON字符串转为对象
/* musicLineBeanList = (List<MusicLineBean>) gs.fromJson(String.valueOf(response.body()), new TypeToken<List<MusicLineBean>>() {
}.getType());*/
musicLineBeanList = (List<MusicLineBean>) jsonObject.data;
isLoadingMusic = false;
if (TextUtils.isEmpty(keyWord) && musicLineBeanList.size() < pageSize) {
isMusicEnd = true;
}
//项目中需要的music
for (int i = 0; i < musicLineBeanList.size(); i++) {
MusicFileBean musicFileBean = new MusicFileBean();
musicFileBean.setMusicId(musicLineBeanList.get(i).getId());
musicFileBean.setTitle(musicLineBeanList.get(i).getMusic_name());
musicFileBean.setArtist(musicLineBeanList.get(i).getMusic_author());
musicFileBean.setImage(musicLineBeanList.get(i).getMusic_image());
musicFileBean.setPath(musicLineBeanList.get(i).getMusic_url());
musicFileBean.setDuration(Integer.parseInt(String.valueOf(Math.round(Double.parseDouble(musicLineBeanList.get(i).getMusic_second())))));
result.add(musicFileBean);
}
List<EffectBody<MusicFileBean>> effectBodyList = new ArrayList<>();
List<FileDownloaderModel> modelsTemp = DownloaderManager.getInstance().getDbController().getResourceByType(EFFECT_MUSIC);
for (MusicFileBean musicFileBean : result) {
EffectBody<MusicFileBean> effectBody = new EffectBody<>(musicFileBean, false);
for (FileDownloaderModel fileDownloaderModel : modelsTemp) {
if (musicFileBean.getMusicId().equals(fileDownloaderModel.getDownload()) && new File(fileDownloaderModel.getPath()).exists()) {
musicFileBean.setPath(fileDownloaderModel.getPath());
effectBody.setLocal(true);
}
}
effectBodyList.add(effectBody);
}
if (callback != null) {
if (TextUtils.isEmpty(keyWord)) {
callback.onLoadNetMusicCompleted(effectBodyList);
} else {
callback.onSearchNetMusicCompleted(effectBodyList);
}
}
MusicLoader.this.pageNo++;
MusicLoader.this.pageSize++;
}
@Override
public void onError(Response<String> response) {
super.onError(response);
isLoadingMusic = false;
}
});
}
/**
* 下载音乐
*
* @param musicFileBean
* @param callback
*/
public void downloadMusic(final MusicFileBean musicFileBean, final FileDownloaderCallback callback) {
if (!CommonUtil.hasNetwork(mContext)) {
ToastUtil.showToast(mContext, R.string.aliyun_network_not_connect);
return;
}
if (CommonUtil.SDFreeSize() < 10 * 1000 * 1000) {
Toast.makeText(mContext, R.string.aliyun_no_free_memory, Toast.LENGTH_SHORT).show();
return;
}
/*
* 下载地址通过musicId进行比对
* */
String url = "";
for (int i = 0; i < result.size(); i++) {
if (musicFileBean.musicId.equals(result.get(i).getMusicId())) {
url = result.get(i).getPath();
}
}
if (TextUtils.isEmpty(url)) {
ToastUtil.showToast(mContext, "播放地址为空");
return;
}
final FileDownloaderModel downloaderModel = new FileDownloaderModel();
downloaderModel.setUrl(url);
downloaderModel.setDownload(musicFileBean.getMusicId());
downloaderModel.setName(musicFileBean.title);
downloaderModel.setIsunzip(0);
downloaderModel.setDuration(musicFileBean.duration);
downloaderModel.setPath(StorageUtils.getFilesDirectory(mContext) + "/music/" + musicFileBean.title);
downloaderModel.setDescription(musicFileBean.artist);
downloaderModel.setEffectType(EFFECT_MUSIC);
if (downloaderModel == null) {
Log.e("MusicLoader", "downloaderModel is null");
}
final FileDownloaderModel model = DownloaderManager.getInstance().addTask(downloaderModel, url);
if (model == null) {
Log.e("MusicLoader", "model is null");
}
if (DownloaderManager.getInstance().isDownloading(model.getTaskId(), model.getPath())) {
return;
}
DownloaderManager.getInstance().startTask(model.getTaskId(), new FileDownloaderCallback() {
@Override
public void onFinish(int downloadId, String path) {
callback.onFinish(downloadId, path);
}
@Override
public void onStart(int downloadId, long soFarBytes, long totalBytes, int preProgress) {
callback.onStart(downloadId, soFarBytes, totalBytes, preProgress);
}
@Override
public void onProgress(int downloadId, long soFarBytes, long totalBytes, long speed,
int progress) {
callback.onProgress(downloadId, soFarBytes, totalBytes, speed, progress);
}
@Override
public void onError(BaseDownloadTask task, Throwable e) {
ToastUtil.showToast(mContext, R.string.aliyun_download_failed);
DownloaderManager.getInstance().deleteTaskByTaskId(model.getTaskId());
DownloaderManager.getInstance().getDbController().deleteTask(model.getTaskId());
callback.onError(task, e);
}
});
}
public interface LoadCallback {
void onLoadLocalMusicCompleted(List<EffectBody<MusicFileBean>> loacalMusic);
void onLoadNetMusicCompleted(List<EffectBody<MusicFileBean>> netMusic);
void onSearchNetMusicCompleted(List<EffectBody<MusicFileBean>> result);
}
public void setCallback(LoadCallback callback) {
this.callback = callback;
}
}
MusicFileBeanカテゴリ:
package com.aliyun.svideo.base.http;
public class MusicFileBean {
public MusicFileBean(String title, String artist, String musicId,String image) {
this.title = title;
this.artist = artist;
this.musicId = musicId;
this.image = image;
}
public MusicFileBean() {
}
/**
* id标识
*/
public int id;
/**
* 显示名称
*/
public String title;
/**
* 文件名称
*/
public String displayName;
/**
* 音乐文件的路径
*/
public String path;
/**
* 媒体播放总时间
*/
public int duration;
/**
* 艺术家
*/
public String artist;
/**
* 音乐id
*/
public String musicId;
/**
* 音乐图片地址
*/
public String image;
public long size;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
public int getDuration() {
return duration;
}
public void setDuration(int duration) {
this.duration = duration;
}
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
public String getMusicId() {
return musicId;
}
public void setMusicId(String musicId) {
this.musicId = musicId;
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
}