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 observer) { Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(@NonNull ObservableEmitter 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 observer) { Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(@NonNull ObservableEmitter 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); } }