如何使用FFmpeg暂停流?求助:实现一分钟暂停功能的代码修改
在FFmpeg代码中实现一分钟暂停的修改方案
方案1:无条件暂停(每次读取帧后暂停)
如果需要每次成功读取帧后暂停一分钟,直接在av_read_frame执行成功后加入睡眠逻辑即可,注意跨平台的API差异:
ret = av_read_frame(ifmt_ctx, &pkt); if (ret < 0) { break; } // 暂停一分钟 #ifdef _WIN32 Sleep(60 * 1000); // Windows系统:Sleep函数参数为毫秒 #else sleep(60); // Linux/macOS系统:sleep参数为秒,也可用usleep(60000000) #endif
方案2:按需触发暂停(满足条件时暂停)
如果需要在特定条件下触发暂停(比如达到某帧时间戳、外部控制信号),可以通过标志变量控制:
// 假设你有一个控制暂停的标志位,比如外部触发后设为1 int need_pause = 0; // 检查是否需要暂停 if (need_pause) { // 执行一分钟暂停 #ifdef _WIN32 Sleep(60 * 1000); #else sleep(60); #endif need_pause = 0; // 暂停结束后重置标志 } ret = av_read_frame(ifmt_ctx, &pkt); if (ret < 0) { break; }
注意事项
- 直接调用睡眠函数会阻塞当前线程,如果是带GUI的程序,不要在主线程执行这段逻辑,要把音视频处理放到单独的工作线程中。
- 如果处理的是实时流媒体,暂停期间可能会丢失后续推送的帧,若需要保留帧数据,建议先将读取到的帧缓存到队列,再执行暂停逻辑。
- 跨平台开发时,记得通过宏定义区分Windows和类Unix系统的睡眠API,避免编译错误。
内容的提问来源于stack exchange,提问作者guy
相关产品推荐
相关产品推荐

