精华内容
下载资源
问答
  • 2.支持手机屏幕推流。 3.支持麦克风。 4.视频清晰流畅,延迟500ms左右,带宽占用仅1M左右,互联网体验好。 ———————————————— 版权声明:本文为CSDN博主「FMSer.CN」的原创文章,遵循CC 4.0 BY-SA...
  • 该代码可以实现android的屏幕录制和摄像头录制以及通过rtmp上传到服务器
  • 屏幕采集推流\录屏

    2020-09-25 09:31:10
    2. 可以在选择采集屏幕的情况,再去选择一个要采集的窗口, 这样可以完成一些软件的共享分享功能 3. 可以选择是否采集系统声音, 这样如果是在直播屏幕时可以一边讲解一边直播.录像也是会同步把声音录下. 这里是MIC与...

    简单好用的工具,  大神说要加入设备采集作为讲课老师头像, 期待中

    下面我把功能都作一下简介:

    1.  可以选择采集的屏幕, 当你机器有多屏的时候这个就比较方便了.
    2.  可以在选择采集屏幕的情况,再去选择一个要采集的窗口, 这样可以完成一些软件的共享分享功能
    3.  可以选择是否采集系统声音, 这样如果是在直播屏幕时可以一边讲解一边直播.录像也是会同步把声音录下. 这里是MIC与系统声音的混音.
    4.  可以录像, 录像时输出都是1920*1080的画面, 即便是采集的是小窗口最后我们看到的也是1920*1080, 录像生成是MP4. 
    5.  可以进行RTMP适时推流到服务器, 做同步直播, 如果搭配我另一篇博文中的AMS3.0免费服务器,可以做到毫秒级的延迟.
    6.  支持采集过程暂停但流不停的功能, 如果在录屏或直播时你想暂不要输出你的画面, 但又不想直接断掉直播,此时可以使用暂停.
    7.  可以插入图片显示. 如果你是暂停时想显示一幅自己的图画而不是屏幕,那么这个功能就有用了, 此时你选中"使用暂停图片",就会把你设定图显示出来. 如果你想显示很多不同的图片, 你可以自己手动选择你要展示的图片就可以了. 一切都可以在预览窗口中看到.
    8.支持输出画面预览功能, 你想看时可以打开, 不想看时可以关闭, 关闭后更省资源. 
    9.支持应用最小化, 最小化后不影响工作. 

    优点就是高效呀, 一个字快!!!

    1. 采用先进的屏幕采集技术, 采集帧率可达30帧以上, 画质可以达到原样输出的效果,非常流畅,而且资源占用很小.
    2. 采用软编和硬编和相结合, 在硬件支持的情况下资源占用非常小.  没有硬件支持下情况软编自动启用,且效率比一般编码器也高.
    3. 网络推流部分是完全自己实现的TRMP模块,是超低延迟模块.这部分可以用在导播推流中, 毫秒级延迟. 

    资源下载地址   https://blog.csdn.net/wanghaisheng/article/details/108237797

    展开全文
  • 这是我的第二个免费软件了, 为了方便大家也有博友提出有这个需求,所以写了这个桌面采集\录屏\推流的一体化工具. 里面还有一个简单的播放器,用作测试!! 作为一个基本的桌面采集软件,麻雀虽小五脏俱全. 它的功能也算...
  • 一、 阿里云服务器购买、 二、 远程服务器控制软件、 三、 配置 Ubuntu 服务器、 四、 推流软件下载与配置、 五、 直播软件下载与配置





    安卓直播推流专栏博客总结



    Android RTMP 直播推流技术专栏 :


    0 . 资源和源码地址 :


    1. 搭建 RTMP 服务器 : 下面的博客中讲解了如何在 VMWare 虚拟机中搭建 RTMP 直播推流服务器 ;

    2. 准备视频编码的 x264 编码器开源库 , 和 RTMP 数据包封装开源库 :

    3. 讲解 RTMP 数据包封装格式 :

    4. 图像数据采集 : 从 Camera 摄像头中采集 NV21 格式的图像数据 , 并预览该数据 ;

    5. NV21 格式的图像数据编码成 H.264 格式的视频数据 :

    6. 将 H.264 格式的视频数据封装到 RTMP 数据包中 :

    7. 阶段总结 : 阿里云服务器中搭建 RTMP 服务器 , 并使用电脑软件推流和观看直播内容 ;

    8. 处理 Camera 图像传感器导致的 NV21 格式图像旋转问题 :

    9. 下面这篇博客比较重要 , 里面有一个快速搭建 RTMP 服务器的脚本 , 强烈建议使用 ;

    10. 编码 AAC 音频数据的开源库 FAAC 交叉编译与 Android Studio 环境搭建 :

    11. 解析 AAC 音频格式 :

    12 . 将麦克风采集的 PCM 音频采样编码成 AAC 格式音频 , 并封装到 RTMP 包中 , 推流到客户端 :






    上一篇博客 【Android RTMP】RTMP 直播推流服务器搭建 ( Ubuntu 18.04.4 虚拟机 ) 具体演示了在虚拟机上搭建直播推流服务器 , 并且进行错误排查的过程 , 测试一下搭建流程是否能跑通 ;

    本博客演示如何 在阿里云购买服务器 , 远程服务器控制 , 搭建 RTMP 直播推流服务器 , 并配置服务器 , 直播展示 , 全过程的记录 ;





    一、 阿里云服务器购买



    1 . 进入阿里云控制台的云服务器 ECS 界面 :

    在这里插入图片描述

    2 . 选择服务器类型 : 选个抢占式的实例 , 挑个便宜点的网络增强型的服务器 ;

    在这里插入图片描述


    3 . 带宽设置 : 设置按流量收费 , 100M 带宽 ;

    在这里插入图片描述


    4 . 设置今晚 11 点释放 :

    在这里插入图片描述


    5 . 实例查看 :

    在这里插入图片描述


    6 . 配置安全组 : 入方向配置 TCP 协议 8080 和 1935 端口 ;

    在这里插入图片描述





    二、 远程服务器控制软件



    1 . 使用 WinSCP 工具连接服务器 , 并与服务器进行文件交互操作 ;

    在这里插入图片描述


    2 . 连接后界面 :

    在这里插入图片描述

    3 . 将上述两个源码上传到远程服务器的 /root/rtmp 目录下 :

    在这里插入图片描述

    在这里插入图片描述





    三、 配置 Ubuntu 服务器




    1 . 更新 apt 源


    编译 Nginx 需要安装一些依赖库 , 必须更新 apt 源 , 才能安装 ;


    1 . 备份源 :

    mv /etc/apt/sources.list /etc/apt/sourses.list.backup
    

    2 . 添加源 : 本地编辑 sources.list , 内容如下 , 上传到服务器 /root/rtmp/ 目录下 ;

    deb http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
    

    在这里插入图片描述

    将 sources.list 上传到 rtmp 目录下 , 并复制到 /etc/apt/ 目录下 ;

    root@hsl:~/rtmp# cp sources.list /etc/apt/
    

    3 . 更新源 :

    sudo apt-get update
    


    2 . 安装 pcre、OpenSSL、zlib 库


    1 . 安装编译 Nginx 所需的 pcre , OpenSSL , zlib 库 ;

    $ sudo apt-get install libpcre3 libpcre3-dev
    $ sudo apt-get install openssl libssl-dev
    $ sudo apt-get install zlib1g-dev
    


    3 . 解压 nginx-1.15.3.tar.gz、nginx-rtmp-module-1.2.1.tar.gz 源码


    $ tar xvf nginx-1.15.3.tar.gz
    $ tar xvf nginx-rtmp-module-1.2.1.tar.gz
    


    4 . 执行 configure 生成 Makefile 文件


    $ ./configure --prefix=./bin --add-module=../nginx-rtmp-module-1.2.1
    


    5 . 编译安装


    $ make install
    


    6 . 配置 Nginx 服务器


    配置 conf/nginx.conf 脚本 : 在本地配置 nginx.conf 脚本 , 然后上传到服务器 /root/rtmp/ 目录中 ;

    user  root;
    worker_processes  1;
    
    error_log  logs/error.log debug;
    
    events {
        worker_connections  1024;
    }
    
    rtmp {
        server {
            listen 1935;
    
            application myapp {
                live on;
            }
        }
    }
    
    http {
        server {
            listen 8080;
    
            location /stat {
                rtmp_stat all;
                rtmp_stat_stylesheet stat.xsl;
            }
    
            location /stat.xsl {
                root /root/rtmp/nginx-rtmp-module-1.2.1/;
            }
    
            location /control {
                rtmp_control all;
            }
    
            location /rtmp-publisher {
                root /root/rtmp/nginx-rtmp-module-1.2.1/test;
            }
    
            location / {
                root /root/rtmp/nginx-rtmp-module-1.2.1/test/www;
            }
        }
    }
    

    备份原来的脚本 : 在 /root/rtmp 目录下执行该命令 ;

    $ mv nginx-1.15.3/bin/conf/nginx.conf nginx-1.15.3/bin/conf/nginx.conf.backup
    

    复制上传到脚本到 nginx-1.15.3/bin/conf/ 目录下 : 在 /root/rtmp 目录下执行该命令 ;

    $ cp nginx.conf nginx-1.15.3/bin/conf/
    


    7 . 配置 Nginx 服务器文件权限


    启动时出现 403 错误 , 怀疑是文件权限不足 , 这里将 nginx-1.15.3 和 nginx-rtmp-module-1.2.1 赋予所有的权限 ;

    root@octopus:~/rtmp# chmod -R 777 nginx-1.15.3
    root@octopus:~/rtmp# chmod -R 777 nginx-rtmp-module-1.2.1
    


    8 . 查看 Nginx RTMP 服务器状态


    1 . 查看状态 : http://47.94.36.51:8080/stat

    在这里插入图片描述


    2 . 查看直播内容 : http://47.94.36.51:8080

    在这里插入图片描述





    四、 推流软件下载与配置



    1 . 推流软件 : 使用 EV 录屏软件 作为推流软件 , 点击链接进入下载界面 ;

    在这里插入图片描述


    2 . 配置推流地址 : rtmp://47.94.36.51/myapp/ , 密码 0 ;

    选择 在线直播 , 点击右上角的设置按钮 ;
    在这里插入图片描述


    弹出设置对话框 , 设置直播地址 rtmp://47.94.36.51/myapp/ , 密码设置为 0 ;

    在这里插入图片描述


    3 . 开始推流 : 点击左下角播放按钮 , 即可开始推流 ;
    在这里插入图片描述


    4 . 查看服务器端 RTMP 推流状态 : 111.192.247.192 地址正在向服务器推流 , 这个地址就是当前我的电脑地址 ;

    在这里插入图片描述

    在这里插入图片描述





    五、 直播软件下载与配置



    1 . 直播软件 : 使用 EVPlayer 观看直播 , 点击该链接下载软件 ;

    在这里插入图片描述


    2 . 直播配置 : 邮件点击界面 , 选择播放网络流 , 输入 直播地址 rtmp://47.94.36.51/myapp/ , 密码 0 ;

    在这里插入图片描述


    3 . 直播效果展示 : 居然不让截屏 , 贴张照片 ;

    在这里插入图片描述


    4 . 服务器状态查看 : 可以看到一个设备正在推流 , 一个设备正在观看直播 ;

    在这里插入图片描述

    展开全文
  • 首先需要安装一个软件,screen capture recorder 编译好的下载地址是:http://sourceforge.net/projects/screencapturer/files/ 安装后才能使用 源码地址是:...

    Windows

     Windows采集设备的主要方式是dshow、vfwcap、gdigrab.

    其中dshow可以用来抓取摄像头、采集卡、麦克风等,vfwcap主要用来采集摄像头类设备,gdigrab则是抓取Windows窗口程序。

    ffmpeg -hide_banner -devices

     

    方法一:dshow 

    首先需要安装一个软件,screen capture recorder
    编译好的下载地址是:
    http://sourceforge.net/projects/screencapturer/files/ 安装后才能使用
    源码地址是:
    https://github.com/rdp/screen-capture-recorder-to-video-windows-free

    查看可用的设备:

    ffmpeg -list_devices true -f dshow -i dummy

     

    [dshow @ 000001d73b78b400] DirectShow video devices
    [dshow @ 000001d73b78b400]  "screen-capture-recorder"
    [dshow @ 000001d73b78b400] DirectShow audio devices
    [dshow @ 000001d73b78b400]  "virtual-audio-capturer"

    ffmpeg已经可以捕获到DirectShow视频设备,和音频设备了.
    "screen-capture-recorder" 这个就是桌面捕获设备,如果电脑上连有摄像头,也会列出来.
    "virtual-audio-capturer" 这个是音频捕获设备 

    捕获视频:

    读取屏幕数据并编码为H.264,最后保存成desktop.mkv

    ffmpeg -f dshow -i video="screen-capture-recorder" -vcodec libx264 -preset ultrafast desktop.mkv

    捕获声音:

    ffmpeg -f dshow -i audio="virtual-audio-capturer" -acodec aac desktop.aac

    同时捕获桌面和声音并录制成flv格式:

    ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="virtual-audio-capturer" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -pix_fmt yuv420p -acodec aac desktop.flv

    如果想提高x264编码速度可使用 -preset:v ultrafast -tune:v zerolatency 两个参数。

    1)如果不设置ultrafast,捕获的视频比较模糊。

    2)如果不设置-pix_fmt yuv420p,捕获的是黑白图像

    3)如果不设置-pix_fmt yuv420p,封装格式改为mp4的话,捕获的也是彩色图像。

    捕获桌面音视频并推流

    ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="virtual-audio-capturer" -vcodec libx264 -preset:v ultrafast -pix_fmt yuv420p -acodec aac -f flv rtmp://172.17.178.120/myapp/test

    推流服务器的搭建可以参考这边文章:centos7+nginx+rtmp+ffmpeg搭建流媒体服务器

    方法二:gdigrab

    gdigrab是基于GDI的抓屏设备,可以用于抓取屏幕的特定区域。在这里记录一下gdigrab的用法。
    gdigrab通过设定不同的输入URL,支持两种方式的屏幕抓取:
    (1)“desktop”:抓取整张桌面。或者抓取桌面中的一个特定的区域。
    (2)“title={窗口名称}”:抓取屏幕中特定的一个窗口。
    下面举几个例子。
    最简单的抓屏:

    ffmpeg -f gdigrab -i desktop out.mpg

     从屏幕的(10,20)点处开始,抓取640x480的屏幕,设定帧率为5

    ffmpeg -f gdigrab -framerate 5 -offset_x 10 -offset_y 20 -video_size 640x480 -i desktop out.mpg

    方法三:vfwcap

     使用vfwcap枚举支持采集的设备

    ffmpeg -f vfwcap -i list
    

    (2)使用vfwcap生成mp4文件

    ffmpeg -f vfwcap -i 0 -r 25 -vcodec libx264 out.mp4

    linux

    使用x11grab

    ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :0.0+100,200 v-out.mp4

    上面的参数,指的是从屏幕的左上角(x=100, y=200)的位置,录制分辨率为1024×768的视频。

    可以使用ALSA同时录制声音

    ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :0.0+100,200 -f alsa -ac 2 -i hw:0 av-out.mkv

    也可以使用Pulse声音输入设备

    ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :0.0+100,200 -f pulse -ac 2 -i default av-out.mkv


    问题总结

    捕获图像不清晰。

    解决办法:

    添加参数:-preset ultrafast

    参考

     FFmpeg获取DirectShow设备数据(摄像头,录屏)

    利用FFmpeg实现录屏、直播推流、音频视频格式转换、剪裁等功能 

    FFMPEG在Windows下的屏幕录像录音 

    使用FFmpeg进行屏幕录像和录音 

    FFmpeg采集设备

    http://trac.ffmpeg.org/wiki/Capture/Desktop

    http://ffmpeg.org/ffmpeg.html#Video-and-Audio-grabbing 

    展开全文
  • 这章阐述如何把采集到的电脑屏幕和电脑声音,通过一些通用协议,比如RTSP,RTMP把电脑桌面屏幕推送到更广泛的直播服务器上,达到电脑屏幕直播的效果。或者把电脑屏幕保存成本地的MP4或MKV视频...
                                                                                                       by fanxiushu 2018-07-10 转载或引用请注明原始作者。
    前面文章分别阐述了,如何抓取电脑屏幕数据,如何采集电脑声音,
    如何实现在现代浏览器中通过HTML5和WebSocket直接进行远程控制。

    这章阐述如何把采集到的电脑屏幕和电脑声音,通过一些通用协议,
    比如RTSP,RTMP把电脑桌面屏幕推送到更广泛的直播服务器上,达到电脑屏幕直播的效果。
    或者把电脑屏幕保存成本地的MP4或MKV视频文件。

    其实 https://github.com/fanxiushu/xdisp_virthttps://download.csdn.net/download/fanxiushu/10168823 提供的程序,
    其中xdisp_server.exe中转服务器,本身就是个直播服务器的效果。
    只不过xdisp_server.exe不但能直播屏幕和声音,还能远程控制,实时性要求也更高。
    还能直接在网页中播放,只是使用的是自己定义的私有通讯协议。

    为了把我们的电脑屏幕无私的共享出去,而且让别人更好的中转,加速,就得使用一些比较广泛使用的协议,
    比如RTSP, 这个一般在视频监控领域用得比较多,实时性要求也比较高,不过我在内网测试下来,总有几秒的延迟。
    播放器使用VLC, RTSP是在linux上架设的 easydarwin 测试服务器,当然也就是随便架设,没做什么优化。
    也可能播放的屏幕尺寸太大,是 2560X1600 的视频尺寸。
    另一个RTMP协议在当前互联网直播推流中用得很多,linux我使用的是nginx+rtmp_module,这个的延时就更加糟糕,
    最差能达到十几秒的延迟。而且是越播放越往后延迟。当然都是属于测试性质的架设这些服务器,主要是为了测试开发
    RTSP,RTMP推流客户端。

    RTSP,RTMP这类协议的开源库不少,这里并不打算介绍通讯协议细节。也没仔细去研究过这些通讯协议。
    无非就是在TCP或UDP链接中,以一个一个的数据包分界的方式,传递视频帧或者音频帧。
    这在我们自己定义的私有通讯协议中也是这么做的,比起研究这些通用协议格式,
    更愿意自己来实现,因为更加灵活,就比如xdisp_virt.exe远程控制程序里,在一条TCP链接里,不单传输音视频帧,
    还传输鼠标键盘数据包,还传输各种控制信息数据包,以及其他需要的数据包,想想都挺热闹的。

    一开始使用的是librtmp开源库,因为当时只局限于实现RTMP推流,没考虑其他的,
    只是等使用librtmp实现了之后,发现使用VLC播放,总是只找到音频流,没有视频,试了多次都是这样。
    当时找不到原因(其实后来找到原因是因为设置的关键帧间隔太大,
    足有800这么大,这在我的私有通讯协议中没问题,因为发现缺少SPS,PPS。都会通知被控制端重新刷出关键帧。),
    也就打算放弃使用librtmp库,另外使用其他开源库,后来发现ffmpeg也能实现rtmp推流,
    再仔细查看ffmpeg,发现不但能rtmp推流,还能rtsp推流,http推流,还能保存到本地mp4,mkv等多种格式的视频文件。
    既然有这么多这么强大的功能,干嘛死抱着librtmp不放。
    而且把桌面屏幕保存到本地视频文件,一直都是我想做的事,苦于自己对这些MP4封装格式不大了解。

    使用的是ffmpeg的3.4的版本,在这个版本中的 doc/example 目录中的 muxing.c 源代码,就是实现如何推流的例子。
    之所以取名 muxing.c, 在ffmpeg开发团队看来,rtmp,rtsp这些推流,其实也是把音频和视频混合成一定格式”保存“。
    跟本地MP4等文件一样的概念。正是这样的做法,我们可以在muxing.c中,
    使用的ffmpeg统一的API函数,既可以把音视频保存到本地多种格式的文件,
    也可以实时的以rtmp,http,rtsp等多种方式推送到流媒体服务器端,非常的方便。

    muxing.c例子代码中,输入原始YUV图像数据或原始声音数据,然后编码,然后混合写入文件或者推流,一气呵成。
    但是我们这里需要的功能是只需要把已经编码好的音视频(H264和AAC)数据帧,直接写入混合器。
    而且要实现可以同时朝多个混合器写数据。也就是我们可以同时保存到本地MP4文件,
    也同时可以朝多个RTSP或RTMP服务器做推流。

    如下图的配置界面,就是最新版本xdisp_virt程序做的推流的网页方式的配置界面:


    图中设置了三个推流地址,分别朝RTSP, RTMP服务器推送音视频,同时保存到d盘的t.mp4视频文件中。
    在我们的xidsp_virt远程桌面控制程序中,编码好的桌面图像数据和声音数据,
    一边要发送给多个WebSocket通讯的网页客户端,一边要发送给多个原生客户端(当然还包括发送给中转服务端),
    现在还要发送给RTMP,RTSP,同时保存到本地文件等,
    如果朝每个终端发送音视频流都做一次编码,是不现实的。这就是为何要把muxing.c例子代码里边的编码部分剥离出去,
    只保留把编码好的音视频帧直接写入混合器的功能。

    我们先来看看调用ffmpeg的API的流程,其实是挺简单,函数也不多:
    首先调用avformat_alloc_output_context2 创建AVFormatContext变量,最后一个参数就是推流地址,或者保存本地的完整路径,
    比如:
    AVFormatContext* ctx;
    avformat_alloc_output_context2(&ctx, NULL, "flv", "rtmp://192.168.88.1/hls/test"); // 以RTMP协议推送
    avformat_alloc_output_context2(&ctx, NULL, "rtsp", "rtsp://192.168.88.1/test"); // 以RTSP协议推送
    avformat_alloc_output_context2(&ctx, NULL,NULL, "d:\\Screen.mp4") ;   //保存到本地 Screen.mp4视频文件中。

    之后调用 avformat_new_stream 函数创建视频流和音频流,并且添加到ctx变量中。
    比如如下代码就是创建编码类型为H264和AAC的视频和音频流:

         AVOutputFormat *fmt = ctx->oformat;
        固定 H264 + AAC 编码
        fmt->video_codec = AV_CODEC_ID_H264;
        fmt->audio_codec = AV_CODEC_ID_AAC;
       
         codec = avcodec_find_encoder(AV_CODEC_H264);
         AVStream* st = avformat_new_stream( ctx, codec);
        ...... //其他初始化
       
        codec = avcodec_find_encoder(AV_CODEC_AAC);
         AVStream* st = avformat_new_stream( ctx , codec);
        ...... //其他初始化

       因为RTSP,RTMP都是网络通讯,网络环境复杂多变就必须面临一个通讯超时问题,写到本地磁盘倒不必关心这个。
       AVFormatContext结构提供了一个 interrupt_callback 变量,用来设置回调函数,我们可以设置这个回调函数,用来检测超时。
       如下设置:
       ctx->interrupt_callback.callback = interrupt_cb; // 这个是我们的回调函数,在此函数中用于检测写操作是否超时。
       ctx->interrupt_callback.opaque = this;  //
      
       如果不是写到本地磁盘,而是网络通讯,我们还必须调用avio_open2来初始化网络。如下所示:
      
        if (!(fmt->flags & AVFMT_NOFILE)) {
              以AVIO_FLAG_WRITE写方式打开,因为我们是推流,只写不读,stream_url 就是RTSP,RTMP的URL地址。
              ret = avio_open2(&ctx->pb, stream_url.c_str(), AVIO_FLAG_WRITE, &ctx->interrupt_callback, NULL );
        }
      
    初始化就这样完成了。接下来,需要把头信息写入,这时候调用 avformat_write_header 函数来写头部信息。
    写完头部信息,我们就可以不断调用av_interleaved_write_frame 或者 av_write_frame, 把已经编码好的视频帧和音频帧写入。
    ffmpeg底层框架会根据不同协议,做不同的推送处理。
    等推流结束了,调用av_write_trailer写入尾部信息,
    如果是写到本地视频文件,一定需要调用av_write_trailer,否则视频文件无法正常使用。

    以上流程应该是非常简洁明了的。
    在这里我们只需要ffmpeg的混合器功能,不需要打开编码器,因此与muxing.c例子不同的是,在avformat_new_stream创建流之后,
    不必调用avcodec_open2来打开具体的编码设备。
    既然不打开具体的编码设备,在调用avformat_write_header 写头部信息的时候,ffmpeg框架是不清楚要写哪些头部信息的,
    因此,我们在调用 avformat_write_header 前,必须还做些额外的工作:
    那就是填写 每个ffmpeg编码器的 extradata 字段,告诉ffmpeg,头部应该写些什么进去。
    比如对于H264编码的视频,我们应该填写 H264 AVCC 格式的extradata头,用来存储 SPS,PPS 。
    这个几乎是固定的填写方法,如下:
    假设SPS,PPS的buffer和长度分别是:sps_buffer,pps_buffer 和 sps_len,pps_len。
      
        AVCodecContext* c = video_stream->codec;  // video_stream 是avformat_new_stream创建视频流返回的AVStream对象。
        int extradata_len = 8 + sps_len + pps_len + 2 + 1;
        c->extradata_size = extradata_len;
        c->extradata = (byte*)av_mallocz(extradata_len);

        int i = 0;
        byte* body = (byte*)c->extradata;

        //H264 AVCC 格式的extradata头,用来存储 SPS,PPS
        body[i++] = 0x01;
        body[i++] = sps_buffer[1];
        body[i++] = sps_buffer[2];
        body[i++] = sps_buffer[3];
        body[i++] = 0xff;

        SPS
        body[i++] = 0xe1;
        body[i++] = (sps_len >> 8) & 0xff;
        body[i++] = sps_len & 0xff;
        memcpy(&body[i], sps_buffer, sps_len);
        i += sps_len;

        /// PPS
        body[i++] = 0x01;
        body[i++] = (pps_len >> 8) & 0xff;
        body[i++] = (pps_len) & 0xff;
        memcpy(&body[i], pps_buffer, pps_len);
        i += pps_len;

    对于AAC音频编码的extradata字段,则按照如下方式:
    假设声道数是audio_channel, 采样率序号是audio_sample_index,
    AAC编码方式(比如是LC,HEv1,HEv2等)是audio_aot, 这些参数都可以从 带有ADTS头的AAC编码数据里边解析出来。
    至于如何解析,可稍后查看我发布到CSDN或GITHUB上的源代码。

        // audio, ADTS头转换为MPEG-4 AudioSpecficConfig
        c = audio_stream->codec;    ///audio_stream是创建的音频流
        c->extradata_size = 2;
        c->extradata = (byte*)av_malloc(2);
        byte dsi[2];
        dsi[0] = ((audio_aot+1) << 3) | (audio_sample_rate_index >> 1);
        dsi[1] = ((audio_sample_rate_index & 1) << 7) | (audio_channel << 3);
        memcpy(c->extradata, dsi, 2);

    正确填写 音频和视频对应的extradata字段之后,就可以放心的调用 avformat_write_header函数写入头部信息。
    这个时候ffmpeg框架判断如果是rtsp,rtmp之类的则开始建立链接,发送各种初始化信息,和头部信息。
    如果是写本地视频文件,则写入视频头信息到文件。

    然后,我们就开始调用 av_interleaved_write_frame 函数真正的写已经编码好的H264视频帧和AAC音频帧了。
    再开始H264帧前,先了解一些基本概念。

    H264视频码流目前有两种打包模式:一种是Annex-B的打包格式,另一种是AVCC打包格式。
    Annex-B是传统的打包格式,绝大部分H264编码器和解码器都支持这种格式。在实时传输上用得很多,
    我们使用x264,openh264默认都是编码出这种打包格式。
    AVCC这种打包格式主要用在文件存储上,比如存储成MP4,MKV等文件,
    而在RTSP,RTMP这类通讯协议上,也必须采用AVCC格式。
    两者的主要区别:
    我们知道,H264是以NALU包来存储每个slice分片,每个H264帧,可能存储多个slice,
    也就是可能每帧H264编码的视频数据,可以包括一个NALU或者多个NALU。
    Annex-B打包格式是以00 00 01(三个字节)或者00 00 00 01(四个字节)开始码来分隔NALU,
    而且把SPS,PPS也打包在一起,也是以开始码分隔。
    在AVCC格式中,每个NALU前面是4个字节来表示这个NALU的长度,
    而SPS,PPS是分开来存储,存储格式就是上面填写ffmpeg的extradata字段采用的存储格式。

    同理,AAC音频也是差不多的,我们在实时传输时候,一般都会编码出带ADTS头部的AAC数据,
    而在存储文件或者推送 RTMP,RTSP协议的时候,使用的是  MPEG-4 AudioSpecficConfig 格式,因此一样需要做转换。

    这里需要提示一下,ffmpeg有个自带的AAC编码器,它编码的AAC数据默认是不带 ADTS头部的,
    我们一般采用的是fdk-aac库,这个库编码AAC是可以带ADTS头部的。

    在这里,输入的实时H264码流都是Annex-B标准格式,而且是每个IDR帧(关键帧)前都会有SPS,PPS。
    输入的实时AAC码流,都是带ADTS头部的。
    我们都会在内部处理的时候对这种格式转换到RTSP, RTMP推流和本地文件识别的格式,
    具体解析处理办法,可查看稍后发布到CSDN或GITHUB上的代码。

    似乎一切都妥当了,拿到已经编码好的数据,直接调用 av_interleaved_write_frame  写入就可以了,
    其实还有一个大麻烦,就是PTS的问题,音频和视频同步的问题。
    这是很讨厌的问题。
    PTS我们必须手动计算, 计算这个倒也不难,
    我们在开始推流的时候,就是调用avformat_write_header 函数之后,记录开始时间 start_time=av_gettime(); //单位是微妙
    然后每个实时音频或视频包到达时间 curr = av_gettime(); 这样计算PTS:(下面是视频PTS)
    pts = (curr - start_time  )*1.0/1000000.0/av_q2d(video_stream->time_base);//video_stream是创建的视频流

    接下来的就是同步的问题了。
    我们推流的是桌面屏幕和是电脑内部声音,这跟一般的一直在动的视频不大一样。
    有可能长时间,电脑屏幕都没任何变化;很长时间,电脑都不发一声响声。

    一般采用同步方法基本如下三种:
    1,以视频为准,就是让视频以恒定的速度,比如30帧每秒,音频根据视频速度来定位。
    2,以音频为准,让音频以恒定速度,比如每秒48000的采样率,视频根据音频来定位。
    3,以外部的某个时钟为准来同步。
    除第三个办法不知道该怎么操作外,1, 2都比较好理解。
    如果按照1 的办法,显然不大现实,因此只好采用第2种办法,让音频以恒定速度传输。
    既然是让音频以恒定速度传输,也就是时时刻刻都有数据帧,而电脑内部可能很长时间都没有发声。
    也就是没声音数据。这个时候,我们就得造假了,在这段时间内,我们就得连续不断的制造静音帧。

    以AAC编码为例,AAC编码的每个sample的大小是固定为1024,
    比如是双声道,16位采样,则每次都需要输入固定 1024*2*2=4096字节大小的数据,才能编码出一帧AAC的数据。
    也就是我们造假,每次都输入4096大小的空白数据(就是全是0)让它编码出一帧静音AAC帧。
    我们再来计算每一帧AAC数据播放的持续时间。
    假设还是双声道,16位采样。
    假设每秒48000的采样率,则每秒可以制造2*2*48000字节 = 192000字节 的PCM原始声音数据。每帧AAC是4096字节,我们做除法。
    4096/192000 = 0.0213秒=21.3毫秒。
    在48000采样率的情况下,每帧AAC数据的播放持续时间大约是21毫秒。
    也就是我们每隔21毫秒就要制造一个静音AAC帧推送出去,这样在没有外部声音的情况下,才能保证声音的持续不断。

    在windows平台,可以使用timeSetEvent 函数来达到精确定时。
    如下伪代码:
       
        timeSetEvent( 30 , 10, audioTimer, (DWORD_PTR)this,
                        TIME_PERIODIC | TIME_KILL_SYNCHRONOUS | TIME_CALLBACK_FUNCTION);
         ///
       void  CALLBACK audioTimer(UINT uID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2){
                int64_t cur = av_gettime(); ///
               
                int max_cnt = 4;
                Lock();
                int64_t step = (int64_t)1024 * 1000 * 1000 / audio_sample_rate; // us,每个AAC压缩帧播放的时间
                int64_t last = max( cur - max_cnt*step, last_audio_timestamp + step );
               ///
               strm_pkt_t pkt; memset(&pkt, 0, sizeof(pkt));
               pkt.type = AUDIO_STREAM;
               pkt.data = audio_mute_data; ///已经编码好的AAC静音帧
               pkt.length = audio_mute_size;
               pkt.rawptr = NULL;
               /
               while (last <= cur -step ) {
                     ///
                     pkt.timestamp = last;
                     last_audio_timestamp = last;

                    
                     post_strm_pkt(&pkt); 投递AAC帧
                     /
                    last += step;
               }
               Unlock();
      }

    具体可查询稍后发布到CSDN或GITHUB代码工程。

    至此,我们利用ffmpeg实现了RTSP, RTMP推流,以及保存到本地MP4或MKV视频文件。


    源代码下载:

     GITHUB下载地址:

    https://github.com/fanxiushu/stream_push

    CSDN下载地址:

    https://download.csdn.net/download/fanxiushu/10536116


    展开全文
  • 之前我就介绍了OBS推流软件结合我们的流媒体直播服务器如何进行推流直播,我们的流媒体服务器就能够用OBS推流直播,是个非常便捷的工具。那么本篇就为大家介绍下OBS推流录屏或直播的流程。 1、我们首先要下载软件,...
  • 推流和拉流

    千次阅读 2020-05-12 10:53:26
    整个直播过程主要涉及到采集、处理、编码、封装、推流、传输、解码等一系列过程,推流是指使用推流工具等内容抓取软件把直播内容传输到服务器的过程。 经过输出设备(AVCaptureVideoDataOutput)得到原始的采样数据–...
  • OBS 电脑推流直播指南

    千次阅读 2020-11-03 21:24:11
    文章目录前言一、系统环境要求二、下载安装 OBS 软件二、设置 OBS1、分辨率配置2、编码输出设置3、推流设置4 保存配置四、 关闭电脑音频输入捕获五、 添加媒体来源五、 开始推流六、 预览实时直播七、常见问题1....
  • 创建完成后,点击获取推流地址,这时候要微信管理员扫码才能获得地址,推流地址如下图所示,这个地址在OBS推流软件里是分成两部分的,第一部分是下图红框里的地址,到单词“live”那里;第二部分是推流秘钥,也..
  • 那么移动端要如何进行推流呢,视频直播提供了Android、IOS推流SDK,用户可以使用对应的SDK进行推流,本文旨在让读者可以按照文章快速的应用Android推流SDK进行推流并且了解常见推流参数的设置。 1)Android Studio...
  • 这里写自定义目录标题视频的推流与拉流webrtc 视频的推流与拉流 拉流是指服务器已有直播内容,用指定地址进行拉取的过程。 推流指的是把采集阶段封包好的内容传输到服务器的过程,其实就是将现场的视频信号传到网络...
  • 作者:七牛云 ... 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非...推流是直播的第一公里,直播的推流对这个直播链路影响非常大,如果推流的网络不稳定,无论我们如何做优化,观众的体验都会很糟糕。
  • 视频直播的 推流是啥意思

    千次阅读 2020-09-02 13:39:06
    昨晚和死党聊天的时候听他听到推流这个东西,然后就找了下资料了解了一下,这儿做个简单的随笔记录           推流         ...
  • NODEJS基于FFMPEG视频推流测试

    千次阅读 2017-11-17 11:40:05
    本文仅使用ffmpeg基础功能,拉流、转码、推流及简单播放设置。 工作流程 拉取远端视频流,视频流格式为 rtsp 转换为常用播放格式 rtmp 推送至播放端口 rtmp://您的推送端地址,用户使用播放软件连接该地址后可以直接...
  • 基础知识 推流是指将音视频数据采集编码之后,推送到您指定的视频云平台上...腾讯视频云 SDK 主要帮您解决在智能手机上的推流问题,它的接口非常简单易用,只需要一个推流URL就能驱动: 特别说明 不绑定腾讯云...
  • 又名 基于rstp的录屏直播 上篇文章 步骤: 1.下载lib到本地,然后依赖 RtspServerAndVlcPlay ...如果只是推流端,只需要依赖 rtsplibrary 如果只是播放端,只需要依赖 libvlc-android 重点声明: rtspli...
  • OBS第三方推流直播教程

    千次阅读 2018-05-07 15:04:00
    1、当使用YY客户端进行直播遇到问题,暂无解决方法的时候,可以使用第三方直播软件OBS进行推流。   2、对OBS情有独钟的主播。   OBS简介:   OBS是一款比较好用的开源直播软件,目前支持的操作系统包括:...
  • 视频直播技术详解之推流和传输

    万次阅读 2016-09-09 11:36:50
    声明:本文为CSDN原创投稿文章,未经许可,禁止任何形式的转载。 作者:七牛云 责编:钱曙光,关注架构和算法领域,寻求报道或者投稿请发邮件...七牛云于6月底发布了一个针对视频直播的实时网络LiveNet和完...
  • OBS推流工具使用说明

    千次阅读 2020-07-21 09:16:13
    一、软件介绍 1.1、什么是OBS ​    Open Broadcaster Software(简称OBS)是目前市面上最好用的直播软件,支持 OS X、Windows、Linux操作系统,适用于多种直播场景。 ​    国外软件有中文无广告全免费...
  • obs推流视频比特率 OBS是现在直播视频的主要内容之一。 它是流向Twitch(周围最受欢迎的实时视频网站之一)的首选软件。 有一些非常不错的附加组件,使直播人员可以在不中断正在运行的视频的情况下,通过手机或其他...
  • Qt开发: Qt5使用VLC库推流-- 共享桌面

    千次阅读 2017-08-08 10:22:20
    此文章是做一个小例子,在Qt5环境下,通过vlc将桌面共享出去,也就是将桌面推流 Qt5如何使用vlc在这里就不讲了,可以看博客 直接上代码: libvlc_instance_t *vlc; const char *sout = "#transcode{vcodec=h264...
  • 3、网站推流 4、虚拟摄像头 网上搜索并安装虚拟摄像头插件(OBS-Virtual-Cam)插件 重启OBS后再工具里面打开 5、回音调试 设置里面所有设备都打开,然后关掉声音只留一个 接着在obs和windows中关掉所有的侦听 ...
  • vlc命令行: 转码 流化 推流

    千次阅读 2018-01-10 14:33:00
     VLC不仅仅可以通过界面进行播放,转码,化,也可以通过命令行进行播放,转码和化。还可以利用里面的SDK进行二次开发。 vlc命令行使用方法:  1,安装最新版的vlc1.0.3版  2,打开cmd,进入vlc
  • 腾讯直播——推流SDK(Android)

    万次阅读 2017-06-02 20:53:38
    腾讯视频云RTMP SDK由两部分构成:推流器 + 播放器,本文将主要介绍推流器的相关信息。 该SDK遵循标准RTMP视频推送协议,可以对接包括腾讯云在内的标准视频直播服务器。与此同时,SDK内部囊括了腾讯音视频团队...
  • 的确,在我们进行Windows平台RTMP推送模块开发之前,市面上为数不多的Windows平台RTMP推流工具当属OBS了,不得不说,OBS是一款很好用的直播软件,它的优势在于,几乎可以直播所有直播平台,不需要每个直播平台都下载...
  • 更新目志: 2021.4.11:支持dxgi捕获桌面,使用硬件加速,cpu占用低,游戏画面...2.支持桌面推流,游戏直播清晰流畅。 3.支持麦克风及电脑声音切换,音视频同步。 4.视频清晰流畅,延迟500ms左右,带宽占用仅1M左右,

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,398
精华内容 6,159
关键字:

屏幕推流软件