windows平台ffmpeg学习笔记(一)

本文涉及的产品
视频点播 VOD,流量+存储+转码
简介: 笔记

一、音视频基础


  1. mux封装:复用,按一定格式组织原音视频流,例如进行时间同步等
    demux解封装:解复用,按一定格式解出音视频流
  2. ES流,原始流,直接从编码器出来的数据流。
    PES流,P(packet),ES形成的分组称为PES分组,是用来传递ES的一种数据布局。
    TS流:ES形成的分组称为TS分组,是用来传递ES的一种数据布局。可以被任意截断
    rtsp流:RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议
    体系中的一个应用层协议。
    rtmp流:Real Time Messaging Protocol(实时消息传输协议),是abobe公司的协议
    hls流:苹果流,是Apple的动态码率自适应技术。主要用于PC和Apple终端的音视频服务。
    包括一个m3u8索引文件,TS媒体分片文件。
  3. 服务端:为客户端提供服务,提供数据服务
    客户端:为客户提供本地服务
    流媒体:采用酒店式传输方式在Internet播放的媒体格式。
  4. 推模式:当通知消息来之时,把所有样信息都通过参数的形式"推给"观察者
    拉模式:当通知消息来之时,通知的函数不带任何相关的信息,而是要观察者主动
    去"拉"信息
    实时流:Real Time stream实时传输的音视频流


二、FFmpeg基础


  1. 开源库,支持Windows,Android,IOS等
  2. 音视频处理
  3. 开发语言C
  4. 源码下载:https://ffmpeg.zeranoe.com/builds/win64/static/
    可以下载源码,动态库,静态库等
  5. 基础流程:
    input file---demuxer--->encoded data packets---decoder--->decoded frames---encoder--->encoded data packets---muxer--->output file
  6. 为什么用ffmpeg?例如手机获取rtsp视频流保存到本地,要实现以下方案:
    1)实现rtsp客户端,接收音视频包
    2)解视频包(rtp->h264)
    3)解音频包(rtp->PCM(alaw))
    4)音频转码(PCM->AAC)
    5)重新封装音视频包
    而ffmpeg的调用流程:
    1)avformat_open_input   打开文件
    2)avforamt_find_stream_info     读取文件格式信息
    3)av_read_frame
    4)avforamt_alloc_output_context2 创建输出上下文
    5)av_write_frame    写输出


三、环境搭建


  1. 下载源码,下载windows源码及动态库
  2. 新建VS项目,把源码中的include文件夹下面的头文件,lib下面的静态库.lib,以及下载的动态库中的dll库文件拷贝到工程目录下
    分别新建include,lib,bin目录存放。
  3. 项目中引入静态库:
    A、添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录:加上头文件存放目录。
    B、添加文件引用的lib静态库路径:工程---属性---配置属性---链接器---常规---附加库目录:加上lib文件存放目录。
    C  然后添加工程引用的lib文件名:工程---属性---配置属性---链接器---输入---附加依赖项:加上lib文件名
  4. 写测试代码,例如引入extern "C" {#include "libavcodec/avcodec.h"},main方法调用av_register_all(),运行报错找不到dll动态库,
    这时需要把动态库拷贝到工程目录的运行目录,也就是生成.exe的目录。
  5. 注意,ffmpeg是C语言开发的,而VS工程是cpp语言,所以引入头文件应该使用extern "C"
    Demo源码的github地址


四、保存网络流到本地


ffmpeg基本工作流程:

50.png



ffmpeg方法流程:

1. avformat_alloc_context();//创建输入上下文
2. avformat_open_input();  //打开输入流
3. avformat_find_stream_info();  //查找音视频信息
4. avforamt_alloc_output_context2();  //创建输出上下文 
5. avio_open();  //打开avio
6. avformat_new_stream();  //从输入流创建输出流
    avcodec_copy_context();  //拷贝到输出流,根据nb_streams循环
7. avformat_write_header();  //写头信息
8. while(true){
        av_init_packet(); //初始化packet,用来存放编码过的数据
        av_read_frame();//读取帧数据
        av_interleaved_write_frame();//写数据
    }
9. avformat_close_input();//关闭输入输出流
    avcodec_close();

一些异常处理:

  1. ffmpeg avformat_open_input always returns “Protocol not found” rv=(-1330794744),在初始化的时候忘记调用av_register_all();
  2. VS引发了异常: 读取访问权限冲突,这是数组越界报的错误,点击调用堆栈可以跳到出错位置。

关于RTSP流:

RTSP流地址可以在网上查找,应该有很多的,当然也不仅仅限于rtsp,其它形式的流也是可以的,我使用的是:rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov,是可以使用的,但是过一段时间就不确定了,所以还是要多找找。如果不确定某个网络流是否可用,可以ping一下IP或者网址,也可以使用potPlayer打开,能ping通或者可以播放就证明流地址没问题。

下面附上本章的Demo github地址


五、网络流转发


网络流转发的基本流程与上一章的网络流保存到本地类似,只不过最后输出是网络流。基本流程如下:

51.png


转发网络流到本地UDP端口

  1. 基于四章的工程,只需要修改OpenOutput(outputUrl)的地址即可,代码如下:

//写到udp端口
OpenOutput("udp://127.0.0.1:1234");     //打开输出流
  1. 还记得刚开始下载的ffmpeg的动态库吗,里面的bin目录下有ffplay.ext文件,这时使用cmd执行ffplay.exe udp://127.0.0.1:1234,来测试转发,
    但是报了如下错误:

[udp @ 00000173c61ab540] bind failed: Error number -10048 occurred
udp://127.0.0.1:1234: I/O error

这是因为OpenOutput方法中的如下代码导致的:

ret = avio_open2(&outputContext->pb, outputUrl.c_str(), AVIO_FLAG_READ_WRITE, nullptr, nullptr);

我们其实只需要写权限即可,改成如下:

ret = avio_open2(&outputContext->pb, outputUrl.c_str(), AVIO_FLAG_WRITE, nullptr, nullptr);

再次重新运行就能播放转发的UDP流了。如下图所示:


52.png


红箭头指的窗口即为从UDP端口读取的流数据进行播放。

  1. 当然也可以使用其它播放器进行测试,我使用PotPlayer测试的,如下:
    打开输入地址:播放效果:
  2. 2.png

3.png


3.png

转发为RTMP流

需要修改两个地方:

  1. 修改OpenInput的地址

OpenOutput("rtmp://127.0.0.1:1935/live/stream0");       //打开输出流
  1. 修改OpenInut方法中avformat_alloc_output_context2中的视频格式为flv

int ret = avformat_alloc_output_context2(&outputContext, nullptr, "flv", outputUrl.c_str());

另外如果要转发rtmp流,需要打开rtmp server,关于rtmp server的详情后面再述,现提供一个现成的可执行文件下载地址,打开crtmpserver.exe后,再使用ffplay.exe或者potplayer等播放器测试即可。

附上本节github源码地址,upd-stream分支是转发为udp的,master是转发为rtmp的。

使用ffmpeg的命令行实现上述功能

其实ffmpeg的命令行即可完成我们所做的保存网络流,网络流转码等功能。

进入下载的动态库的bin目录下cmd执行:

  1. 保存网络流命令

./ffmpeg.exe -i rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov -vcodec copy -acodec copy -f mpegts C:/Users/bian/Desktop/test2.mp4

命令解释:

-vcodec copy  表示视频格式直接拷贝,不做转码

-acodec copy  表示音频格式直播拷贝,不做转码

-f mpegts  表示输出格式

最后加保存文件路径

2.转发为UDP流

./ffmpeg.exe -i rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov -vcodec copy -acodec copy -f mpegts udp://127.0.0.1:1234
  1. 转发为rtmp流
    注意在转发前也要先运行crtmpserver.exe

./ffmpeg.exe -i rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov -vcodec copy -acodec copy -f flv rtmp://127.0.0.1:1935/live/stream0


目录
相关文章
WK
|
12天前
|
存储 JavaScript 前端开发
如何在Windows平台上手micro:bit
micro:bit是一款口袋大小的可编程计算机,使用ARM处理器,跨平台兼容性强,适用于青少年学习编程。通过USB接口轻松连接Windows电脑,找到“MICROBIT”文件夹开始互动。提供MakeCode(支持拖拽编程及JavaScript)和MicroPython平台,满足不同编程需求。创建项目后,下载.hex文件至micro:bit,即可运行程序,展现创意成果。
WK
22 1
|
15天前
|
Windows
Windows平台如何修改监听的服务名称?
【8月更文挑战第15天】在Windows平台上可透过注册表编辑器、命令提示符或第三方工具修改服务的显示名称。首先,通过注册表编辑器找到`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services`下的目标服务,修改其“DisplayName”键值。或者,在命令提示符中使用`sc config`命令来变更服务名称。此外,利用第三方工具如Windows Service Manager也能简化此过程。修改前请确保了解可能的影响并做好备份。
|
1天前
|
编解码 开发工具 数据安全/隐私保护
如何快速实现Windows平台屏幕摄像头采集并推送RTMP|轻量级RTSP服务能力?
一个好的推送模块,除了实现高效率的编码传输外,还要有好的音视频采集机制和灵活的架构支持,便于后期功能扩展,比如实时快照、预览、实时录像等。除此之外,还要有好的交互机制(比如envent callback)、低延迟和长期运行稳定的性能。
|
17天前
|
XML C# 数据格式
绝密档案曝光!Windows平台如何深挖一个dll背后的神秘依赖,揭露隐藏的秘密!
【8月更文挑战第14天】在Windows系统中,动态链接库(DLL)对程序运行至关重要。了解DLL的依赖关系有助于软件的调试与优化。本文以具体案例演示如何查看DLL依赖。首先确保环境已安装Windows及具备基本开发知识。
31 0
|
17天前
|
编解码 开发工具 C#
[大牛直播SDK]Windows平台RTMP直播推送模块功能设计
大牛直播SDK采用全自研框架,具备高度可扩展性与自适应算法,显著降低延迟并提高采集编码效率。SDK以模块化设计,支持RTMP推流及多种音视频编码格式(如AAC、SPEEX、H.264、H.265),并能与播放器SDK组合实现丰富功能,包括流媒体转发、内置RTSP服务等。提供了详尽的参数配置选项,支持多摄像头、屏幕采集与水印叠加,并兼容Windows 7及以上操作系统。该SDK以C++/C#双接口形式提供,集成简便,同时包含调试与发布版本库,便于开发者快速上手。此外,支持断网重连、实时预览及多种编码前后的数据对接需求。
|
3月前
|
编解码
FFmpeg开发笔记(三十三)分析ZLMediaKit对H.264流的插帧操作
《FFmpeg开发实战》书中3.4.3节讲解如何将H.264流封装成MP4。H.264流通常以SPS→PPS→IDR帧开始,这一说法通过雷霄骅的H264分析器得到验证。分析器能解析H.264文件但不支持MP4。ZLMediaKit服务器在遇到I帧时会自动插入SPS和PPS配置帧,确保流符合标准格式。若缺少这些帧,客户端拉流时会报错。FFmpeg开发实战:从零基础到短视频上线》书中提供了更多FFmpeg开发细节。
67 0
FFmpeg开发笔记(三十三)分析ZLMediaKit对H.264流的插帧操作
|
13天前
|
JavaScript 前端开发 Java
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
IT寒冬使APP开发门槛提升,安卓程序员需转型。选项包括:深化Android开发,跟进Google新技术如Kotlin、Jetpack、Flutter及Compose;研究Android底层框架,掌握AOSP;转型Java后端开发,学习Spring Boot等框架;拓展大前端技能,掌握JavaScript、Node.js、Vue.js及特定框架如微信小程序、HarmonyOS;或转向C/C++底层开发,通过音视频项目如FFmpeg积累经验。每条路径都有相应的书籍和技术栈推荐,助你顺利过渡。
37 3
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
|
14天前
|
Web App开发 Android开发
FFmpeg开发笔记(四十六)利用SRT协议构建手机APP的直播Demo
实时数据传输在互联网中至关重要,不仅支持即时通讯如QQ、微信的文字与图片传输,还包括音视频通信。一对一通信常采用WebRTC技术,如《Android Studio开发实战》中的App集成示例;而一对多的在线直播则需部署独立的流媒体服务器,使用如SRT等协议。SRT因其优越的直播质量正逐渐成为主流。本文档概述了SRT协议的使用,包括通过OBS Studio和SRT Streamer进行SRT直播推流的方法,并展示了推流与拉流的成功实例。更多细节参见《FFmpeg开发实战》一书。
33 1
FFmpeg开发笔记(四十六)利用SRT协议构建手机APP的直播Demo
|
21天前
|
Web App开发 5G Linux
FFmpeg开发笔记(四十四)毕业设计可做的几个拉满颜值的音视频APP
一年一度的毕业季来临,计算机专业的毕业设计尤为重要,不仅关乎学业评价还积累实战经验。选择紧跟5G技术趋势的音视频APP作为课题极具吸引力。这里推荐三类应用:一是融合WebRTC技术实现视频通话的即时通信APP;二是具备在线直播功能的短视频分享平台,涉及RTMP/SRT等直播技术;三是具有自定义动画特效及卡拉OK歌词字幕功能的视频剪辑工具。这些项目不仅技术含量高,也符合市场需求,是毕业设计的理想选择。
52 6
FFmpeg开发笔记(四十四)毕业设计可做的几个拉满颜值的音视频APP
|
20天前
|
编解码 Java Android开发
FFmpeg开发笔记(四十五)使用SRT Streamer开启APP直播推流
​SRT Streamer是一个安卓手机端的开源SRT协议直播推流框架,可用于RTMP直播和SRT直播。SRT Streamer支持的视频编码包括H264、H265等等,支持的音频编码包括AAC、OPUS等等,可谓功能强大的APP直播框架。另一款APP直播框架RTMP Streamer支持RTMP直播和RTSP直播,不支持SRT协议的直播。而本文讲述的SRT Streamer支持RTMP直播和SRT直播,不支持RTSP协议的直播。有关RTMP Streamer的说明参见之前的文章《使用RTMP Streamer开启APP直播推流》,下面介绍如何使用SRT Streamer开启手机直播。
45 4
FFmpeg开发笔记(四十五)使用SRT Streamer开启APP直播推流
下一篇
云函数