58 lines
2.5 KiB
Java
58 lines
2.5 KiB
Java
package com.uiui.aios.utils;
|
|
|
|
import android.content.Context;
|
|
import android.graphics.Bitmap;
|
|
import android.util.Log;
|
|
|
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
|
import io.reactivex.rxjava3.annotations.NonNull;
|
|
import io.reactivex.rxjava3.core.Observable;
|
|
import io.reactivex.rxjava3.core.ObservableEmitter;
|
|
import io.reactivex.rxjava3.core.ObservableOnSubscribe;
|
|
import io.reactivex.rxjava3.core.Observer;
|
|
import io.reactivex.rxjava3.schedulers.Schedulers;
|
|
import wseemann.media.FFmpegMediaMetadataRetriever;
|
|
|
|
public class FFmpegUtils {
|
|
/**
|
|
* 获取在线音频时间长度
|
|
*
|
|
* @param url
|
|
* @return
|
|
*/
|
|
public static void getDurationInMilliseconds(String url, Observer<Integer> observer) {
|
|
Observable.create(new ObservableOnSubscribe<Integer>() {
|
|
@Override
|
|
public void subscribe(@NonNull ObservableEmitter<Integer> emitter) throws Throwable {
|
|
long time = System.currentTimeMillis();
|
|
FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever();
|
|
mmr.setDataSource(url);
|
|
int duration = Integer.parseInt(mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION));
|
|
Log.e("AudioUtils", "getDurationInMilliseconds: " + (System.currentTimeMillis() - time));
|
|
mmr.release();//释放资源
|
|
emitter.onNext(duration / 1000);
|
|
}
|
|
}).subscribeOn(Schedulers.io())
|
|
.observeOn(AndroidSchedulers.mainThread())
|
|
.subscribe(observer);
|
|
}
|
|
|
|
public static void loadVideoScreenshot(String url, Observer<Bitmap> observer) {
|
|
Observable.create(new ObservableOnSubscribe<Bitmap>() {
|
|
@Override
|
|
public void subscribe(@NonNull ObservableEmitter<Bitmap> emitter) throws Throwable {
|
|
FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever();
|
|
mmr.setDataSource(url);
|
|
mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_ALBUM);
|
|
mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_ARTIST);
|
|
Bitmap b = mmr.getFrameAtTime(2000000, FFmpegMediaMetadataRetriever.OPTION_CLOSEST); // frame at 2 seconds
|
|
byte[] artwork = mmr.getEmbeddedPicture();
|
|
mmr.release();
|
|
emitter.onNext(b);
|
|
}
|
|
}).subscribeOn(Schedulers.io())
|
|
.observeOn(AndroidSchedulers.mainThread())
|
|
.subscribe(observer);
|
|
}
|
|
}
|