如何在来自HLS Streamer的exoplayerandroid app中播放加密的视频?

问题描述

我现在正在使用FFMPEG通过HLS流式传输mp4文件。 我正在使用此链接来启用加密:https://hlsbook.net/how-to-encrypt-hls-video-with-ffmpeg/

要在我的android应用中播放视频,我正在使用exoplayer,以下是播放视频的源代码:

Player player;
private MediaSource buildMediaSource(Uri uri) {
     TrackSelection.Factory adaptiveTrackSelection = new AdaptiveTrackSelection.Factory(new DefaultBandwidthMeter());
    player = ExoPlayerFactory.newSimpleInstance(
            this,new DefaultTrackSelector(adaptiveTrackSelection));
    playerView.setPlayer(player);
    // These factories are used to construct two media sources.
    DefaultBandwidthMeter defaultBandwidthMeter = DefaultBandwidthMeter.getSingletonInstance(this);
    DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(mContext,Util.getUserAgent(mContext,"cookvid"),defaultBandwidthMeter);
    //DataSource.Factory dataSourceFactory =
    //        new DefaultDataSourceFactory(this,"exoplayer-codelab");

    HlsMediaSource.Factory mediaSourceFactory = new HlsMediaSource.Factory(dataSourceFactory);
    return mediaSourceFactory.createMediaSource(uri);
    //return new ProgressiveMediaSource.Factory(dataSourceFactory)
     //       .createMediaSource(uri);
}
private void initializePlayer() {
    Uri uri = Uri.parse(getString(R.string.media_url_hls));
    MediaSource mediaSource = buildMediaSource(uri);
    player.setPlayWhenReady(playWhenReady);
    player.seekTo(currentWindow,playbackPosition);
    player.addListener(playbackStateListener);
    player.prepare(mediaSource,false,false);
}

但是使用此代码,我无法在应用程序中播放视频,如果不使用此加密,那么exoplayer可以毫无问题地播放视频。

请帮助我,我是exoplayer方面的新手。

解决方法

我在 Kotlin 中为您创建了一个示例以使其工作:

class MainActivity : AppCompatActivity() {

    private var exoPlayer: SimpleExoPlayer? = null
    private var trackSelector: DefaultTrackSelector? = null
    var drmSessionManager: DefaultDrmSessionManager? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        trackSelector = DefaultTrackSelector(this)
        exoPlayer = SimpleExoPlayer.Builder(this)
            .setTrackSelector(trackSelector!!)
            .build()

        player_view.player = exoPlayer
        
       var uri =  Uri.fromFile( File("//android_asset/legend_enc.mp4"))
       playVideo(uri,"zX65/4jzTK6wYYWwACTkwg","Y8tfcYTdS2iaXF/xHuajKA")

    }

    private fun playVideo(url: Uri,id: String,value: String){
        try {
            drmSessionManager =
                Util.getDrmUuid(C.CLEARKEY_UUID.toString())?.let { buildDrmSessionManager(
                    it,true,id,value
                ) }
        } catch (e: UnsupportedDrmException) {
            e.printStackTrace()
        }
        exoPlayer?.setMediaSource(buildDashMediaSource(url))
        exoPlayer?.prepare()
        exoPlayer?.playWhenReady = true
    }

    private fun buildDashMediaSource(uri: Uri): MediaSource {
        val dashChunkSourceFactory = DefaultDataSourceFactory(this,"agent")
        return ProgressiveMediaSource.Factory(dashChunkSourceFactory)
            .setDrmSessionManager(drmSessionManager ?: DrmSessionManager.DUMMY)
            .createMediaSource(uri)
    }

    @Throws(UnsupportedDrmException::class)
    private fun buildDrmSessionManager(uuid: UUID,multiSession: Boolean,value: String): DefaultDrmSessionManager {
        val drmCallback = LocalMediaDrmCallback("{\"keys\":[{\"kty\":\"oct\",\"k\":\"${value}\",\"kid\":\"${id}\"}],\"type\":\"temporary\"}".toByteArray())
        val mediaDrm = FrameworkMediaDrm.newInstance(uuid)
        return DefaultDrmSessionManager(uuid,mediaDrm,drmCallback,null,multiSession)
    }
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...