FFmpeg.AutoGen 读取摄像头错误

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

Linux基金会开源软件大学开源技术公开课即将上线,Kubernetes1.19实战讲解!>>>

使用 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
zn123
zn123

/**

 * Return the next frame of a stream.

 * This function returns what is stored in the file, and does not validate

 * that what is there are valid frames for the decoder. It will split what is

 * stored in the file into frames and return one for each call. It will not

 * omit invalid data between valid frames so as to give the decoder the maximum

 * information possible for decoding.

 *

 * If pkt->buf is NULL, then the packet is valid until the next

 * av_read_frame() or until avformat_close_input(). Otherwise the packet

 * is valid indefinitely. In both cases the packet must be freed with

 * av_packet_unref when it is no longer needed. For video, the packet contains

 * exactly one frame. For audio, it contains an integer number of frames if each

 * frame has a known fixed size (e.g. PCM or ADPCM data). If the audio frames

 * have a variable size (e.g. MPEG audio), then it contains one frame.

 *

 * pkt->pts, pkt->dts and pkt->duration are always set to correct

 * values in AVStream.time_base units (and guessed if the format cannot

 * provide them). pkt->pts can be AV_NOPTS_VALUE if the video format

 * has B-frames, so it is better to rely on pkt->dts if you do not

 * decompress the payload.

 *

 * @return 0 if OK, < 0 on error or end of file

 */

int av_read_frame(AVFormatContext *s, AVPacket *pkt);

 

/**

0
天体图
天体图

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

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

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

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

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

返回顶部
顶部