DV2020T 综合业务

//audio内存泄漏
//audio pts
//ENCInterface.h
//绿条
//没有设备时崩
//接口
//如何把硬件编码对接webrtc中
//video/audio开启或关闭
//码率分辨率帧率控制
//导播离开房间重进房间

退出房间重新进报NO device !!!

实时业务和综合业务都已经上传到svn,最后一天1.18号

账号异地登陆:当背包先登陆正常拉远端流播放时,手机点击房间后会先提醒有同名账号,确认进入后,背包正常播放远端的流,但导播端此账号状态被刷新成未连线状态,此时手机app也处于未连线状态,导播台点击连线,手机app进入房间,此时背包依然能播放远端流,手机app点击导播流小窗口后播放导播流,此时背包停止播放远端流。
当手机正常拉远端流播放时,背包登陆后手机app正常,背包点击进入房间后,手机app退出到进入房间界面,并提示“账号异地登陆”。
当手机点击进入房间后,导播未点击连线,此时背包点击进入房间,手机app退出到进入房间界面,同时提示。此时点击导播连线,背包正常拉流。
可见同一个账号在房间里是唯一的,先入的会被后入的顶掉。
网络中途断开socket.io重连,srs->close 重联成功srs->start
房间到期断开 parse_roomstop

webrtc音频增加HDMI和耳机音频的选项
webrtc视频增加SDI和HDMI的选项

4路背包,实时互动,在服务器合流,mcu架构。

采集两路1280x720 id:80

打包:
DV2020T/X86/trunk/install-libs/package-tools目录下:
sudo cp * /usr/local/bin/
在~/.bashrc

export PATH="$HOME/.local/bin:$PATH"
export PATH="/home/deviser/temp/Qt/5.12.0/gcc_64/bin:$PATH"
export LIB_PATH="/home/deviser/temp/Qt/5.12.0/gcc_64/lib:$LIB_PATH"
export PLUGIN_PATH="/home/deviser/temp/Qt/5.12.0/gcc_64/plugins:$PLUGIN_PATH"
export QML2_PATH="/home/deviser/temp/Qt/5.12.0/gcc_64/qml:$QML2_PATH"

source
将生成的AudioVideo 复制到/home/deviser/temp/DV2020T/release/trunk下
执行
build-upgrade-pack.sh后生成的包在upgrade-pkg中。

硬件编解码:
创建设备信息上下文
av_hwdevice_ctx_create(&device_ref, AV_HWDEVICE_TYPE_QSV,
“auto”, NULL, 0);
找到解码器:
avcodec_find_decoder_by_name(“mjpeg_qsv”);
设置解码像素格式
decodec_ctx->get_format = get_format;
申请空间,设置解码器设备信心上下文?
decodec_ctx->hw_device_ctx = av_buffer_ref(device_ref);
gpu->cpu
av_hwframe_transfer_data(sw_pframe, praw_frame, 0);

ffmpeg 5.0.2
–disable-x86asm --enable-vaapi --enable-libmfx --enable-gpl --enable-decoder=h264 --enable-shared --enable-swscale --enable-nonfree --enable-libfdk-aac --enable-libx265 --enable-libx264 --enable-libfdk-aac --enable-sdl2 --prefix=/usr/local

扫描二维码关注公众号,回复: 14559324 查看本文章

mediasdk:
/opt/intel/mediasdk

media-driver-intel-media-22.5.4-build:
/usr/local/include
/usr/local/lib

libva-utils-2.16.0-build:
/usr/local/bin

libva:
/usr/local/include
/usr/local/lib

gmmlib-intel-gmmlib-22.2.0:
/usr/local/include
/usr/local/lib

/sbin/ldconfig.real: /usr/local/lib/libva.so.2 不是符号链接

/sbin/ldconfig.real: /usr/local/lib/libigfxcmrt.so.7 不是符号链接

/sbin/ldconfig.real: /usr/local/lib/libva-wayland.so.2 不是符号链接

/sbin/ldconfig.real: /usr/local/lib/libva-x11.so.2 不是符号链接

/sbin/ldconfig.real: /usr/local/lib/libigdgmm.so.12 不是符号链接

sudo ln -sf /usr/local/lib/libva-drm.so.2 /usr/local/lib/libva-drm.so.2.1600.0
sudo ln -sf /usr/local/lib/libva.so.2 /usr/local/lib/libva.so.2.1600.0
sudo ln -sf /usr/local/lib/libva-x11.so.2 /usr/local/lib/libva-x11.so.2.1600.0
sudo ln -sf /usr/local/lib/libva-wayland.so.2 /usr/local/lib/libva-wayland.so.2.1600.0
sudo ln -sf /usr/local/lib/libigdgmm.so.12 /usr/local/lib/libigdgmm.so.12.2.0

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH

export LIBVA_DRIVER_NAME=iHD
export LIBVA_DRIVERS_PATH=/usr/local/lib/dri

export LD_LIBRARY_PATH=/opt/intel/mediasdk/lib: L D L I B R A R Y P A T H e x p o r t M F X H O M E = / o p t / i n t e l / m e d i a s d k / l i b / p k g c o n f i g e x p o r t P K G C O N F I G P A T H = / o p t / i n t e l / m e d i a s d k / l i b / p k g c o n f i g : LD_LIBRARY_PATH export MFX_HOME=/opt/intel/mediasdk/lib/pkgconfig export PKG_CONFIG_PATH=/opt/intel/mediasdk/lib/pkgconfig: LDLIBRARYPATHexportMFXHOME=/opt/intel/mediasdk/lib/pkgconfigexportPKGCONFIGPATH=/opt/intel/mediasdk/lib/pkgconfig:PKG_CONFIG_PATH

// av_hwframe_map在ffmpeg3.3以后才有,经过测试av_hwframe_transfer_data的耗时大概是av_hwframe_map的【1.5倍】

deprecated pixel format used, make sure you did set range correctly

av_hwframe_get_buffer函数用于从硬件帧中获取缓冲区,它可以用来获取解码器输出的硬件帧的像素数据,以便进行后续的处理。它也可以用来将解码器输出的硬件帧转换为可以用于编码器的缓冲区,以便将其转换为另一种格式。
av_hwframe_get_buffer
av_hwframe_transfer_get_formats是一个用于检索设备支持的格式列表的函数,它允许用户检查设备是否支持某种特定格式,以及支持哪些参数(如宽度,高度,编码格式,帧率等)。它还可以用于检查设备是否支持某种特定的硬件加速技术,以及设备是否支持某种特定的转码方案。
BT470BG是一种色度空间,它是由YUV格式的色度空间,其中Y代表亮度,U和V分别代表色度和饱和度。在ffplay中,可以使用“-colorspace bt470bg”参数来设置色度空间。

输入yuvj422p,输出nv12,下面这个设置的意义
AV_PIX_FMT_QSV与get_format

//软编解码的像素格式
encodec_ctx->sw_pix_fmt

av_frame_get_best_effort_timestamp

hw_frames_ctx是一个结构体,它用于表示硬件帧上下文,它用于管理硬件帧的分配和释放,以及访问硬件帧的视频帧的缓冲区。它还可以用于硬件解码和编码,因为它可以提供硬件缓冲区。
encoder_ctx->hw_frames_ctx = av_buffer_ref(decoder_ctx->hw_frames_ctx);//它可以把在gpu中解码出来的frame地址给编码器,不用再中间转换到cpu。

av_hwframe_ctx_alloc()为特定的硬件编码器或解码器分配一个硬件帧上下文。它可以用于硬件帧操作,例如转换,缩放或拷贝。它还可以用于设置硬件帧参数,例如缓冲大小,色彩空间等。
avctx->hw_frames_ctx = av_hwframe_ctx_alloc(decode->hw_device_ref);

av_hwframe_ctx_init函数是FFmpeg 5.0.2中的一个新增函数,它的作用是初始化硬件帧上下文,允许用户使用硬件帧。它接受一个AVHWFramesContext结构作为参数,用户可以在其中指定硬件帧的类型、宽度、高度和格式,以及其他一些参数。它还可以用来检查硬件帧的有效性,并且可以在使用硬件帧之前设置一些参数,以确保它们的正确使用。

// 创建硬件帧缓冲区
ret = av_hwframe_ctx_create(&frames_ctx, AV_HWDEVICE_TYPE_QSV,
NULL, NULL, 0);

AVHWFramesContext是ffmpeg中定义的一个结构体,用于描述硬件帧数据的内容和格式。它是一个抽象的接口,可以用于支持多种硬件加速框架,如Intel QSV,NVIDIA CUDA,OpenCL等。

AVCodecContext *codec_ctx;
AVQSVFramesContext *frames_ctx;
// 初始化AVQSVFramesContext
frames_ctx = av_qsv_frames_alloc(codec_ctx);

// 将AVQSVFramesContext绑定到AVCodecContext
ret = av_qsv_frames_bind_context(codec_ctx, frames_ctx);

// 将输入帧放入AVQSVFramesContext
av_qsv_frames_add(frames_ctx, frame);

// 调用编码器
ret = avcodec_encode_video2(codec_ctx, &packet, frame, &got_packet);

参考vaapi_transcode.c,不排除cpu gpu拷贝消耗cpu
/* we need to ref hw_frames_ctx of decoder to initialize encoder’s codec.
Only after we get a decoded frame, can we obtain its hw_frames_ctx */
encoder_ctx->hw_frames_ctx = av_buffer_ref(decoder_ctx->hw_frames_ctx);

用于查找硬件设备的类型,通过给定的硬件设备名称,可以查找到对应的硬件设备类型。
AVHWDeviceType *type = av_hwdevice_find_type_by_name(“qsv”);
int ret = av_hwdevice_ctx_create(&hw_device_ctx, type, NULL, NULL, 0);

它的第五个参数可以直接返回编码器的类型
int av_find_best_stream(AVFormatContext *ic,
enum AVMediaType type,
int wanted_stream_nb,
int related_stream,
const AVCodec **decoder_ret,
int flags);
avcodec_get_hw_config()函数用于获取编解码器的硬件配置,第二个参数index是索引,表示要获取的硬件配置的索引。由于一个编解码器可能有多个硬件配置,因此需要循环遍历来获取所有的硬件配置。

const char *av_hwdevice_get_type_name(enum AVHWDeviceType type);
av_hwdevice_get_type_name()函数用于获取硬件设备类型的名称,它是一个宏定义,参数是AVHWDeviceType类型,返回值是一个字符串,表示对应的硬件设备类型的名称。

AVHWDeviceType av_hwdevice_iterate_types函数用于遍历可用的硬件设备类型,并返回下一个可用的硬件设备类型。它接受一个参数prev,表示上一个可用的硬件设备类型,如果prev为AV_HWDEVICE_TYPE_NONE,则返回第一个可用的硬件设备类型。

AVCodecHWConfig 结构体
pix_fmt:硬件编码器支持的像素格式。
methods:描述硬件编码器的输入和输出类型的掩码。
device_type:硬件编码器所属的类型,例如 VDPAU 或 VAAPI。
使用 AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX 检查是否使用硬件设备上下文。

把硬件帧hwframe_ctx中的帧数据引用(不确定是否复制)给frame。
int av_hwframe_get_buffer(AVBufferRef *hwframe_ctx, AVFrame *frame, int flags);

AVBufferRef *av_hwframe_ctx_alloc(AVBufferRef *device_ctx);函数用于分配一个AVBufferRef,用于硬件帧的上下文。它的参数是一个指向硬件设备上下文的指针

av_hwframe_ctx_init()函数用于初始化AVBufferRef,它是FFmpeg中用于硬件加速的接口,它可以用于分配和释放硬件帧缓冲区,以及设置硬件帧上下文。

avcodec_reconfig_encoder()

猜你喜欢

转载自blog.csdn.net/weixin_43466192/article/details/128206851
dv