ffmedia是一个设计精良,使用简洁、优雅的很棒的框架,使用 enc模块遇到两个问题:
- rtsp推流时,使用vlc拉流黑屏无法显示图像,使用ffplay播放可以显示图像,但报错:[hevc @ 0x7f10093740] Could not find ref with POC 1997
- 保存视频文件不能实时写文件,只有退出时才把数据写入文件。如果不从enc取,改用vi直接取流,则可以实时写文件数据
综上现象,是否为编码模块没有正确处理分帧导致的问题,请指导如何解决,谢谢!
ffmedia是一个设计精良,使用简洁、优雅的很棒的框架,使用 enc模块遇到两个问题:
你是使用demo测试的吗?如果使用demo可以将使用命令及log粘贴出来,方便寻找问题。
最新版测试应该都没有以上问题。
本帖最后由 nboxcn 于 2024-2-27 16:34 编辑
大神 用的是demo 命令如下:
./demo /srv/src/yolo/video/JapanPPE.mp4 -e h265 -p 554 -s -m out.mp4
日志图片上传不了,我把文字复制过来
# ./demo /srv/src/yolo/video/JapanPPE.mp4 -e h265 -p 554 -s -m out.mp4
Firefly FFMedia: v2.2.3
INFO: ff_media: start_instance:
==========================================
INFO: ff_media: start_instance: enable file reader
INFO: 16ModuleFileReader: init: Get Video Resolution( 640 x 360 )
INFO: rtsp_server: rtsp_new_demo: rtsp server demo starting on port 554
INFO: ff_media: start_instance:
Start push stream: rtsp://LocalIpAddr:554/live/0
INFO: ff_media: start_instance:
Input Source: /srv/src/yolo/video/JapanPPE.mp4
Input format: 640x360 H264
Output format: 640x360 NV12
Encode type: H265
Decoder: enable
Rga: disable
Encoder: enable
RtspClient: disable
File writer: out.mp4
File: disable
Rtsp push: 554
==================Pipe===================
ModuleFileReader (H264 640x360)
|--->ModuleMppDec (NV12 640x360)
|--->ModuleMppEnc (H265 640x360)
|--->ModuleFileWriter (Unknow V4L2 Format 0x0)
|--->ModuleRtspServer (Unknow V4L2 Format 0x0)
INFO: 10MppDecoder: getTimeoutSample: 0x5574d588e0 frame info changed 1 error 0 discard 0
INFO: rtsp_server: rtsp_new_client_connection: new rtsp client 192.168.10.101:58301 comming
INFO: rtsp_server: rtsp_new_rtp_connection: new rtp over udp for video ssrc:22345678 local_port:49152-49153 peer_addr:192.168.10.101 peer_port:54938-54939
INFO: 16ModuleFileReader: work: Produce EOS
ERROR: 16ModuleFileWriter: work: wait for productor ModuleMppEnc timeout
rknpu2的demo里面所有mpp encode写文件区分第一帧写头信息,不知道有没有参考价值
// Encode to file
// Write header on first frame
if (frame_index == 1) {
enc_data_size = ctx->encoder->GetHeader(enc_data, enc_buf_size);
fwrite(enc_data, 1, enc_data_size, ctx->out_fp);
}
memset(enc_data, 0, enc_buf_size);
enc_data_size = ctx->encoder->Encode(mpp_frame, enc_data, enc_buf_size);
fwrite(enc_data, 1, enc_data_size, ctx->out_fp);
nboxcn 发表于 2024-2-27 16:58
rknpu2的demo里面所有mpp encode写文件区分第一帧写头信息,不知道有没有参考价值
不是这个问题。裸流如果没有参数集,ffmpeg一样解不出来。你可以在板子安装vlc看他能不能拉流,如果能拉,可能是防火墙限制,如果是防火墙限制,可以使用tcp协议连接,rtsp推流支持rcp和udp协议。
保存文件不是实时问题:你可以另开终端查看文件大小,看是不是在增加。也可以边看(-x 或 -d 0)边封装文件, 在中途Ctrl C 掉程序,在使用demo或ffplay播放该文件是不是到你杀掉程序那一帧
自己写了个demo测试:
nboxcn 发表于 2024-2-28 08:17
自己写了个demo测试:
- 如果直接从srouce->rtsp/writer则可以vlc播放以及实时写文件,能实时看到文件大 …
文件写入模块不依赖任何东西,有数据就会被及时即时写入,从你的描述看似乎是解码或编码模块没有产生数据。如果可以,你复现出这种现象,然后等几秒中,按q键退出demo,会将每个模块处理的帧数打印出来,便可看到是哪个模块不生产数据。
文件读入模块如果变成EOS状态,也就是打印Produce EOS,说明已经读到末尾,你可以添加-l 参数来循环读取,让文件读取模块一直生产数据。
按q后的日志如下:
./demo /srv/src/yolo/video/JapanPPE.mp4 -e h265 -p 554 -s -m out.mp4
Firefly FFMedia: v2.2.3
INFO: ff_media: start_instance:
==========================================
INFO: ff_media: start_instance: enable file reader
INFO: 16ModuleFileReader: init: Get Video Resolution( 640 x 360 )
INFO: rtsp_server: rtsp_new_demo: rtsp server demo starting on port 554
INFO: ff_media: start_instance:
Start push stream: rtsp://LocalIpAddr:554/live/0
INFO: ff_media: start_instance:
Input Source: /srv/src/yolo/video/JapanPPE.mp4
Input format: 640x360 H264
Output format: 640x360 NV12
Encode type: H265
Decoder: enable
Rga: disable
Encoder: enable
RtspClient: disable
File writer: out.mp4
File: disable
Rtsp push: 554
==================Pipe===================
ModuleFileReader (H264 640x360)
|--->ModuleMppDec (NV12 640x360)
|--->ModuleMppEnc (H265 640x360)
|--->ModuleFileWriter (Unknow V4L2 Format 0x0)
|--->ModuleRtspServer (Unknow V4L2 Format 0x0)
INFO: 10MppDecoder: getTimeoutSample: 0x55b4b8c8e0 frame info changed 1 error 0 discard 0
==================Summary================
ModuleFileReader (In Full: 0, Out Empty: 23)
|--->ModuleMppDec (In Full: 264, Out Empty: 1)
|--->ModuleMppEnc (In Full: 10, Out Empty: 244)
|--->ModuleFileWriter (In Full: 0, Out Empty: 0)
|--->ModuleRtspServer (In Full: 229, Out Empty: 0)
dengkx 发表于 2024-2-28 09:10
文件写入模块不依赖任何东西,有数据就会被及时即时写入,从你的描述看似乎是解码或编码模块没有产生数据 …
我使用h264格式视频只进行推流,vlc拉取也是黑屏,可能是rtsp服务器这部分有点问题
wx__AxJ5zO 发表于 2024-3-5 14:59
我使用h264格式视频只进行推流,vlc拉取也是黑屏,可能是rtsp服务器这部分有点问题
拉最新v2.2.4代码,可以使用本地文件编码h264或h265推rtsp流测试:
./demo xxx.mp4 -e h264 -l -s -p 554
pc拉流使用ffplay或vlc等其他工具拉流, 如果拉流失败可能防火墙限制,可更改tcp协议尝试拉流:
ffplay rtsp://xxx -rtsp_transport tcp
本帖最后由 wx__AxJ5zO 于 2024-3-5 16:22 编辑
dengkx 发表于 2024-3-5 15:20
拉最新v2.2.4代码,可以使用本地文件编码h264或h265推rtsp流测试:
./demo xxx.mp4 -e h264 -l -s -p 5 …
root@firefly:/home/firefly/demo/ff# python3 demo.py -i /home/firefly/demo/ff/1.mp4 -e 0 -l -p 554
Firefly FFMedia: v2.2.4
input source is a regular file.
INFO: 16ModuleFileReader: init: Get Video Resolution( 1280 x 720 )
mpp[18612]: mpp_rt: NOT found ion allocator
mpp[18612]: mpp_rt: found drm allocator
mpp[18612]: mpp_info: mpp version: 49f29006 author: Jeffy Chen 2021-08-04 [drm]: Add mmap flag detection
mpp[18612]: mpp_info: mpp version: 49f29006 author: Jeffy Chen 2021-08-04 [drm]: Add mmap flag detection
mpp[18612]: mpp_enc: MPP_ENC_SET_RC_CFG bps 2048000 [1920000 : 2176000] fps [30:30] gop 60
mpp[18612]: mpp_enc: send header for set cfg change rc_mode/fps/gop
mpp[18612]: mpp_enc: mode cbr bps [1920000:2048000:2176000] fps fix [30/1] -> fix [30/1] gop i [60] v [0]
INFO: rtsp_server: rtsp_new_demo: rtsp server demo starting on port 554
==================Pipe===================
ModuleFileReader (H264 1280x720)
|--->ModuleMppDec (NV12 1280x720)
|--->ModuleMppEnc (H264 1280x720)
|--->ModuleRtspServer (Unknow V4L2 Format 0x0)
wait...INFO: 10MppDecoder: getTimeoutSample: 0x98439a0 frame info changed 1 error 0 discard 0
INFO: rtsp_server: rtsp_new_client_connection: new rtsp client 192.168.1.5:51540 comming
INFO: rtsp_server: rtsp_new_rtp_connection: new rtp over udp for video ssrc:22345678 local_port:49152-49153 peer_addr:192.168.1.5 peer_port:51820-5182
ffplay rtsp://192.168.1.35:554/live/0 -rtsp_transport tcp 无画面,输出信息如下
Input #0, rtsp, from 'rtsp://192.168.1.35:554/live/0': 0B f=0/0
Metadata:
title : rtsp_demo
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0:0: Video: h264 (High), yuv420p(progressive), 1280x720, 30 fps, 30 tbr, 90k tbn
nan M-V: nan fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
使用MP4及H264推流后,vlc拉流仍然黑屏,
报错有 Unknow V4L2 Format 0x0
本帖最后由 nboxcn 于 2024-3-6 13:59 编辑
2.2.4版本与2.2.3差不多,只要是用encode编码后推流vlc就没有图像黑屏,使用ffplay播放花屏,无论是从推理后的的rga进行encode还是直接从decode出来的进行encode,ffplay播都花屏且vlc黑屏
#./demo /srv/src/yolo/video/JapanPPE.mp4 -e h264 -l -s -p 554
Firefly FFMedia: v2.2.4
INFO: ff_media: start_instance:
==========================================
INFO: ff_media: start_instance: enable file reader
INFO: 16ModuleFileReader: init: Get Video Resolution( 640 x 360 )
INFO: rtsp_server: rtsp_new_demo: rtsp server demo starting on port 554
INFO: ff_media: start_instance:
Start push stream: rtsp://LocalIpAddr:554/live/0
INFO: ff_media: start_instance:
Input Source: /srv/src/yolo/video/JapanPPE.mp4
Input format: 640x360 H264
Output format: 640x360 NV12
Encode type: H264
Decoder: enable
Rga: disable
Encoder: enable
RtspClient: disable
File writer: disable
File: disable
Rtsp push: 554
==================Pipe===================
ModuleFileReader (H264 640x360)
|--->ModuleMppDec (NV12 640x360)
|--->ModuleMppEnc (H264 640x360)
|--->ModuleRtspServer (Unknow V4L2 Format 0x0)
INFO: 10MppDecoder: getTimeoutSample: 0x557df2eea0 frame info changed 1 error 0 discard 0
INFO: rtsp_server: rtsp_new_client_connection: new rtsp client 192.168.10.151:44172 comming
INFO: rtsp_server: rtsp_new_rtp_connection: new rtp over udp for video ssrc:22345678 local_port:49152-49153 peer_addr:192.168.10.151 peer_port:20450-20451
请问enc编码模块的问题还有解吗?无论是推流还是保存文件,只要使用了enc的模块都异常,如何能单独测编码模块是否能正常进行编码输出?谢谢
nboxcn 发表于 2024-3-12 17:25
请问enc编码模块的问题还有解吗?无论是推流还是保存文件,只要使用了enc的模块都异常,如何能单独测编码模 …
编码模块设置回调,在回调函数里打印数据看看
谢谢,不太会看那些数据,用VLC看播放有分流数据、有内容码率,但是没有音频、视频的解码数据、帧数据,跟设备的MPP、RGA版本有没有关系,会不会是那些版本太低的原因?
wx__AxJ5zO 发表于 2024-3-5 15:56
ffplay rtsp://192.168.1.35:554/live/0 -rtsp_transport tcp 无画面,输出信息如下
已复现,这个问题应该是不同平台编码器差异导致的,下个版本会修复该问题。
dengkx 发表于 2024-3-15 10:38
已复现,这个问题应该是不同平台编码器差异导致的,下个版本会修复该问题。
好的
太棒了,期待!这个问题的修复应该同时解决编码后的推流及写文件的问题吧
简单的处理就是把编码模块默认gop参数更改为其他就可以了。
— a/demo/demo.cpp
+++ b/demo/demo.cpp
@@ -545,7 +545,7 @@ SOURCE_CREATED:
#endif
if (inst_conf->enc_enabled) {
shared_ptr<ModuleMppEnc> enc = make_shared<ModuleMppEnc>(inst_conf->encode_type);
shared_ptr<ModuleMppEnc> enc = make_shared<ModuleMppEnc>(inst_conf->encode_type, 30, 30);
enc->setProductor(inst->last_module);
enc->setBufferCount(8);
enc->setDuration(0); // Use the input source timestamp
本帖最后由 nboxcn 于 2024-3-19 18:07 编辑
刚测试了一下,还真行,太神奇了,很棒,文件也可以实时写了!
大神,请教一下,如果是重RGA用的是 output_para.v4l2Fmt = V4L2_PIX_FMT_BGR24; 编码,给到enc模型编码后rtsp推流,出来的图像好奇怪,有3个重影的花屏,似乎图像格式不正确,应该如何转换?谢谢