av_read_frame 卡死
时间: 2023-10-08 07:07:18 浏览: 94
av_read_frame 是 FFmpeg 库中的一个函数,用于读取音视频数据包。如果该函数卡死了,一般是因为读取的媒体文件出现了异常或者 FFmpeg 库的配置出现了问题。
以下是一些可能的解决方案:
1. 确认媒体文件是否正常:尝试使用其他视频文件进行测试,如果其他文件可以正常读取,那么很可能是当前文件出现了异常。
2. 检查 FFmpeg 库的配置:确保正确地配置了 FFmpeg 库,并且库的版本与应用程序的要求相匹配。
3. 调整读取媒体文件的参数:可以尝试调整读取媒体文件的参数,如设置超时时间、缓冲区大小等。具体调整方法需要根据具体情况进行。
4. 调用 avformat_close_input 函数:在读取媒体文件结束后,调用 avformat_close_input 函数关闭输入流。
希望以上解决方案能够帮助你解决问题。如果仍然无法解决,建议查看 FFmpeg 的文档或者相关社区寻求帮助。
相关问题
avformat_open_input失败 再去av_read_frame卡死
这个问题可能是由于音视频文件的格式不被FFmpeg所支持,或者文件损坏导致的。你可以检查一下文件格式是否正确,并且尝试使用其他音视频文件进行测试。另外,也可以尝试使用FFmpeg的命令行工具对该文件进行解码,看是否存在相同的问题。如果问题仍然存在,可以尝试使用调试工具对代码进行调试,查看具体的错误信息。
static int fread_frame_rate(play_para_t *p_para) { int average_count; if (p_para->frame_count < 0) { p_para->frame_count = 0; p_para->mread_frame_rate.last_frame_times = 0; } if (p_para->mread_frame_rate.last_frame_times == 0) { p_para->mread_frame_rate.last_frame_times = av_gettime(); p_para->mread_frame_rate.in_count = 0; } int normal_read_framerate = am_getconfig_int_def("media.amplayer.normal_read_framerate", 50); if (av_gettime() - p_para->mread_frame_rate.last_frame_times >= 200000) { p_para->mread_frame_rate.in_count++; p_para->mread_frame_rate.last_frame_times = av_gettime(); int in_count = p_para->mread_frame_rate.in_count; if (in_count <= READ_FRAME_RATE_TIMES) { p_para->mread_frame_rate.mread_frame_info[in_count-1].read_frame_count = p_para->frame_count; p_para->mread_frame_rate.mread_frame_info[in_count-1].read_frame_time = av_gettime(); } else { int i; for (i = 0; i < (READ_FRAME_RATE_TIMES-1); i++) { p_para->mread_frame_rate.mread_frame_info[i].read_frame_count = p_para->mread_frame_rate.mread_frame_info[i+1].read_frame_count; p_para->mread_frame_rate.mread_frame_info[i].read_frame_time = p_para->mread_frame_rate.mread_frame_info[i+1].read_frame_time; } p_para->mread_frame_rate.mread_frame_info[i].read_frame_count = p_para->frame_count; p_para->mread_frame_rate.mread_frame_info[i].read_frame_time = av_gettime(); } if (in_count < READ_FRAME_RATE_TIMES) { average_count = normal_read_framerate; } else { average_count = get_average_count(p_para->mread_frame_rate.mread_frame_info); } p_para->cur_frame_rate = average_count; } else { if (p_para->mread_frame_rate.in_count < READ_FRAME_RATE_TIMES) { p_para->cur_frame_rate = normal_read_framerate; } average_count = p_para->cur_frame_rate; } return average_count; }
这段代码的作用是计算视频播放的帧率。它通过记录播放的帧数和时间,计算出最近一段时间内的平均帧率。如果记录的帧数不足 READ_FRAME_RATE_TIMES 次,则使用默认帧率 normal_read_framerate。如果记录的帧数超过了 READ_FRAME_RATE_TIMES 次,则计算平均帧率。如果在一定时间内没有读取到新的帧,则使用之前的平均帧率。最终返回的是平均帧率。
阅读全文