+
 新版

FFmpeg.AutoGen 读取摄像头错误

李察德-泰森 发布于 2020/09/15 14:22
阅读 1K+
收藏 0

使用 FFmpeg.AutoGen 读取摄像头,将图片显示在控件上,并保存图像到文件中,一开始读取正常,声音、图像都能保存,但是读取几分钟后,程序在使用 av_read_frame 时,会读取不到数据,错误码 -5,摄像头也自动关闭了。直接使用 ffmpeg.exe 去读取摄像头,保存文件的时候,几个小时都不会有问题。读取的逻辑使用就是雷神的。请问这种返回 -5 错误码的情况是怎么出现的,应该怎么处理?

while (1)
{
  if ((ret = ffmpeg.av_read_frame(m_pVidFmtCtx, dec_pkt)) == 0)
  {
    ret = ffmpeg.avcodec_send_packet(m_pVidFmtCtx->streams[dec_pkt->stream_index]->codec, dec_pkt);
    while(ret >= 0)
    {
      ret = ffmpeg.avcodec_receive_frame(m_pVidFmtCtx->streams[dec_pkt->stream_index]->codec, pframe);
      ffmpeg.sws_scale(img_rgb_ctx, pframe->data, pframe->linesize, 0, cy, dstData, dstLinesize);
      var bitmap = new Bitmap(dstWidth, dstHeight, dstLinesize[0], PixelFormat.Format24bppRgb, convertedFrameBufferPtr);
    }
  }
}

 

加载中
0
只做你的小飞哥
只做你的小飞哥

会不会连接超时了

0
李察德-泰森
李察德-泰森

是本地的USB摄像头,应该不会有超时吧

0
李察德-泰森
李察德-泰森

我头疼的就是为啥我自己写的它会不定时的录几分钟就停掉,用ffmpeg打包好的ffmpeg.exe就不会出现这个问题,源码太难懂了,也没发现ffmpeg.exe里做啥特殊处理了

0
天体图
天体图

不知道你机器性能,帧率能跟得上吗?要不试试把 av_read_frame和解码转码保存分开。现在这样的话,读了一个packet要等“解码+转码+保存+显示”完毕之后才能读下一个packet。

天体图
天体图
我的意思是:试试采用多线程,一个线程负责read_frame,放入队列中,另一个线程从这个队列中取出packet,然后解码展示保存。这样还可能存在解码跟不上的情况(因为解码线程做了太多事,拖时间),造成队列满了,那么就要考虑抛弃掉一些packet
zn123
zn123
0
李察德-泰森
李察德-泰森

引用来自“天体图”的评论

不知道你机器性能,帧率能跟得上吗?要不试试把 av_read_frame和解码转码保存分开。现在这样的话,读了一个packet要等“解码+转码+保存+显示”完毕之后才能读下一个packet。

好的,你这个思路不错,我可以来修改下

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部