综合。。。。

互动:remote1280x720,local:1440x810,id:30,local无法设计成1920x1080,会自动调整为1440x810。
AVencoder编码
//1080p50 id:70 gpu:75 1080p60 id:60 gpu:75
//1080p60 id:70 gpu:45 1080p50 id:75 gpu:33
ffmpeg命令编码
//ffmpeg -video_size 1920x1080 -pixel_format nv12 -framerate 60 -c:v mjpeg_qsv -i /dev/video2 -c:v h264_qsv -pixel_format nv12 -f mpegts udp://127.0.0.1:6017
//ffmpeg -video_size 1920x1080 -pixel_format nv12 -framerate 60 -c:v mjpeg_qsv -i /dev/video0 -f null -

#Fatal error in: …/…/rtc_base/task_queue_libevent.cc, line 172
#last system error: 24
#Check failed: pipe(fds) == 0
#Aborted

//网速慢的时候,一直处于连线中,这时候如果挂断或返回,就会崩,因为返回后会delete interface,但socket.io还在循环使用对象。
//断网退出崩
//一夜不在房间 OK
//264–》264–》推流后不同步
在这里插入代码片//audio内存泄漏
//audio pts
//ENCInterface.h
//绿条
//没有设备时崩
//接口
//如何把硬件编码对接webrtc中
//video/audio开启或关闭
//码率分辨率帧率控制
//导播离开房间重进房间
网络中途断开socket.io重连,srs->close 重联成功srs->start
264时解码或编码器有时打不开
//第二次点击连线,退流不上去的问题
互动1080采集到是粉色,推出去也是粉色
HRD
HDR
SEI加入时间戳
加入台标
导切

//从互动切回综合audio busy
为什么从互动业务切到综合业务慢:
因为关闭socket.io是同步的,大约2s,因此delete Interface对象得等关闭完成后才能delete。webrtc的音频是独占的,因此需要delete Interface完成后才能,启用综合业务。
如果不用delete Interface,socket.io就可以使用异步模式,但这样会出现音频设备占用的问题,因此需要close内存,现在已经改了一版可以试试。第二种方法,是退出房间后delete conduct。进入房间后new,这样就释放干净了,但这样会导致进入房间比较慢。

现在测试4k-YUAN的用自带的小风扇外挂后依然发热严重,严重时无法用命令切换源。没有发现其他问题。
400-YUAN外挂后没有小风扇,发热程度不影响使用。
reset影响的问题,4k不受影响;400退出登录,拔掉拓展usb后没问题。

connect 为特殊事件,当客户端连接后自动执行
disconnect 为特殊事件,当客户端断开连接后自动执行
connect、disconnect与自定义事件处理方法的函数传入参数不同

alsa_input.usb-MACROSILICON_USB_Video-02.iec958-stereo
alsa_input.usb-MACROSILICON_USB_Video-02.2.iec958-stereo

加flush(),花屏但是不卡,不加flush(),花屏且卡。
buffer_size小了,会花屏,花屏只跟它有关。
1080p30什么都不设置CBR,7M时很稳,但稳定在8M,花屏和卡顿暂未看。11M时稳定在12.5M。0.5M小不起作用。5M和4M稳定在5.5M,4.5M。
1080p30 设置最大+500kb,CBR,7M时稳定在8M。11M稳定在12.5M,但在此之前有比较高的波动。4M时,稳定在4.5M。0.5M在2M稳定。没有卡顿花屏。

半屏幕和重影:两个同时输入,kill后启动默认1080p30,hdmi电视盒子1080p60和sdi i50输入。hdmi:半屏,sdi:重影,两者都是1280x1440p30。连续5次kill,启动后都是这个现象。
拔下sdi输入,留hdmi,连续4次正常。拔下hdmi,留sdi,连续6次hdmi:半屏,sdi:重影,两者都是1280x1440p30。
720p60和1080p30互切,有时720p60时,hdmi,udp播出1080p60,会半屏,且上半屏重影,sdi,udp播出1080p60,但正常。

关于综合业务没有声音:
在root用户下执行
usermod -a -G pulse-access root
gpasswd -a root pulse
gpasswd -a root pulse-access
nohup pulseaudio --system &
0.双空采集棒,N6000裸机
1.执行完AudioVideoStart.sh中的四句后,不带sudo -S,测试得以下2-6结论
2.video0有声音,video2没有声音
3.在root终端,ffplay播放,耳机均听不到声音,但video0有音刷,video2音刷很特别,如果不给video2接入信号,这个特别的音刷也没有。推流到管控平台,video0声音正常,video2没有声音。
4.插拔采集棒,两个都恢复正常。
5.多次测试发现video0,一直是正常的,video2有概率出问题。
6.当音频正常时,通过AudioVideo推个6017,在deviser用户下,ffplay播放6017,耳机是能听到声音的。在deviser目录下执行ffplay -f alsa sysdefault:CARD=Video_1,能正常播放,并且耳机能听到声音。

ALSA lib pcm_dsnoop.c:566:(snd_pcm_dsnoop_open) unable to open slave
[alsa @ 0x3b6a0b5d5800] cannot open audio device sysdefault:CARD=MS2109_1 (Device or resource busy)

root下执行
echo “hotdog” | sudo -S usermod -a -G pulse-access root
echo “hotdog” | sudo -S gpasswd -a root pulse
echo “hotdog” | sudo -S gpasswd -a root pulse-access
echo “hotdog” | nohup sudo -S pulseaudio --system &
这种情况下,发现video0/video2都正常音刷,但是AudioVideo不走音频编码线程。

手套样机:
开机杀死自启动AudioVideo,然后在root下执行ffplay,sdi口无音刷,hdmi有音刷。连续三次这样。
第四,五次,启动四句,但不自启动AudioVidoe也是如此,说明跟应用程序无关。
这种情况下,deviser终端下,ffplay权限不足。把自启动的pulseaudio全杀死后,两者在deviser播放都不需要权限,但还是只有hdmi有,在root下无法播放了。
将四句和AudioVideo都关闭,开机在deviser下,ffplay,hdmi有,sdi音刷。

综合业务:分辨率帧率实时改变
webrtc音频增加HDMI和耳机音频的选项 只用HDMI
优先级最高的两个:
webrtc视频增加SDI和HDMI的选项
互动业务出1080i50
点击断开连线,崩,因为index的原因
root下,ffplay有时播放出出来声音

加入睡眠后连续切换分辨率报错:
[video4linux2,v4l2 @ 0x5f80a8f6000] Some buffers are still owned by the caller on close.
[video4linux2,v4l2 @ 0x5f80a8f6000] Some buffers are still owned by the caller on close.

0080099100002146
/home/deviser/temp/DV2020T/X86/trunk/apps/src/common/WindowsCommon.cpp

房间到期断开 parse_roomstop
//账号异地登陆:
当背包先登陆正常拉远端流播放时,手机点击房间后会先提醒有同名账号,确认进入后,背包正常播放远端的流,但导播端此账号状态被刷新成未连线状态,此时手机app也处于未连线状态,导播台点击连线,手机app进入房间,此时背包依然能播放远端流,手机app点击导播流小窗口后播放导播流,此时背包停止播放远端流。
当手机正常拉远端流播放时,背包登陆后手机app正常,背包点击进入房间后,手机app退出到进入房间界面,并提示“账号异地登陆”。
当手机点击进入房间后,导播未点击连线,此时背包点击进入房间,手机app退出到进入房间界面,同时提示。此时点击导播连线,背包正常拉流。
可见同一个账号在房间里是唯一的,先入的会被后入的顶掉。
//
hw_decoder_init 在example/hw_decode.c
4路背包,实时互动,在服务器合流,mcu架构。
实时业务和综合业务都已经上传到svn,最后一天1.18号

采集两路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

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()

sudo apt-get install libglib2.0-dev
sudo apt-get install libgl1-mesa-dev libglu1-mesa-dev
sudo apt-get install mesa-common-dev

测试N6000:
AudioVideo 1920x1080,mjpeg->qsv_264 30帧 3M id:50%
ffmpeg -re -c:v h264_qsv -i westlife_1080.mp4 -r 30 -c:v h264_qsv -b:v 3M westlife_1080_264_1.mp4 id:30%

DV2020T/X86/trunk/apps/include/common/UiParamCfgAl.h
#define ENABLE_PULL_VIDEO_STREAMS 0

5times ok 2023/3/6 综合实时切换后也没问题

三种分辨率没问题
sdi/hdmi切换没问题,还有硬件要reset。

jiemain kazhu
ALSA lib pcm_dsnoop.c:566:(snd_pcm_dsnoop_open) unable to open slave
[alsa @ 0x28f803d1d400] cannot open audio device sysdefault:CARD=MS2109_1 (Device or resource busy)
无法打开输入流audio2

从720切换到1920x1080p30时出现,视频问题,因该是分辨率问题,颜色没问题。因为拉的流是1280x1440。6015播放也是1280x1440。
切换分辨率后,推流出来的视频是没有声音的,out.es也没有声音。udp6017有声音。

发现一个音频与前一阵突增1.7s,因此视频一直往外发,这一阵音频一直等着,直到视频的pts跟上这帧音频,然后发送出去这帧音频,之后再取这帧音频的下一帧音频。

720和1080的音频+50ms,38分钟,同步,过了5分钟,再听两个分辨率下,音频都滞后。
关于字的黑点,localYUV.yuv是没有的,说明Qt渲染有问题。编码推流出去有,说明编码有问题。
关于音柱颜色,localYUV.yuv正常,说明Qt渲染有问题,编码推流出去有问题,说明编码有问题。
关于跳动,推流出去的跳动,可能是输入源和输出源帧率不同,或者输入源是i的问题。

在这里插入图片描述启动后在综合业务,没有推流,内存占用从1.2g,升到2.1g,但是报错webrtc的错误。
在这里插入图片描述
单独运行AVencoder,发现占用内存从1.2g一直上涨,87分钟后涨到3.1g,free一直下降,当下降到150kb时,开始持续从buff/cache中释放内存,此时free维持在150kb,但AVencoder内存占用继续上涨。判定AVencoder内存泄漏导致AudioVideo 90分钟崩。但在综合业务界面发现webrtc在申请内存,猜测是上层调用问题。

4k板块,只能采集一路,如果同时采集两路会降帧率,因为nv12数据量过大。

4k采集卡,一路采集nv12硬件编264/265,id:80,gpu_id:占60

ffmpeg -video_size 3840x2160 -pix_fmt nv12 -framerate 30  -i /dev/video6 -c:v h264_qsv -f mpegts udp://127.0.0.1:6015

4k采集卡,一路渲染,id:80,gpu_id_3D:占20

ffplay -video_size 3840x2160 -pix_fmt nv12 -framerate 30 -i /dev/video4

4k采集卡,一路采集编码+一路渲染 id:80,gpu_id_3D:6 gpu_id:56
不过此时一路采集编码,采集速度只有16帧了。

ffmpeg -video_size 3840x2160 -pix_fmt nv12 -framerate 30  -i /dev/video6 -c:v h264_qsv -f mpegts udp://127.0.0.1:6015
ffplay -video_size 3840x2160 -pix_fmt nv12 -framerate 30 -i /dev/video4

/opt/dv2020t/Trasn…
192.168.100.105//内网地质
111.160.79.83//外网地址

enable enablekeyboard

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

、、、、燕庆伟、、、、

分享对你有帮助,打赏一下吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值