精华内容
下载资源
问答
  • C++调用ffmpeg推流到流媒体服务器
  • ffmpeg 推流技术

    2020-09-28 11:54:07
    ffmpeg 推流源码,vs>2012版本可直接编译, 推流接口已经封装好,推流库也是源码,可以自己优化封装库,对于学习推流技术和调用都是很好的资料
  • 简单的ffmpeg推流demo

    2018-10-18 10:58:47
    一个简单的基于ffmpeg推流的demo,从雷神博客所得,要学习ffmpeg推流的伙伴可以下载学习
  • ffmpeg推流视频文件 nginx+rtmp服务器
  • ffmpeg推拉_rtmp内网穿透
  • ffmpeg推流

    2020-08-03 17:16:21
    在使用FFmpeg的时候首先要调用这个方法。 static void register_all(void) { avcodec_register_all(); /* (de)muxers */ REGISTER_MUXER (A64, a64); REGISTER_DEMUXER (AA, aa); REGISTER_DEMUXE.

    在这里插入图片描述
    流程详解
    av_register_all()
    该方法初始化所有的封装和解封装。在使用FFmpeg的时候首先要调用这个方法。

    static void register_all(void)
    {
        avcodec_register_all();
    
        /* (de)muxers */
        REGISTER_MUXER   (A64,              a64);
        REGISTER_DEMUXER (AA,               aa);
        REGISTER_DEMUXER (AAC,              aac);
    //...
    }
    

    这里面就是进行各种注册,而REGISTER_MUXER 、REGISTER_DEMUXER 是前面定义的宏。我们看到是静态方法,说明该方法只能在所在的文件中使用,这也防止被注册多次。

    avformat_network_init()
    网络相关初始化。如果我们使用了网络拉流和推流等等,要先初始化。

    avformat_open_input()
    声明是

    int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options);
    

    定义在libavformat\utils.c中。主要功能
    输入输出结构体AVIOContext的初始化;
    输入数据的协议URLProtocol,通过函数指针的方式,与FFMPEG关联,剩下的就是调用该URLProtocol的函数进行open,read等操作了

    avformat_find_stream_info
    int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);
    可以读取视音频数据并且获得一些相关的信息。定义在libavformat\utils.c下

    avformat_alloc_output_context2
    int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat,
    const char *format_name, const char *filename);
    定义在libavformat\mux.c中

    ctx:函数调用成功之后创建的AVFormatContext结构体。
    oformat:指定AVFormatContext中的AVOutputFormat,用于确定输出格式。如果指定为NULL,可以设定后两个参数(format_name或者filename)由FFmpeg猜测输出格式。
    PS:使用该参数需要自己手动获取AVOutputFormat,相对于使用后两个参数来说要麻烦一些。
    format_name:指定输出格式的名称。根据格式名称,FFmpeg会推测输出格式。输出格式可以是“flv”,“mkv”等等。
    filename:指定输出文件的名称。根据文件名称,FFmpeg会推测输出格式。文件名称可以是“xx.flv”,“yy.mkv”等等。
    函数执行成功的话,其返回值大于等于0。
    内部流程

    调用avformat_alloc_context()初始化一个默认的AVFormatContext。
    如果指定了输入的AVOutputFormat,则直接将输入的AVOutputFormat赋值给AVOutputFormat的oformat。如果没有指定输入的AVOutputFormat,就需要根据文件格式名称或者文件名推测输出的AVOutputFormat。无论是通过文件格式名称还是文件名推测输出格式,都会调用一个函数av_guess_format()。
    avio_open
    打开FFmpeg的输入输出文件

    int avio_open2(AVIOContext **s, const char *url, int flags,
    const AVIOInterruptCB *int_cb, AVDictionary **options);
    s:函数调用成功之后创建的AVIOContext结构体。
    url:输入输出协议的地址(文件也是一种“广义”的协议,对于文件来说就是文件的路径)。
    flags:打开地址的方式。可以选择只读,只写,或者读写。取值如下。
    AVIO_FLAG_READ:只读。
    AVIO_FLAG_WRITE:只写。
    AVIO_FLAG_READ_WRITE:读写。
    int_cb:不太清楚
    options:不太清楚
    avformat_write_header
    写视频文件头,av_write_trailer()用于写视频文件尾

    av_read_frame
    定义在libavformat\utils.c中
    读取码流中的音频若干帧或者视频一帧。解码视频的时候,每解码一个视频帧,需要先调用 av_read_frame()获得一帧视频的压缩数据,然后才能对该数据进行解码(例如H.264中一帧压缩数据通常对应一个NAL)。
    这里我贴上官方的注释,很详细:

    /**
     * Return the next frame of a stream.
     * This function returns what is stored in the file, and does not validate
     * that what is there are valid frames for the decoder. It will split what is
     * stored in the file into frames and return one for each call. It will not
     * omit invalid data between valid frames so as to give the decoder the maximum
     * information possible for decoding.
     *
     * If pkt->buf is NULL, then the packet is valid until the next
     * av_read_frame() or until avformat_close_input(). Otherwise the packet
     * is valid indefinitely. In both cases the packet must be freed with
     * av_packet_unref when it is no longer needed. For video, the packet contains
     * exactly one frame. For audio, it contains an integer number of frames if each
     * frame has a known fixed size (e.g. PCM or ADPCM data). If the audio frames
     * have a variable size (e.g. MPEG audio), then it contains one frame.
     *
     * pkt->pts, pkt->dts and pkt->duration are always set to correct
     * values in AVStream.time_base units (and guessed if the format cannot
     * provide them). pkt->pts can be AV_NOPTS_VALUE if the video format
     * has B-frames, so it is better to rely on pkt->dts if you do not
     * decompress the payload.
     *
     * @return 0 if OK, < 0 on error or end of file
     */
    

    总结起来每段的核心意思

    读取码流中的音频若干帧或者视频一帧
    如果pkt->buf是空,那么就要等待下一次av_read_frame调用。否则无法确定是否有效
    pts dts duration通常被设置为正确的值。但如果视频帧包括Bzh帧,那么pts可以是AV_NOPTS_VALUE。所以最好依赖dts。
    av_interleaved_write_frame
    输出一帧视音频数据

    核心类
    AVFormatContext
    AVFormatContext是一个贯穿始终的数据结构,很多函数都要用到它作为参数。它是FFMPEG解封装(flv,mp4,rmvb,avi)功能的结构体。
    内部的成员变量,大家可以查看头文件。这里我们列举下一些常用重要的成员变量:

    struct AVInputFormat *iformat:输入数据的封装格式
    AVIOContext *pb:输入数据的缓存
    unsigned int nb_streams:视音频流的个数
    AVStream **streams:视音频流
    char filename[1024]:文件名
    int64_t duration:时长(单位:微秒us,转换为秒需要除以1000000)
    int bit_rate:比特率(单位bps,转换为kbps需要除以1000)
    AVDictionary *metadata:元数据
    视频的原数据(metadata)信息可以通过AVDictionary获取。元数据存储在AVDictionaryEntry结构体中

    typedef struct AVDictionaryEntry {
    char *key;
    char *value;
    } AVDictionaryEntry;
    每一条元数据分为key和value两个属性。
    在ffmpeg中通过av_dict_get()函数获得视频的原数据。

    cout << endl << endl << "======元信息=======" << endl;
    string meta, key, value;
    AVDictionaryEntry *m = NULL;
    while (m = av_dict_get(ictx->metadata, "", m, AV_DICT_IGNORE_SUFFIX)) {
        key=m->key;
        value=m->value;
        meta.append(key).append("\t:").append(value).append("\r\n");
    }
    cout << meta.c_str() << endl;
    

    AVStream
    AVStream是存储每一个视频/音频流信息的结构体。

    int index:标识该视频/音频流
    AVCodecContext codec:指向该视频/音频流的AVCodecContext(它们是一一对应的关系)
    AVRational time_base:时基。通过该值可以把PTS,DTS转化为真正的时间。- FFMPEG其他结构体中也有这个字段,但是根据我的经验,只有AVStream中的time_base是可用的。PTS
    time_base=真正的时间
    int64_t duration:该视频/音频流长度
    AVDictionary *metadata:元数据信息
    AVRational avg_frame_rate:帧率(注:对视频来说,这个挺重要的)
    AVPacket attached_pic:附带的图片。比如说一些MP3,AAC音频文件附带的专辑封面。
    AVPacket
    AVPacket是存储压缩编码数据相关信息的结构体。

    uint8_t *data:压缩编码的数据。
    例如对于H.264来说。1个AVPacket的data通常对应一个NAL。
    注意:在这里只是对应,而不是一模一样。他们之间有微小的差别:使用FFMPEG类库分离出多媒体文件中的H.264码流
    因此在使用FFMPEG进行视音频处理的时候,常常可以将得到的AVPacket的data数据直接写成文件,从而得到视音频的码流文件。

    int size:data的大小

    int64_t pts:显示时间戳

    int64_t dts:解码时间戳

    int stream_index:标识该AVPacket所属的视频/音频流。

    展开全文
  • ffmpeg 推流

    2020-12-16 20:43:25
    brew install ffmpeg [Doge] rtmp 服务已经搭建好了,所以直接 rtmp://192.168.22.70:1935/live/home live 是nginx 里面配置的live 后面的随便写 # 分辨率减少一半,视频较流畅 分辨率减少了4分之...

    环境安装

    windows 安装

    mac 安装

    • brew install ffmpeg      
    • [Doge]

    • rtmp 服务已经搭建好了,所以直接推
    • rtmp://192.168.22.70:1935/live/home     live 是nginx 里面配置的live 后面的随便写
    • # 分辨率减少一半,视频较流畅

    • 分辨率减少了4分之一 每秒流量300k + 还可以接受,毕竟云服务器是乞丐版,局域网无碍

     

    • ffmpeg -f dshow -i video="Integrated Webcam" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -vf scale=iw/4:-1 -f flv rtmp://192.168.22.70:1935/live/home
    • 然后使用vlc 打开网络串流 rtmp://192.168.22.70:1935/live/home 就可以看到摄像头了,但是会有5s + 的延迟 目前不知道咋解决
    • 但是 可以低延时播放 
    • 我使用 ffplay -i rtmp://192.168.22.70:1935/live/home -fflags nobuffer -analyzeduration 1000000 

    PS:网络一大堆 python 调用推流,大同小异,上面的ffmpeg 你成功推流了,把网上的那些脚本中的 command 照着你的参数改改就行

    感谢雷霄骅 愿天堂是自由的 https://blog.csdn.net/leixiaohua1020/category_9262578.html

     

     

    展开全文
  • ffmpeg推流(易语言)
  • 本篇文章主要介绍了详解NODEJS基于FFMPEG视频推流测试,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 这是基于QT+FFMPEG推流客户端。 QT版本5.12.6. 编译器: MinGW 32 支持: 1. 推流摄像头图像+音频到流媒体服务器 2. 推流桌面图像+音频到流媒体服务器 3. 录制摄像头图像+音频到本地 4. 录制桌面图像+音频到本地 ...
  • ffmpeg rtmp推流源码

    2019-08-07 09:34:03
    一份可以直接将本地视频推送到服务器的推流源代码, 是学习推流的很好的资料, 代码基于ffmpeg rtmp推流, 采用nginx+rtmp module搭建本地流媒体服务器
  • 这是windows下ffmpeg推流桌面与摄像头数据到流媒体服务器源码,该软件里推流和视频保存使用FFMPEG库完成,视频和音频可以同步推流和录制,FFMPEG本身支持跨平台编译开发,QT也支持跨平台,在Android、Linux、windows...
  • ffmpeg 推流MP4文件,采用rtmp协议

    千次阅读 2020-12-09 21:54:20
    本程序ffmpeg版本是:ffmpeg version ...本程序是经过ffmpeg 推流FLV文件,采用rtmp协议这个例子修改而来的。 下面分二部分: 一、和上面例子有那些区分; 二、源代码分享 一、和上面例子有那些区分; 1、赋值配置.
    • 本程序ffmpeg版本是:ffmpeg version 3.2.4 Copyright © 2000-2017 the FFmpeg developers。
    • 不同ffmpeg版本会稍微有点不同,比如最明显ffmpeg 4.0和ffmpeg 3.0少了一些注册类函数(如:av_register_all())还有编解码函数方式等。
    • 本程序是经过ffmpeg 推流FLV文件,采用rtmp协议这个例子修改而来的。
    • 下面分二部分:
      一、和上面例子有那些区分;
      二、源代码分享
    • 一、和上面例子有那些区分;
      1、赋值配置信息:把avcodec_parameters_copy()替换成avcodec_copy_context()。
      2、时间基转换函数:把av_rescale_q_rnd()都替换成av_rescale_q()。
    int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
    {
    	av_rescale_q_rnd(a,bq,cq,AV_ROUND_NEAR_INF);
    }
    //av_rescale_q_rnd()和av_rescale_q()关系就是上面这段代码一样.
    

    3、pts计算:pts = pkt.pts * (1000 * 1000 * r2d(otime));
    otime是输出流,作为延迟推流使用。不延迟话,推流太快,会导致拉流播放有问题。
    4、mp4的视频时间基为{1,25};flv的视频时间基为{1,1000}。因为输出推流就是使用flv,所以必须进行转换才可以正常播放和推流。
    5、推流部分只是涉及到解协议、解封装的,然后一帧帧推流过去。想特殊处理比如加密,加入视频中特效等,就需要解码、过滤、编码、推流这部分的逻辑。

    • 二、源代码分享
    extern "C"
    {
    #include "libavformat/avformat.h"
    #include "libavutil/time.h"
    }
    #include <iostream>
    using namespace std;
    #pragma comment(lib,"avformat.lib")
    #pragma comment(lib,"avutil.lib")
    #pragma comment(lib,"avcodec.lib")
    
    int XError(int errNum)
    {
    	char buf[1024] = { 0 };
    	av_strerror(errNum, buf, sizeof(buf));
    	cout << buf << endl;
    	getchar();
    	return -1;
    }
    static double r2d(AVRational r)
    {
    	return r.num == 0 || r.den == 0 ? 0. : (double)r.num / (double)r.den;
    }
    
    int main(int argc, char *argv[])
    {
    
    	char *inUrl = "D:/ghb/video_audio_dev/ffmpeg-udemy/FFMpeg实时美颜直播推流实战 ffmpeg,qt5,opencv/03 FFMpegSDK3529923553216442551227969/3.1第一个ffmpegVs2015项目代码包含库文件/src/3.6file_to_rtmp_控制推流速度/008_3.mp4";
    	//char *inUrl = "D:/ghb/video_audio_dev/ffmpeg-udemy/FFMpeg实时美颜直播推流实战 ffmpeg,qt5,opencv/03 FFMpegSDK3529923553216442551227969/3.1第一个ffmpegVs2015项目代码包含库文件/src/3.6file_to_rtmp_控制推流速度/test.flv";
    
    	char *outUrl = "rtmp://192.168.32.128/live";
    
    	//初始化所有封装和解封装 flv mp4 mov mp3
    	av_register_all();
    
    	//初始化网络库
    	avformat_network_init();
    
    	//
    	//输入流 1 打开文件,解封装
    	//输入封装上下文
    	AVFormatContext *ictx = NULL;
    
    	//打开文件,解封文件头
    	int re = avformat_open_input(&ictx, inUrl, 0, 0);
    	if (re != 0)
    	{
    		return XError(re);
    	}
    	cout << "open file " << inUrl << " Success." << endl;
    
    	//获取音频视频流信息 ,h264 flv
    	re = avformat_find_stream_info(ictx, 0);
    	if (re != 0)
    	{
    		return XError(re);
    	}
    	av_dump_format(ictx, 0, inUrl, 0);
    	//
    
    
    	//
    	//输出流 
    
    	//创建输出流上下文
    	AVFormatContext *octx = NULL;
    	re = avformat_alloc_output_context2(&octx, 0, "flv", outUrl);
    	if (!octx)
    	{
    		return XError(re);
    	}
    	cout << "octx create success!" << endl;
    
    	//配置输出流
    	//遍历输入的AVStream
    	for (int i = 0; i < ictx->nb_streams; i++)
    	{
    		//创建输出流
    		AVStream *out = avformat_new_stream(octx, ictx->streams[i]->codec->codec);
    		if (!out)
    		{
    			return XError(0);
    		}
    		//复制配置信息,同于MP4
    		re = avcodec_copy_context(out->codec, ictx->streams[i]->codec);
    		//re = avcodec_parameters_copy(out->codecpar, ictx->streams[i]->codecpar);
    		out->codec->codec_tag = 0;
    	}
    	av_dump_format(octx, 0, outUrl, 1);
    	//
    
    
    	//rtmp推流
    
    	//打开io
    	re = avio_open(&octx->pb, outUrl, AVIO_FLAG_WRITE);
    	if (!octx->pb)
    	{
    		return XError(re);
    	}
    
    	//写入头信息
    	re = avformat_write_header(octx, 0);
    	printf("in code id = %d 。 out code id = %d\n", ictx->streams[0]->codecpar->codec_id, octx->streams[0]->codecpar->codec_id);
    	printf("in code id = %d 。 out code id = %d\n", ictx->streams[1]->codecpar->codec_id, octx->streams[1]->codecpar->codec_id);
    	if (re < 0)
    	{
    		return XError(re);
    	}
    	cout << "avformat_write_header " << re << endl;
    	AVPacket pkt;
    	long long startTime = av_gettime();
    	for (;;)
    	{
    		re = av_read_frame(ictx, &pkt);
    		if (re != 0)
    		{
    			break;
    		}
    
    		//计算转换pts dts
    		AVRational itime = ictx->streams[pkt.stream_index]->time_base;
    		AVRational otime = octx->streams[pkt.stream_index]->time_base;		
    		pkt.pts = av_rescale_q(pkt.pts, itime, otime);
    		pkt.dts = av_rescale_q(pkt.dts, itime, otime);
    		pkt.duration = av_rescale_q(pkt.duration, itime, otime);
    		pkt.pos = -1;
    
    		//视频帧推送速度
    		if (ictx->streams[pkt.stream_index]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
    		{
    			//已经过去的时间
    			long long now = av_gettime() - startTime;
    			long long pts = 0;
    			pts = pkt.pts * (1000 * 1000 * r2d(otime));
    			if (pts > now)
    			{
    				av_usleep(pts - now);
    				cout << pts - now<<endl;
    			}
    
    			//cout << pkt.dts << "-----" << pkt.pts << endl;
    		}
    		re = av_interleaved_write_frame(octx, &pkt);
    		if (re<0)
    		{
    			return XError(re);
    		}
    	}
    
    	cout << "file to rtmp test" << endl;
    	getchar();
    	return 0;
    }
    

    (上面有错误,有问题话,请多多指教,谢谢。一起学习,一起进步,加油!)

    展开全文
  • ffmpeg转码推流

    2018-09-03 16:54:22
    可以安装ffmpeg,进行配置,可以使用命令行进行音视频的编解码
  • ffmpeg视频推流

    2018-02-23 17:08:53
    ffmpeg视频推流,里面用map封装好了,只需要填相应的视频流地址以及需要ffmpeg名字就可以用
  • 需要先创建推流的流媒体地址,然后再创建一个对象启动推流,创建过程如下。 RtmpPublishManager* rpm = new RtmpPublishManager("rtmp://192.168.16.88:1935/hls/test0", read_fd[0]); rpm->ffmpeg_init(NULL); rpm-...
  • FFmpeg推流以后自动结束的方法

    千次阅读 2020-11-15 13:55:11
    批处理文件(在ffmpeg完成后将关闭): 1 2 3 4 @echo off ffmpeg -i link.m3u8 -c copy video.mkv shutdown /p 或者,如果您想退出: 1 2 3 4 @echo ...

    您要批处理文件还是cmd行?

    批处理文件(在ffmpeg完成后将关闭):

    1
    2
    3
    4

    @echo off

    ffmpeg -i link.m3u8 -c copy video.mkv
    shutdown /p

    或者,如果您想退出:

    1
    2
    3
    4

    @echo off

    ffmpeg -i link.m3u8 -c copy video.mkv
    exit /b

    对于cmd(在ffmpeg完成后退出):

    1

    ffmpeg -i link.m3u8 -c copy video.mkv & exit /b

    或者,如果要关闭:

    1

    ffmpeg -i link.m3u8 -c copy video.mkv & shutdown /p


    您可以编写一个快速的小批处理文件来执行此操作:

    1
    2
    3

    start path\to\ffmpeg.exe -i link.m3u8 -c copy video.mkv
    exit
    shutdown /s /f /t 0

    显然,exit用于退出cmd,并且shutdown的序列及其相关标志将立即关闭您的PC(如果您这样做,则实际上不必费心退出cmd,因为它 无论如何都会这样做)。 将上面的内容另存为my_file.bat,然后在命令提示符下键入path\to\your\my_file.bat。

    展开全文
  • ffmpeg推流与收流

    千次阅读 2020-04-24 10:34:42
    协议层:提供网络协议收发功能,可以接收或送含封装格式的媒体。协议层由 libavformat 库及第三方库(如 librtmp)提供支持。 容器层:处理各种封装格式。容器层由 libavformat 库提供支持。 编码层:处理音视频...
  • ffmpeg usb摄像头采集 +6818硬件编码 +ffmpeg RTMP H264推流 需要提前移植QT 和FFMPEG ffmpeg移植不需要添加H264编码
  • FFMPEG 推流常用参数收集

    千次阅读 2020-05-28 18:43:17
    ffmpeg -re -stream_loop -1 -i wKgBBV7MtiaAbHhFAzl39Emwz1I432.mp4 -vf scale=1440:-2 -f flv -vcodec h264 -max_delay 1000 -g 2 rtmp://192.168.1.5/live//test -re : 原始帧率 -stream_loop: 循环次数 ,-1 ...
  • linux ffmpeg推流 到 srs

    2021-08-26 10:14:18
    ffmpeg录屏 ffmpeg 已开启 x11grab ffmpeg version 2.8.17-0ubuntu0.1 Copyright (c) 2000-2020 the FFmpeg developers built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 20160609 configuration: --...
  • FFMPEG之TimeBase成员理解 补充:封装/解封装、编码/解码、采集/显示这三个层面中的taimeBase是代表不同的意思的,需要通过转换才可以进行上下层的交互。 2、ffmpeg中对AVRational结构体理解 ffmpeg # AVRational ...
  • 流媒体服务器接管了和用户交互的一部分操作,后端通过ffmpeg推流到流媒体服务器 smart-rtmp地址:https://gitee.com/mirrors/smart_rtmpd?_from=gitee_search 修改每个协议对应的配置后,启动smart rtmpd ffmpeg...
  • FLV方式实现网页FFmpeg推流无插件播放 使用FFmpeg将RTSP流转RTMP流,Web播放RTMP流视频需要flash插件的支持,浏览器已不再支持。目前主流的 Web 直播流都为http-flv格式,需要通过服务端将视频流实时转为http-flv流...
  • ffmpeg推流到mediasoup

    2021-04-14 14:29:53
    mediasoup提供了PlainTransport可以接收裸RTP数据,可以通过ffmpeg.sh脚本推本地文件到mediasoup(ffmpeg.sh推流介绍脚本路径:mediasoup-demo/broadcasters/ffmpeg.sh) 1、PlainTransport 分析 ( mediasoup....
  • ffmpeg推流错误

    千次阅读 2019-11-29 22:38:52
    使用ffmpeg推摄像头视频流中遇到的问题问题一 推流不稳定,过10分钟ffmpeg会自动停止原因解决方法---合适的推流语句问题二 推流时不时报错且拉下来的高清视频流花屏,低分辨率情况稍好原因与解决方法问题三 ffmpeg...
  • ffmpeg推拉优化方案

    千次阅读 2020-04-20 17:02:46
    ffmpeg推拉优化方案 文章目录ffmpeg推拉优化方案一、卡顿优化设备老旧视频音视频不同步网络二、延时优化三、传输协议优化四、首屏秒开优化服务器做优化客户端优化五、弱网优化六、DNS劫持优化七、服务端cdn...
  • ffmpeg推流命令

    2020-07-08 12:07:42
    推流mp4到HLS ffmpeg -loglevel verbose -re -i xiaopingguo.mp4 -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280*720 -q 10 rtmp://ip:1935/hls/ 直播HLS ffplay ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,049
精华内容 4,419
关键字:

ffmpeg推流