Firefly开源社区

标题: ffmedia模块ModuleFileWriter写的视频文件没有按原视频的fps [打印本页]

作者: nboxcn    时间: 2024-3-6 15:35
标题: ffmedia模块ModuleFileWriter写的视频文件没有按原视频的fps
ffmedia v2.2.4版本的ModuleFileWriter模块,写的视频文件没有按原视频的fps,播放的时候帧率跳得非常快,没法控制

作者: nboxcn    时间: 2024-3-7 10:30
本帖最后由 nboxcn 于 2024-3-7 10:32 编辑

写视频文件,跑不到一天一夜就crash崩溃,总体文件不到10G,每个文件不大于20M进行分割,磁盘剩余空间还有很多,存储盘为固态SSD盘,错误信息


  1. ERROR: 17DynamicFileWriter: work: Consume failed
  2. WARN: ff_media: encode: Fail to handle media data: -2
  3. ERROR: 17DynamicFileWriter: work: Consume failed
  4. WARN: ff_media: encode: Fail to handle media data: -2
  5. ERROR: 17DynamicFileWriter: work: Consume failed
  6. WARN: ff_media: encode: Fail to handle media data: -2
  7. ERROR: 17DynamicFileWriter: work: Consume failed
  8. WARN: ff_media: encode: Fail to handle media data: -2
  9. ERROR: 17DynamicFileWriter: work: Consume failed
  10. Segmentation fault (core dumped)
复制代码

作者: dengkx    时间: 2024-3-7 11:11
nboxcn 发表于 2024-3-7 10:30
写视频文件,跑不到一天一夜就crash崩溃,总体文件不到10G,每个文件不大于20M进行分割,磁盘剩余空间还有 ...

1. 这个错误不影响,changeFileName之后,如果第一帧没有参数集(sps、pps等),会封装失败丢弃该帧,直到参数集到来,编码模块默认gop是60,也就是间隔59帧才有i帧带参数集来。
2. 段错误可以使用gdb查看core文件定位引发core dump的函数或某一行。

作者: nboxcn    时间: 2024-3-7 17:01
好的,感谢大神!
作者: nboxcn    时间: 2024-3-22 19:17
本帖最后由 nboxcn 于 2024-3-23 14:03 编辑

目标是想实现自动录制10秒的视频文件,使用ModuleFileWriter写视频文件,10秒后自动停止,单使用了stop()后就会出错,并导致程序异常变慢,最终会crash并自动重启系统,报错信息

  1. INFO: 10MppDecoder: getTimeoutSample: 0x559d447e40 frame info changed 0 error 1 discard 0
  2. ERROR: 10RTSPClient: postRecvBuf: wait for client to post recv buffer time out
  3. ERROR: 10RTSPClient: postRecvBuf: wait for client to post recv buffer time out
  4. WARN: 12ModuleMppEnc: waitAllForConsume: wait for consumer ModuleFileWriter [0] timeout
  5. WARN: 12ModuleMppEnc: waitAllForConsume: ModuleFileWriter lost a frame
  6. WARN: 12ModuleMppEnc: waitAllForConsume: input queue empty: 0
  7. WARN: 9ModuleRga: waitAllForConsume: wait for consumer ModuleMppEnc [0] timeout
  8. WARN: 9ModuleRga: waitAllForConsume: ModuleMppEnc lost a frame
  9. WARN: 9ModuleRga: waitAllForConsume: input queue empty: 0
  10. ERROR: 9ModuleRga: work: wait for productor ModuleMppDec timeout
  11. WARN: 16ModuleRtspClient: waitAllForConsume: wait for consumer ModuleMppDec [0] timeout
  12. WARN: 16ModuleRtspClient: waitAllForConsume: ModuleMppDec lost a frame
  13. WARN: 16ModuleRtspClient: waitAllForConsume: input queue empty: 0
  14. INFO: ff_media: processNextPacket: pt: 96, rtp sequence error: 29703, prev: 29700
  15. ERROR: 19ModuleRendererVideo: work: wait for productor ModuleRga timeout
  16. INFO: 10MppDecoder: getTimeoutSample: 0x559d447e40 frame info changed 0 error 1
复制代码

如果新建一个子类,使用restart()修改文件名,则可以继续进行,但是也要一直写文件才行,如果使用了stop()还是会报上面的错误,最终导致系统错误重启,是否要把source层先stop()后,再把FileWriter层stop()并start() source层,是需要那样使用吗?请指教正确的使用方法,谢谢!
作者: nboxcn    时间: 2024-3-23 14:06
本帖最后由 nboxcn 于 2024-3-23 14:39 编辑

另外,如果用FileWriter写视频软件,内容来自rga层那么就会丢失fps,写出来的视频文件就不是按原来的fps播放,以极快的速度播放,加file_writer->setSynchronize(make_shared<Synchronize>(SynchronizeType(SYNCHRONIZETYPE_VIDEO))); 也不奏效,应该如何处理?谢谢!
编码大概如下:
  1.     input_para = dec->getOutputImagePara();
  2.     output_para = input_para;
  3.     output_para.width = input_para.width;
  4.     output_para.height = input_para.height;
  5.     output_para.hstride = output_para.width;
  6.     output_para.vstride = output_para.height;
  7.     output_para.v4l2Fmt = V4L2_PIX_FMT_NV12;
  8.     shared_ptr<ModuleRga> rga2 = make_shared<ModuleRga>(output_para, RGA_ROTATE_NONE);
  9.     // The producer of the rga module is the same as the inference module producer.
  10.     rga2->setProductor(rga);
  11.     ret = rga2->init();
  12.     if (ret < 0) {
  13.         ff_error("rga init failed\n");
  14.     }

  15.     // // 2.3 encode
  16.     input_para = rga2->getOutputImagePara();
  17.     shared_ptr<ModuleMppEnc> enc = make_shared<ModuleMppEnc>(ENCODE_TYPE_H265, input_para, 30, 30);
  18.     enc->setProductor(rga2);
  19.     enc->setBufferCount(8);
  20.     enc->setDuration(0);  // Use the input source timestamp
  21.     ret = enc->init();
  22.     if (ret < 0) {
  23.         ff_error("Enc init failed\n");
  24.     }
  25.     // write file
  26.     file_writer = make_shared<ModuleFileWriter>("/srv/src/storage/out.mp4");
  27.     file_writer->setProductor(enc);
  28.     ret = file_writer->init();
  29.     if (ret < 0) {
  30.         ff_error("ModuleFileWriter init failed\n");
  31.     }
复制代码


出错信息如下:
  1. WARN: 12ModuleMppEnc: waitAllForConsume: wait for consumer ModuleFileWriter [0] timeout
  2. WARN: 12ModuleMppEnc: waitAllForConsume: ModuleFileWriter lost a frame
  3. WARN: 12ModuleMppEnc: waitAllForConsume: input queue empty: 0
  4. ERROR: 16ModuleRtspServer: work: wait for productor ModuleMppEnc timeout
  5. WARN: 9ModuleRga: waitAllForConsume: wait for consumer ModuleMppEnc [0] timeout
  6. WARN: 9ModuleRga: waitAllForConsume: ModuleMppEnc lost a frame
  7. WARN: 9ModuleRga: waitAllForConsume: input queue empty: 0
  8. WARN: 16ModuleFileReader: waitAllForConsume: wait for consumer ModuleMppDec [0] timeout
  9. WARN: 16ModuleFileReader: waitAllForConsume: ModuleMppDec lost a frame
  10. WARN: 16ModuleFileReader: waitAllForConsume: input queue empty: 0
复制代码



作者: WHR197    时间: 2024-5-29 09:30
nboxcn 发表于 2024-3-22 19:17
目标是想实现自动录制10秒的视频文件,使用ModuleFileWriter写视频文件,10秒后自动停止,单使用了stop()后 ...

您好,这个问题解决了吗?




欢迎光临 Firefly开源社区 (https://dev.t-firefly.com/) Powered by Discuz! X3.1