CacheDataSource กับ SimpleCache ใน exoplayer?

Sep 14 2020

ฉันสับสนกับ ExoPlayer และเอกสารของพวกเขามาก ช่วยอธิบายหน่อยได้ไหมว่าจุดประสงค์อะไรและเมื่อไหร่ที่เราควรใช้ CacheDataSource และเมื่อ SimpleCache?

คำตอบ

Sdghasemi Sep 15 2020 at 04:33

CacheDataSourceและSimpleCacheบรรลุวัตถุประสงค์สองประการที่แตกต่างกัน ถ้าคุณดูที่ต้นแบบระดับของพวกเขาคุณจะเห็นว่าและCacheDataSource implements DataSource SimpleCache implements Cacheเมื่อคุณจำเป็นต้องแคชวิดีโอดาวน์โหลดของคุณคุณต้องใช้CacheDataSourceเป็นของคุณDataSource.Factoryเพื่อเตรียมความพร้อมการเล่นสื่อของคุณ:

// Produces DataSource instances through which media data is loaded.
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, Util.getUserAgent(context, "AppName"));
dataSourceFactory = new CacheDataSourceFactory(VideoCacheSingleton.getInstance(), dataSourceFactory);

จากนั้นใช้dataSourceFactoryเพื่อสร้างMediaSource:

// This is the MediaSource representing the media to be played.
MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory)
        .createMediaSource(mediaUri);
SimpleExoPlayer exoPlayerInstance = new SimpleExoPlayer.Builder(context).build();
exoPlayerInstance.prepare(mediaSource);

ในขณะที่ให้SimpleCacheคุณใช้แคชที่รักษาการแทนในหน่วยความจำ ดังที่คุณเห็นในโค้ดแรกบล็อกตัวสร้าง CacheDataSourceFactory ต้องการCacheอินสแตนซ์เพื่อทำงานด้วย คุณสามารถประกาศกลไกการแคชของคุณเองหรือใช้SimpleCacheคลาสเริ่มต้นที่ ExoPlayer มอบให้คุณ หากคุณจำเป็นต้องใช้การใช้งานเริ่มต้นคุณควรคำนึงถึงสิ่งนี้:

SimpleCache เพียงอินสแตนซ์เดียวเท่านั้นที่ได้รับอนุญาตสำหรับไดเร็กทอรีที่กำหนดในช่วงเวลาที่กำหนด

ตามเอกสารประกอบ . ดังนั้นในการใช้อินสแตนซ์เดียวSimpleCacheสำหรับโฟลเดอร์เราใช้รูปแบบการประกาศซิงเกิลตัน:

public class VideoCacheSingleton {
    private static final int MAX_VIDEO_CACHE_SIZE_IN_BYTES = 200 * 1024 * 1024;  // 200MB

    private static Cache sInstance;

    public static Cache getInstance(Context context) {
        if (sInstance != null) return sInstance;
        else return sInstance = new SimpleCache(new File(context.getCacheDir(), "video"), new LeastRecentlyUsedCacheEvictor(MAX_VIDEO_CACHE_SIZE_IN_BYTES), new ExoDatabaseProvider(context)));
    }
}

TL; ดร

เราใช้CacheDataSourceเพื่อเตรียมการเล่นสื่อแคชและSimpleCacheสร้างDataSource.Factoryอินสแตนซ์