ffmpeg命令分析-拉取TCP流 - 弦外之音

/ 0评 / 1

本文 以 ffmpeg4.4 源码为准,a.mp4下载链接:百度网盘,提取码:nl0s 。


TCP推流命令如下:

ffmpeg.exe -re -i a.mp4 -c copy -f flv tcp://127.0.0.1:1234/live/stream

TCP拉流命令如下:

ffmpeg.exe -listen 1 -i tcp://127.0.0.1:1234/live/stream -c copy -f flv output.flv -y

ffmpeg 除了支持 RTMP,HTTP 等高层的协议,也支持直接拉取 TCP 流。本文主要分析 TCP 拉流的逻辑,推流不管。

-i tcp://127.0.0.1:1234/live/stream 这个参数其实没有太多需要分析的地方,在API调用层,跟 -i 本地文件是一样的,就是传递个字符串进去 avforamt_open_input 函数里面。avforamt_open_input 内部根据字符串类型 做不同的解封装处理,如图:

主要分析 -listen 1 会影响哪些逻辑。 listen 的定义是在 libavformat/tcp.c 里面,如下:

static const AVOption options[] = {
    { "listen","Listen for incoming connections",  OFFSET(listen),AV_OPT_TYPE_INT, { .i64 = 0 },0, 2,.flags = D|E }
    省略代码...
};

因为 listen 定义是在 libavformat 目录里面的,所以这个 -listen 的解析,是走的 opt_default() -> avformat_get_class() ,最后把 listen 解析到 o->g->format_opts ,然后丢进去 avformat_open_input() 函数,具体分析可以看专栏《FFmpeg源码分析-参数解析篇

所以 -listen 1 对 ffmpeg.c 的代码逻辑并没有什么影响,他只是 tcp format 的一个 option 参数,传递进去 avformat_open_input() 函数,内部已经封装好,API调用层无感知。


版权所属:知识星球:弦外之音,QQ:2338195090。 由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注