FFMPEG Tips (4) 如何中断阻塞的网络线程

简介:

前面的文章有提到如何提取码流信息、如何读每一帧的数据,这些都是离不开网络操作,例如:使用 ffmpeg 读取一个码流,常规的代码流程示例如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
AVFormatContext *ic = avformat_alloc_context();
 
if  (avformat_open_input(&ic, url, NULL, NULL) < 0) {
     return  -1;
}
 
if  (avformat_find_stream_info(ic, NULL) < 0) {
     return  -1;
}
 
AVPacket avpkt;
av_init_packet(&avpkt);
 
while  (!abort_request) {
     int  ret = av_read_frame(ic, &avpkt);
     if  (ret < 0) {
         break ;
     }
     // processing
}
 
av_free_packet(&avpkt);


其中,


- avformat_open_input 主要负责连接媒体服务器,以及读取码流的头信息

- av_read_frame 主要负责每次读取一帧数据,包括解协议和解封装


这两个函数,都有可能会出现耗时很长或者阻塞的情况,比如:


- 网络很烂或者很不稳定

- 服务器响应比较慢

- 直播流不存在或者没有数据


因此,我们需要一个中断机制,在等待超时或者退出播放的时候,就可以轻松中断掉这个阻塞过程。


ffmpeg 提供了一个很简单的回调机制,即注册一个自定义的回调函数,用于外部中断阻塞的网络操作,用法如下所示:


1
2
3
4
5
6
7
8
9
10
static  int  custom_interrupt_callback( void  *arg) {
     if  (timeout || abort_request) {
         return  1;
     }
     return  0;
}
 
AVFormatContext *ic = avformat_alloc_context();
ic->interrupt_callback.callback = custom_interrupt_callback;
ic->interrupt_callback.opaque = custom_arg;


当自定义的回调函数返回 1,则会产生中断。因此,我们可以在等待超时或者退出播放器的时候,将 timeout 或者 abort_request 置为 1 来达到中断当前的网络阻塞过程的目的。




本文转自 Jhuster 51CTO博客,原文链接:http://blog.51cto.com/ticktick/1881438,如需转载请自行联系原作者

相关文章
|
10月前
|
负载均衡 算法 安全
基于Reactor模式的高性能网络库之线程池组件设计篇
EventLoopThreadPool 是 Reactor 模式中实现“一个主线程 + 多个工作线程”的关键组件,用于高效管理多个 EventLoop 并在多核 CPU 上分担高并发 I/O 压力。通过封装 Thread 类和 EventLoopThread,实现线程创建、管理和事件循环的调度,形成线程池结构。每个 EventLoopThread 管理一个子线程与对应的 EventLoop(subloop),主线程(base loop)通过负载均衡算法将任务派发至各 subloop,从而提升系统性能与并发处理能力。
500 3
|
10月前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
484 83
|
7月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
367 1
|
7月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
348 1
|
Linux 开发工具 Android开发
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
ijkplayer是由Bilibili基于FFmpeg3.4研发并开源的播放器,适用于Android和iOS,支持本地视频及网络流媒体播放。本文详细介绍如何在新版Android Studio中导入并使用ijkplayer库,包括Gradle版本及配置更新、导入编译好的so文件以及添加直播链接播放代码等步骤,帮助开发者顺利进行App调试与开发。更多FFmpeg开发知识可参考《FFmpeg开发实战:从零基础到短视频上线》。
1868 2
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
599 23
|
Java 应用服务中间件
面对海量网络请求,Tomcat线程池如何进行扩展?
【10月更文挑战第4天】本文详细探讨了Tomcat线程池相较于标准Java实用工具包(JUC)线程池的关键改进。首先,Tomcat线程池在启动时即预先创建全部核心线程,以应对启动初期的高并发请求。其次,通过重写阻塞队列的入队逻辑,Tomcat能够在任务数超过当前线程数但未达最大线程数时,及时创建非核心线程,而非等到队列满才行动。此外,Tomcat还引入了在拒绝策略触发后重新尝试入队的机制,以提高吞吐量。这些优化使得Tomcat线程池更适应IO密集型任务,有效提升了性能。
面对海量网络请求,Tomcat线程池如何进行扩展?
|
XML 开发工具 Android开发
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
ExoPlayer最初是为了解决Android早期MediaPlayer控件对网络视频兼容性差的问题而推出的。现在,Android官方已将其升级并纳入Jetpack的Media3库,使其成为音视频操作的统一引擎。新版ExoPlayer支持多种协议,解决了设备和系统碎片化问题,可在整个Android生态中一致运行。通过修改`build.gradle`文件、布局文件及Activity代码,并添加必要的权限,即可集成并使用ExoPlayer进行网络视频播放。具体步骤包括引入依赖库、配置播放界面、编写播放逻辑以及添加互联网访问权限。
1735 1
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
|
Java API 调度
【JavaEE】——多线程(join阻塞,计算,引用,状态)
【JavaEE】——多线程,join,sleep引起的线程阻塞,多线程提升计算效率,如何获取线程的引用和状态
|
Java Linux
【网络】高并发场景处理:线程池和IO多路复用
【网络】高并发场景处理:线程池和IO多路复用
462 2