Android Exoplayer 2 UDP 解码问题

标签 android video udp streaming exoplayer2.x

我是 ExoPlayer 的新手,我目前正准备用它来播放原生 Udp 流(来自法国数字电视:1080p 5-10 mbps 可变比特率)
我设法用来自 http://jell.yfish.us/ 的一些测试视频播放了一些 udp 流在不同的设备上。
我使用 HLS 和 Udp Streaming 对 UDP 进行了一些不同的视频解码测试:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.myactivity);

    sufaceview = (SurfaceView) findViewById(R.id.surfaceView2);


    BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
    TrackSelection.Factory videoTrackSelectionFactory =
            new AdaptiveTrackSelection.Factory(bandwidthMeter);
    TrackSelector trackSelector =
            new DefaultTrackSelector(videoTrackSelectionFactory);

    LoadControl loadControl = new DefaultLoadControl(
            new DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE),
            15000, 60000, 2500, 6000);


    player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);


    Uri uri =
            Uri.parse
                    ("udp://@239.192.2.2:1234");

    final DefaultBandwidthMeter bandwidthMeterA = new DefaultBandwidthMeter();

    DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this,
            Util.getUserAgent(this, "teveolauncher"), bandwidthMeterA);

    extractorsFactory = new DefaultExtractorsFactory();

    DataSource.Factory udsf = new UdpDataSource.Factory() {
        @Override
        public DataSource createDataSource() {
            return new UdpDataSource(null, 3000, 100000);
        }
    };
    ExtractorsFactory tsExtractorFactory = new ExtractorsFactory() {
        @Override
        public Extractor[] createExtractors() {
            return new TsExtractor[]{new TsExtractor(MODE_SINGLE_PMT,
                    new TimestampAdjuster(0), new DefaultTsPayloadReaderFactory())};
        }
    };



    MediaSource videoSource = new ExtractorMediaSource
            (uri, udsf, tsExtractorFactory, null, null);

    player.setVideoSurfaceView(sufaceview);
    player.prepare(videoSource);
    player.setPlayWhenReady(true);

}

对于 HLS,我只需更改 MediaSource 和 datasourceFactory :
    DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this,
            Util.getUserAgent(this, "teveolauncher"), bandwidthMeterA);

    MediaSource videoSource = new HlsMediaSource
            (uri, dataSourceFactory, null, null);

我知道 ExoPlayer 不正式支持 Udpstreaming,但 UdpDataSource 类似乎运行良好。

在所有测试之后,我注意到像法国 DTT 这样的可变比特率的视频无法正确解码,但是对于像 Jell yfish 这样的恒定比特率视频,解码过程是完美的。

有一些编码改进可以使 VBR 视频正确解码?
提前谢谢你:)
对不起,我的英语不好 :)

最佳答案

    Uri uri = Uri.parse("udp://@239.192.2.2:1234");

我认为 UDP 不是一种协议(protocol)——它是一种传输方式(如 TCP)。您也不能使用 tcp://host:port/URL。

或者它有效吗?

关于Android Exoplayer 2 UDP 解码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43003648/

相关文章:

用于嵌入式触摸屏应用的 Android 与 Linux

linux - 电视 (TV) 视频实时像素级分析的建议

Python - 使用 ffplay 播放视频以更高分辨率显示文件

node.js - 无法将 UDP 发送回 NAT 后面的内部 PC

android - 使用 Android/Firebase 实时数据库时,Single.Create()...blockingGet() 在 RxJava 2.1.3 中挂起

android - 每 10 秒运行一次 AsyncTask 直到被取消

html - Chrome 在页面加载时同时下载 webm 和 mp4 HTML5 视频源

c - UDP - 多线程服务器无法区分 ack 消息和连接消息

Java UDP DatagramSocket 未收到 DatagramPacket

java - String 数组的 @StringDef 自定义注解