搭建带货直播源码时,是怎样获取视频源数据的?

场景

开发者因为带货直播源码的需要,希望能获取到视频画面的原始数据(YUV 数据),然后再进行处理或渲染。

解决方案

1、实现 TXLivePushListener 接口,然后在onPlayEvent(int event, Bundle param) 方法中,监听TXLiveConstants.PLAY_EVT_CHANGE_RESOLUTION 事件

mLivePusher.setPushListener(this);

public void onPlayEvent(int event, Bundle param) {
    //...
    if (event == TXLiveConstants.PLAY_EVT_CHANGE_RESOLUTION) {
        //获取视频的宽高
        int width = param.getInt(TXLiveConstants.EVT_PARAM1, 0);
        int height = param.getInt(TXLiveConstants.EVT_PARAM2, 0);
        if (width != 0 && height != 0 && !mHWDecode) {
            //创建存储 yuv 数据的 buffer,目前输出的 yuv 格式为 I420
            byte[] buf = new byte[width * height * 3 / 2];
            //将 buffer 设置进 mLivePlaye
            mLivePlayer.addVideoRawData(buf);
        }
    }
}

2、通过 VideoRawDataListener 获取 带货直播源码的YUV 数据

mLivePlayer.setVideoRawDataListener(rawDataListener);

TXVideoRawDataObserver.ITXVideoRawDataListener rawDataListener = new
TXVideoRawDataObserver.ITXVideoRawDataListener() {
    @Override
    public void onVideoRawDataAvailable(byte[] buf, int width, int height, int timestamp) {
        //解码一帧后的数据回调,buf 中存放了 yuv 数据,格式为 I420
        if (!mHWDecode) {
            // 如果需要继续获取yuv数据,需要重新调用addVideoRawData方法
            // yuvBuffer大小应该等于视频width*height*3/2
            mLivePlayer.addVideoRawData(buf);
        }
    }
};

原理

软件解码是由CPU负责解码,然后进行播放。这种方式解码出来的画面数据格式是 YUV 数据。而硬件解码是使用显卡进行解码,需要使用 OpenGL进行解码,所以解码出来的画面数据格式 Texture。

注意事项

1、setVideoRawDataListener只支持软件解码。

2、只能获取带货直播源码直播场景下的 YUV 数据,不支持点播场景。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值