android - 如何在来自 HLS 流媒体的 exoplayer(android 应用程序)中播放加密视频?

标签 android encryption ffmpeg http-live-streaming exoplayer

我现在正在使用 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, id: String, 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)
    }
}

关于android - 如何在来自 HLS 流媒体的 exoplayer(android 应用程序)中播放加密视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63527157/

相关文章:

android - 为应用程序实现匿名身份验证的正确方法?

java - 如果 Edittext 没有输入文本则提示 toast

android - 全屏通知

java - 如何在 Android Studio 中使用与该函数无关的函数中的数组

go - exec ffmpeg 标准输出管道停止

bash - Clojure shell/sh 不能正确处理单引号参数?

java - 无法从 Google 的 IAB 框架捕获 IllegalStateException

c++ - 加密基于 C++/Perl 的应用程序的具体问题,以便数据库访问凭据永远不会被黑客攻击

PHP mcrypt_encrypt/mcrypt_decrypt 问题,返回不同的值

python - 我正在尝试使用 python 将 mp4 文件转换为文本,但出现此错误