目前三个问题:
1.支持多路
—2.延时进度条减少时,花屏h264已解决 h265
—3.延时进度条拉大时,h264视频缓存不够,视频跟不上音频
–4.做成一个服务 改变分辨率和帧率,重启问题
–5.考虑正在码流探测时,停止推流的情况,码流探测可长时间阻塞
6.开始和结束推流配置文件会有。无推流时显示彩条
—8.支持port和-d输入
9分辨率和帧率可改
10出奇偶场 帧率和分辨率变换
–11内存泄露,释放掉多余的内存池 连接
12网络丢包带来的花屏,修改ffmpeg源码,模拟工具
汇聚延时2s 测试2M码流
抖动:sudo tc qdisc add dev enp1s0 root netem delay 1000ms 600ms
断流时长超过250ms 偶尔有马赛克
抖动:sudo tc qdisc add dev enp1s0 root netem delay 1000ms 500ms
断流时长250测试ing
sudo tc qdisc add dev enp1s0 root netem delay 200ms 50ms
sudo tc qdisc del dev enp1s0 root
ScheduledPlaybackHasStopped主要这个函数还没有被调用
kill -9不会回收资源
kill -15杀死TestPattern会回收socket资源
帧同步:sea,h264/265都有这个。
帧对齐:ref
tcp是握手,udp传输,所以检测的时候得重新建立一次连接才能检测到
sudo tcpdump -i enp7s0 -nnn tcp port 50000
传输丢包是只真实丢了的包
业务丢包是指传输过程中丢了的但又重传的包
没有预回滚,音频走不动,视频能走动
对于小的decklin卡
全* 0: one sub-device full-duplex
则0和1口可以采集和播放 3和4采集和播放都不行
0和1改为0: one sub-device full-duplex
2和3改为 1: two sub-devices half-duplex
则4个口全可以采集和播放
大的decklin卡应全部执行./ActivateProfile -d 0 -p 3
音频从1428000,开始到1529760(经过几秒),又从900000开始,视频直接从900000开始。
livepush给接收机推流的还有一个从背包收流的
i9 一路 top 90 华为盒子出1080i50 15M h265 28帧-47帧但是很稳定 ±1帧
i9 一路 top 90 华为盒子出1080p50 15M h265 57帧-97帧但是很稳定 ±2帧
i9 一路 top 90 华为盒子出720p50 15M h265 64帧-92帧但是很稳定 ±3帧
ps -aux | grep udp
/home/deviser/App-fusion/app/build
gdb recvd
r
ffmpeg -i ‘/home/yqw/下载/deviser.jpg’ -s 1920x1080 -pix_fmt uyvy422 deviser_yuv.yuv
ffplay -video_size 3840x2160 -pixel_format uyvy422 deviser_yuv_3840x2160.yuv
输入1280x720 用decklink可以播成1920x1080
1920x1080可以转换成2160x3840
但1280x720无法转换成2160x3840
[buffer @ 0x7f1e3cb0cb00] Unable to parse option value “0x0” as image size
[buffer @ 0x7f1e3cb0cb00] Unable to parse option value “0x0” as image size
[buffer @ 0x7f1e3cb0cb00] Error setting option video_size to value 0x0.
discardcorrupt加了这个之后,nobuffer没有明显效果了
—是这周完成的
h264第一帧是I帧 h265第一帧不一定是I帧
av_read_frame和av_format_open_input都是无限时间阻塞
配置环境
志强4路解码,线程10/20都不行,不均衡,导致单个线程个位数,视频解码跟不上,音视频不同步。存在内存泄露问题。
I9上线程10负载均衡
Gitee内存泄露,一下午变5个G了
[hevc @ 0x7faff41aa6c0] CABAC_MAX_BIN : 7
[hevc @ 0x7faff41aa6c0] The cu_qp_delta -1094995529 is outside the valid range [-26, 25].
avformat_find_stream_info特性:只有执行过av_format_open_input后才能执行,不能多次执行,除非avformat_close_input后,再次av_format_open_input后才能再次执行。
1080的12M,3840x2160 25M->36M
3840x2160p50 7M,无抖动情况,视频queue 30~50帧 音视频不同步
h265 1080p50 12M之前看看会不会卡顿
h265 2160x3840 36M之前看看会不会卡顿,做相应的处理
TestPattern_filter_no_30 两个按钮都没问题 看看抖动的问题 h264也有视频跟不上的问题,和最终版一样,最终版似乎是视频过大也是h264。
avcodec_send_packet() 多次发送 NULL 并不会导致解码器中缓存的帧丢失,使用 avcodec_flush_buffers() 可以立即丢掉解码器中缓存帧。因此播放完毕时应 avcodec_send_packet(NULL) 来取完缓存的帧,而 SEEK 操作或切换流时应调用 avcodec_flush_buffers() 来直接丢弃缓存帧
Prediction is not allowed in AAC-LC
1080p50 h265
第一帧视频进出编码器之间隔了8帧音频
视频编码器进10帧视频才开始出,音频不缓存
av_buffer_unref 内存泄露应该出现在这里,这个函数应该只能减引用不能销毁结构体空间
int av_packet_ref(AVPacket *dst, const AVPacket *src);
/*
对 packet 做拷贝操作,将 src 拷贝到 dst。
如果 src 是引用计数的,那么 dst 将会引用 src 中的数据,使其引用计数加 1 。
如果 src 不是引用计数的,那么会在 dst 中分配一个新的内存,然后将 src 中的数据拷贝过去。dst 其他的字段均拷贝自 src。
返回值:成功时返回0,失败时返回一个负数的AVERROR。
*/
AVPacket *av_packet_alloc(void);
/*
分配一个AVPacket结构体,并将其字段设置为默认值。分配生成的结构体必须使用 av_packet_free()释放。
返回值:成功返回一个AVPacket结构体,失败返回NULL
注意:这个函数仅分配AVPacket本身,并不包括其内部的数据缓存区。相关的数据缓存区必须通过其他的方式来分配,如 av_new_packet 函数。
*/
3840x2160 p50 h265 播放20分钟后自动崩掉
[hevc @ 0x7f36c010e140] Duplicate POC in a sequence: 116083.
[hevc @ 0x7f36c010e140] Error parsing NAL unit #2.
encode send error = -1094995529
@@@Invalid data found when processing input@@@
1080p50 h265 开启偶尔报错:
encode send error = -1094995529
@@@Invalid data found when processing input@@@
3840x2160
[hevc @ 0x2356a80] Could not find ref with POC 8
[hevc @ 0x2356a80] Could not find ref with POC 12
[hevc @ 0x2356a80] Could not find ref with POC 16
[hevc @ 0x2396440] The cu_qp_delta 73 is outside the valid range [-26, 25].
[decklink @ 0x23d3fc0] There are not enough buffered video frames. Video may misbehave!
[decklink @ 0x23d3fc0] There’s no buffered audio. Audio will misbehave!
[hevc @ 0x7f412815c540] The cu_qp_delta -32 is outside the valid range [-26, 25].
20000 400s 1080p50 TestPattern_17
Socio.1000
1080i50 1080i60有逐行
硬件方式:视频分辨率转换和视频编码方式转换会黑其他的不黑
码率改变不蹦
h265 8M 4k top
h264/1080p50 声音无延时 ffplay没有 视频还有些卡顿 考虑是主频问题
h265/1080p50 有延时
推流端停止推流
但TestPattern没有崩
推流端再启动后报错:
[hevc @ 0x7f05d4070e80] Duplicate POC in a sequence: 16422.
[hevc @ 0x7f05d4070e80] Error parsing NAL unit #2.
encode send error = -1094995529
@@@Invalid data found when processing input@@@//
[mpegts @ 0x7f77740027c0] PES packet size mismatch
[mpegts @ 0x7f77740027c0] Packet corrupt (stream = 1, dts = 84151592).
read_time:126
[h264 @ 0x7f7774022c00] error while decoding MB 64 29, bytestream -6
againV
read_time:3
[aac @ 0x7f777402e780] decode_band_types: Input buffer exhausted before END element found
@@@Invalid data found when processing input@@@
//这个是udp缓存的问题
Assertion desc failed at libswscale/swscale_internal.h:674
//这个是没收到流信息
-d 2
断音
udp中断报错
[h264 @ 0x7fd39c02e200] error while decoding MB 32 41, bytestream -7
[h264 @ 0x7fd39c02e200] concealing 3257 DC, 3257 AC, 3257 MV errors in I frame
av_read_frame返回值为-5 EIO打印日志为
@@@Input/output error@@@
//5min
/home/deviser/UHD4000R/livepush --config /home/deviser/UHD4000R/devices/0080000103/livepush.config --srcip 192.168.100.77 --srcport 25403 --dstip 192.168.100.78 --dstport 6017 --dev 1000012146 --magic 1180000103 --workmode 0 --type ipc --board-id -1 --url rtmp://192.168.100.150/live/gx1234
udp之前3.5s 2M时
udp之前6s 500K
用推mp4,一个半小时不崩
/home/deviser/UHD4000R/Receiver.sh &
[udp @ 0x7f7a340032c0] attempted to set receive buffer to size 104857600 but it only ended up set as 33554432
buffer_size=size
Set the maximum UDP socket buffer size in bytes.
fifo_size=units
Set the UDP receiving circular buffer size, expressed as a number of packets with size of 188 bytes. If not specified defaults to 7*4096.
overrun_nonfatal=1|0
Survive in case of UDP receiving circular buffer overrun. Default value is 0.
以上来自ffmpeg官方文档http://ffmpeg.org/ffmpeg-all.html
1080i50 9分钟13535~~13500 nobuffer如下:
URL = "udp://127.0.0.1:6017"; //URL = "srt://192.168.100.78:8080?streamid=live.sls.com/live/test"; AVDictionary *options = NULL; // ic->flags |= AVFMT_FLAG_NOBUFFER;//CODEC_FLAG_LOW_DELAY;AVIO_FLAG_NONBLOCK // ic->flags |= AVIO_FLAG_NONBLOCK; // ic->flags |= AVFMT_FLAG_NONBLOCK; // URLContext // av_dict_set_int(&options, "timeout", 6, 0); // av_dict_set(&options, "stimeout", "5", 0);//milliseconds av_dict_set(&options, "fflags", "nobuffer", 0); avformat_alloc_output_context2(&ic, 0, "mpegts", URL); int re = avformat_open_input(&ic, URL, NULL, &options);
1080i50 4分钟 6000~~6120
9分钟 13500~~13620
带音频睡眠 1080i50
15分钟 22500 ~~22500
20分钟 30027~~30000
用的下面配置
avcodec_register_all(); av_register_all(); avformat_network_init(); ic = avformat_alloc_context(); //URL = "srt://127.0.0.1:8080?streamid=live.sls.com/live/test1"; URL = "udp://127.0.0.1:6017"; AVDictionary *options = NULL; //ic->flags |= AVFMT_FLAG_NOBUFFER;//CODEC_FLAG_LOW_DELAY;AVIO_FLAG_NONBLOCK //ic->flags |= AVIO_FLAG_NONBLOCK; // ic->flags |= AVFMT_FLAG_NONBLOCK; // URLContext // av_dict_set_int(&options, "timeout", 6, 0); // av_dict_set(&options, "stimeout", "5", 0);//milliseconds // ic->flags |= AVFMT_FLAG_GENPTS; // ic->flags |= AVFMT_GENERIC_INDEX; // ic->max_index_size = 99; av_dict_set(&options, "buffer_size", "33554432", 0); av_dict_set(&options, "reuse", "1", 0); av_dict_set(&options, "fifo_size", "30554432", 0);//200Mb av_dict_set(&options, "max_delay", "2000000", 0); int re = avformat_open_input(&ic, URL, NULL, &options);