av_interleaved_write_frame退出较慢

用libvlc做直播推流引擎
在网络较差的情况下,需要关闭直播,并且重新开播。
这个过程中,推流引擎重启,需要的是快速响应。
实际上测试结果发现,经常会发生引擎关闭接口卡住。
后来跟踪代码,定位到s_rtmp_send_thread() 中
其中一句:
ret = av_interleaved_write_frame(formatContext, pkt);
这个方法在网络较好的情况下,一般是几个毫秒就返回发送成功。
然后在网络较差的情况下,会一直卡在这里,没有返回。。。

跟踪ffmpeg代码,这个方法的实现在mux.c
libavformat/mux.c
av_interleaved_write_frame()
write_packet() 真正写数据
ret = s->oformat->write_packet(s, pkt);
write_packet 这里就是一个定义在avformat.h中的指针,指向flv_write_packet()

经一步跟踪代码,发现关于网络读写的超时控制,定义在url.h中

typedef struct URLContext {
......
int64_t rw_timeout; /**< maximum time to wait for (network) read/write
......
} URLContext;

于是在初始化的地方,设置这个参数:

libavformat/avio.c --->
url_alloc_for_protocol() return之前添加如下语句

// 网络读写超时 控制在 800ms

if (0 == uc->rw_timeout || uc->rw_timeout > 800000)
        uc->rw_timeout = 800000;

回到项目中,在av_interleaved_write_frame两端输出时间,发现现在这个接口在网络不好的情况下,基本控制在1s以内。然后并不是精确的时间控制。貌似ffmpeg本身都不能严格控制到毫秒级别。

为了确保这个返回一定得到响应,同时在libavformat/mux.c
av_interleaved_write_frame()中修改下面的代码:

for(;;) 

这个没有控制的for循环,改为

int mOutTimes = 128;
int nn;
for(nn=0;nn<mOutTimes;nn++)

这里的128是个经验值。

时间: 2024-10-11 21:21:06

av_interleaved_write_frame退出较慢的相关文章

Android App退出检测

app的退出检测是很难的,但是获取app“要退出”的状态就容易多了,退出的瞬间并不是真的退出了,ActivityManager要销毁activity,也需要一些时间和资源的. 先见下面的运行效果:  gif做的比价粗啊, 两个activity的界面就不介绍了,主要是在APP启动的时候开启一个服务,application代码如下: public class MyApplication extends Application { @Override public void onCreate() {

通过CLI命令使ESXi主机进入、退出维护模式

1.进入维护模式: 方法一:# vim-cmd /hostsvc/maintenance_mode_enter 方法二:# esxcli system maintenanceMode set --enable yes 方法三:# vimsh -n -e /hostsvc/maintenance_mode_enter 2.退出维护模式:方法一:# vim-cmd /hostsvc/maintenance_mode_exit 方法二:# esxcli system maintenanceMode s

函数一直无法立即退出,在等待了大约30s后才能退出(QMulitHash释放不连续的内存需要很长世间,而这样设置局部变量后又无法避免这个问题)

局部变量使用对性能的影响以及进程的堆和栈: 由于在代码中我使用了QMulitHash<QString , LHFilteVersionItem> tmp;这一局部变量来保存某一目录下的文件,由于在写测试代码期间,我利用循环模拟了50万的数据序列化后保存在文件中,在运行期间我发现读取函数耗费很长的时间,而函数里面最耗时的读取操作也只花费了很短的时间,但是函数一直无法立即退出,在等待了大约30s后才能退出,相关代码如下: [cpp] view plain copy void LHTWORKFLOW

nginx在 window下 自动退出 php-cgi

win32+nginx+php自动挂掉php-cgi.exe    RunHiddenConsole E:/wnmp/php5/php-cgi.exe -b 127.0.0.1:9000 -c "E:/wnmp/php5/php.ini"   第一步:下载xxfpm,地址就不提供了,百度搜一下,有很多.       下载好了 第二步:新建一个文本,写上以下代码. RunHiddenConsole.exe H:/Server_Core/xxfpm/bin/xxfpm.exe "

Android设置Activity启动和退出时的动画

业务开发时遇到的一个小特技,要求实现Activity启动时自下向上弹出,退出时自上向下退出. 此处不关注启动和退出时其他Activity的动画效果,实现方法有两种: 1.代码方式,通过Activity的overridePendingTransition接口, 即在startActivity时调用overridePendingTransition(R.anim.push_bottom_in, 0) 在finish时调用overridePendingTransition(0, R.anim.push

ios键盘退出

点击空白处退出键盘 1 -(void)touchesBegan:(nonnull NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event{ 2 [self.view endEditing:YES]; 3 }

登录退出代码

1.登录代码 /// <summary> /// 登陆 /// </summary> /// <param name="userNo"></param> /// <param name="password"></param> /// <param name="persistCookie"></param> /// <returns><

安卓按键再点一次退出

// =========================PhoneGap==================================  // 等待加载PhoneGap  document.addEventListener("deviceready", onDeviceReady, false); // PhoneGap加载完毕 function onDeviceReady() { // 按钮事件 document.addEventListener("backbutto

“ResGen.exe”已退出,代码为2 问题处理

这属于VS2010不能编译.Net3.5的问题 用VS2010创建了一个.Net 3.5的Winform项目,结果编译失败,这个问题也算是第二次碰到了,真纠结···这次不再偷懒了,把解决方法记录下来吧 在64位的Windows 7下,用VS2010编译4.0以前的.Net项目会有问题.原因么,是一个叫Resgen.exe的玩意儿,是跑在64位环境下的,当他试图加载32位的可执行代码时,就会执行失败: Failed to execute command:""C:\Program File