【问题标题】:Android Exoplayer play UDP streaming no audioAndroid Exoplayer 播放 UDP 流无音频
【发布时间】:2020-02-29 08:53:19
【问题描述】:

我是 android webview 的新手,我使用 exoplayer 在 android webview 中播放视频,我播放了 2 个类别的视频, 第一个mp4,运行良好。 第二个流媒体(单播 m3u8 和 UDP)视频播放良好但没有音频,我尝试在流 vlc 中播放源有音频,

这是我的代码。

private void initializePlayerMulticast(Uri mUri) {
        Toast.makeText(ExoPlayer.this, "Hello bro multicast woi hehee", Toast.LENGTH_LONG).show();

        player = ExoPlayerFactory.newSimpleInstance(this);
        UdpDataSource.Factory test = buildDataSourceFactory();
        ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
        ExtractorMediaSource mediaSource = new ExtractorMediaSource
                .Factory(test)
                .setExtractorsFactory(extractorsFactory)
                .createMediaSource(mUri);
        videoView.setPlayer(player);
        player.prepare(mediaSource);
        player.setPlayWhenReady(true);
    }

    private DataSource.Factory buildDataSourceFactory() {
        return new UdpDataSource.Factory() {
            @Override
            public DataSource createDataSource() {
                return new UdpDataSource(5000, 100000);
            }
        };
    }

对不起英语不好..

【问题讨论】:

  • 你能找到解决办法吗?
  • 我想我得到了解决方案..要安装与 mpeg 不同的音频编解码器,我们需要先安装 ffmpeg..
  • @Jimbo 你能解释一下你是怎么做到的吗?

标签: android udp streaming exoplayer2.x unicast


【解决方案1】:

就我而言,音频也是一个问题。所以我通过确保比特率高于 20(也可以是 1)以及视频的高度来修复它。代码如下:

private void extractYoutubeUrl() {
        new YouTubeExtractor(this) {
            @SuppressLint("StaticFieldLeak")
            @Override
            public void onExtractionComplete(SparseArray<YtFile> ytFiles, VideoMeta vMeta) {

                if (ytFiles != null) {
                    for (int i = 0, itag; i < ytFiles.size(); i++) {
                        itag = ytFiles.keyAt(i);
                        YtFile ytFile = ytFiles.get(itag);                       
                        String extn=ytFile.getFormat().getExt();
                        int height = ytFile.getFormat().getHeight();
                        int audibit = ytFile.getFormat().getAudioBitrate();
                        if(height>200 & audibit>20){
                            playVideo(ytFile.getUrl());
                            Log.i("audiobitrate",String.valueOf(ytFile.getFormat().getAudioBitrate()));
                        }
                    }

                }else{
                    
                }
            }
        }
        .extract(mYoutubeLink, true, true);
    }

【讨论】:

    【解决方案2】:

    您可以使用以下代码播放.m3u8文件:-

    Handler mHandler = new Handler();
    
    String userAgent = Util.getUserAgent(context, "APP_NAME");
    
    DataSource.Factory dataSourceFactory = new DefaultHttpDataSourceFactory(
                    userAgent, null,
                    DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS,
                    1800000,
                    true);
    
    HlsMediaSource mediaSource = new HlsMediaSource(Uri.parse(mediaUrl),dataSourceFactory, 1800000,mHandler, null);
    
    if (mediaUrl != null) {
        videoPlayer.prepare(mediaSource);
        videoPlayer.setPlayWhenReady(true);
    }
    

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • @Arion 我已经更新了我的答案并删除了参考链接。
    • 感谢您的回答@AnkitLathiya 但是,当我安装 ffmpeg 并将其与 exoplayer 连接时,我找到了解决方案.. 使用我的代码在其工作之上..
    猜你喜欢
    • 2019-05-15
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 2019-03-30
    • 2018-09-13
    • 2019-05-05
    • 2018-12-16
    • 1970-01-01
    相关资源
    最近更新 更多