
音视频
文章平均质量分 82
步基
深耕音视频领域,系统架构
展开
-
TS流详解
TS流(Transport Stream)基于MPEG2标准开发的,是一种将视频、音频和其他数据打包成固定长度包(一般为188或204字节)的实时传输流(PS节目流用于存储)。这些包通过PID(Packet ID)进行标识,每个包包含一个包头和负载数据。传送流由一道或多道节目组成,每道节目由一个或多个原始流和一些其他流复合在一起,包括视频流,音频流,节目特殊信息流PSI和其他数据包。其中PSI表有4种类型:节目关联表(PAT)、节目映射表(PMT)、网络信息表和条件访问表。原创 2024-11-19 16:26:30 · 939 阅读 · 0 评论 -
mxf文件格式详解
MXF文件的逻辑模型是一种基于对象的数据结构,主要由头部元数据中的结构元数据定义。MXF文件也可包含一个可选的索引表(Index Table),该索引表可用于将基于采样的索引(如时码)快速换算到对应的要素容器在MXF文件中的偏移地址,以实现视音频的快速预览和定位。它使用可变长的字节来表示非常宽的长度范围,该域总是按MSB(高字节优先)编码,如果第一个字节的bit7为0,那么低7位代表了0~127范围的长度,如果bit7为1,那么低7位代表长度域的字节个数。原创 2023-05-04 19:47:45 · 6187 阅读 · 0 评论 -
编解码版税royalty和授权费license fee
h264授权费原创 2022-06-08 11:49:42 · 4249 阅读 · 1 评论 -
openmax用法
OpenMax是一个多媒体应用程序的框架标准。它自上而下分为三层,Application Layer, Integration Layer和Development Layer。应用层规定了应用程序和多媒体中间层的标准接口,使应用程序的移植性更好。集成层定义了多媒体组件的接口,使得多媒体框架能以一种统一的方式访问多媒体Codec和组件,以便在嵌入式流媒体框架中快速集成加速编解码器。开发层为Codec厂商和硬件厂商提供了一套API,使开发更加便捷。 ...原创 2022-05-17 22:29:27 · 3393 阅读 · 0 评论 -
ffmpeg时间戳和时间基
时间戳定义:当前时刻,单位是时间基。PTS(Presentation TimeStamp)是渲染用的时间戳,播放器会根据这个时间戳进行渲染播放DTS(Decoding TimeStamp)解码时间戳,在视频packet进行解码成frame的时候会使用到编码时一个GOP示例: I P P B P P B P P..由于有B帧双向参考,在编码之后的帧的时间顺序就会发生变化,导致PTS和DTS不一致。没有B帧时,两者相同。时间基时间基的表示:用秒来表示,比如(1/25)秒,(1..原创 2022-04-28 15:33:55 · 1515 阅读 · 0 评论 -
ffmpeg硬件加速
一 ffmpeg硬件加速原理就是采用硬件GPU对编解码进行处理需依赖以下环境:1 安装nvidia驱动:NVIDIA-Linux-x86_64-470.57.02.run2 安装cuda:cuda_10.2.89_440.33.01_linux.run安装完成后修改profile,将cuda中的bin目录写到path中sudo vi /etc/profileexport PATH=/usr/local/cuda/bin:$PATHnvcc -V 验证是否安装成功3 编原创 2022-04-18 15:47:54 · 4460 阅读 · 0 评论 -
obs-ndi-output.cpp
ndi推流,音视频延迟大,不同步,卡顿。参考obs-ndi推流代码。/*obs-ndiCopyright (C) 2016-2018 Stéphane Lepin <steph name of authorThis program is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public Licenseas published by the .原创 2022-04-07 18:18:40 · 721 阅读 · 0 评论 -
pcm音频音量调节
PCM16le双声道数据中左声道和右声道的采样值是间隔存储的。samples=44100Hz,采样位数是16bit,每个声道的一个采样值占用2Byte。“LE”代表Little Endian,代表2 Byte采样值的存储方式为高位存在高地址中。int CTransPic::simplest_pcm16le_halfvalueleft(char* url){ ifstream infptr; infptr.open(url, ios::in | ios::binary); of...原创 2022-03-14 18:48:52 · 993 阅读 · 0 评论 -
多路音频混音
实现混音时需要保证两道音频流的格式(采样率、位深和声道数)完全相同,若不同,需在混音前需要对原始音频数据进行重采样。ffmpeg命令:2个pcm混音,输入输出格式都相同:48k,双声道,16bitffmpeg -f s16le -ar 48000 -ac 2 -i 11.pcm -f s16le -ar 48000 -ac 2 -i 22.pcm -filter_complex amix=inputs=2:duration=first:dropout_transition=0 -f s16l..原创 2022-02-14 17:06:10 · 1917 阅读 · 0 评论 -
ffmpeg滤镜
ffmpeg简单滤镜 -vf:一个输入,对应一个输出;复杂滤镜 -filter_complex滤镜描述符规则“,” —— 前一个输出作为后一个输入“;” —— 表示两个滤镜为并列关系“:” —— 用于分割参数 Overlay 最常使用的滤镜;会以第一个输入为背景,后续的叠加到背景上; 用例:视频加logo ffplay -i logo.mp4 -vf "movie=logo.png,scale=64:64[water];[in][water]overla..原创 2022-02-09 11:51:56 · 3470 阅读 · 0 评论 -
ZLMediaKit接收ffmpeg rtmp推流
一 关键类 存放ffmpeg rtmp推流,demuxer,解码,重新编码后的rtppacket数据 template<typename T> class _RingStorage { public: typedef std::shared_ptr<_RingStorage> Ptr; _RingStorage(int max_size) { //gop缓存个数...原创 2022-02-01 21:44:45 · 2802 阅读 · 0 评论 -
ZLMediakit webrtc拉流
1 重点类 epoll管理多个socket连接 class EventPoller : public TaskExecutor, public AnyStorage, public std::enable_shared_from_this<EventPoller> { public: using Ptr = std::shared_ptr<EventPoller>; friend class TaskExecutorGet...原创 2022-01-29 21:55:22 · 3328 阅读 · 0 评论 -
webrtc sdp详解
SDP(Session Description Protocol)是一种通用的会话描述协议,主要用来描述多媒体会话,用途包括会话声明、会话邀请、会话初始化等。WebRTC主要在连接建立阶段用到SDP,连接双方通过信令服务交换会话信息,包括音视频编解码器(codec)、主机候选地址、网络传输协议等。协议版本号v=0会话发起者o=<username> <sess-id> <sess-version> <nettype> <ad原创 2022-01-21 22:24:50 · 2560 阅读 · 0 评论 -
h264 NAL解析
视频由frame组成,frame由slice组成。每一个Slice分为Slice header(用于保存Slice的总体信息)和Slice body组成(通常是一组连续的宏块结构或者宏块跳过信息),如下图所示:SI和SP:即Switch I和Switch P,是一种特殊的编解码条带,可以保证在视频流之间进行有效的切换,并且解码器可以任意的访问。比如,同一个视频源被编码成各种码率的码流,在传输的过程中可以根据网络环境进行实时的切换;1 slice headerfirst_mb_in_.原创 2022-01-16 21:59:09 · 3536 阅读 · 1 评论 -
ffmpeg编码:xavc 42210bit+mxf
AVC是高级视频编码的简称(Advanced Video Coding),也被叫做H264。代表产品有x264库。AVC有四种配置(profile)。分别是:Baseline、Extended、Main、High。XAVC符合H.264 Level 5.2标准。 官网ffmpeg.exe执行如下命令可以生成AVC的mxf文件,本人自编译64位ffmepg(带x264,x265)也可以生成mxf文件。命令如下:ffmpeg -i prores.mov -pix_fmt yuv4...原创 2022-01-15 18:27:16 · 3495 阅读 · 1 评论 -
音视频同步
视频:帧率,表示视频一秒显示的帧数。音频:采样率,表示音频一秒播放的sample数。声卡和显卡均是以一帧数据来作为播放单位,如果单纯依赖帧率及采样率来进行播放,在理想条件下,应该是同步的,不会出现偏差。一个AAC音频frame每声道1024个sample,一帧播放时长duration=(1024/44100)×1000ms = 23.22ms;一个视频frame播放时长duration=1000ms/24 = 41.67ms。理想情况下,音视频完全同步,音视频播放过程如下图所示:..原创 2022-01-14 22:13:22 · 1940 阅读 · 0 评论 -
rtp协议详解
RTP的头部格式版本号(V):2比特,用来标志使用的RTP版本。填充位(P):1比特,如果该位置位,则该RTP包的尾部就包含附加的填充字节。扩展位(X):1比特,如果该位置位的话,RTP固定头部后面就跟有一个扩展头部。CSRC计数器(CC):4比特,含有固定头部后面跟着的CSRC的数目。标记位(M):1比特,该位的解释由配置文档(Profile)来承担....原创 2022-01-12 13:54:51 · 12347 阅读 · 2 评论 -
ZLMediaKit流媒体服务器
公司搭建云导播台系统,0-1。本人先后调研了几个webrtc流媒体服务器框架:mediasoup:nodejs和c++开发各占一半janus:c开发插件,用docker镜像安装运行成功,自编译运行坑太多。ZLMediaKit:c++开发。信令部分需要单独开发,可以团队合作。编译运行一次成功,易用性好。win10+vscode+ remote ssh连接虚拟机192.168.2.205,截图下边4个箭头从左到右依次点击,根据提示选择选项。编译、调试程序非常方便。无需生成launch.json,原创 2022-01-08 17:19:16 · 8247 阅读 · 0 评论 -
音视频编解码之傅里叶变换和小波变换
傅里叶变换的核心是从时域到频域的变换,而这种变换是通过一组特殊的正交基来实现的。傅立叶变换使我们能通过频率成分来分析一个函数。任何信号(如图像信号)都可以表示成一系列正弦信号的叠加。傅立叶变换在实际中有非常明显的物理意义,设f是一个能量有限的模拟信号,则其傅立叶变换就表示f的谱。从纯粹的数学意义上看,傅立叶变换是将一个函数转换为一系列周期函数来处理的。从物理效果看,傅立叶变换是将图像从空间域转换到频率域,其逆变换是将图像从频率域转换到空间域。换句话说,傅立叶变换的物理意义是将图像的灰度分布函数变换为...原创 2022-01-05 11:31:46 · 2750 阅读 · 1 评论 -
ubuntu mediasoup搭建
sudo apt install nodejssudo apt install npmwangbuji@ubuntu:~/projects/mediasoup$ git clone https://github.com/versatica/mediasoup-demo.gitwangbuji@ubuntu:~/projects/mediasoup/mediasoup-demo$ git checkout v3 //切换分支wangbuji@ubuntu:~/projects/medias...原创 2022-01-02 22:20:49 · 1222 阅读 · 0 评论 -
linux c++ vscode 搭建流媒体服务器
1 ubuntu下载vscodehttps://code.visualstudio.com/Download原创 2021-12-25 21:26:27 · 1119 阅读 · 0 评论 -
多路视频混流
ffmpeg框架的avfilter模块可以实现多路视频合并,混音等功能。可以通过命令行和调用sdk方式实现。在libavfilter中, 一个filter可以包含多个输入、多个输出。下图是一个filtergraph的示例: 在这个滤镜链图中,利用split滤镜把输入流分离成了两路流,其中一路通过crop滤镜和vfilp滤镜的同一路级联应用,再同另外一路一起通过overlay滤镜处理的流合成进行输出。命令行实现:ffmpeg -i INPUT -vf "split [main]...原创 2021-12-23 14:26:20 · 1083 阅读 · 0 评论 -
音视频推流
推流方式有ffmepg,obs,ndi等,本篇主要介绍ffmepg方式推流。通常我们将采集的yuv/rgb raw和pcm数据编码成h264/aac,写mp4文件。推流将outfile改成url即可,本质是一样的。运行以下代码前,需提前运行服务器(需推流到服务器),并提供推流地址,例如:rtmp://,rtp//等。#include <stdio.h>#define __STDC_CONSTANT_MACROSextern "C"{ #include &l...原创 2021-12-17 15:19:19 · 1281 阅读 · 1 评论 -
win10 编译x265
之前介绍的win10 编译x265,通过minGW模拟linux环境编译。本次编译x265步骤如下:(本人使用vs2019)x265源码下载:https://bitbucket.org/multicoreware/x265/downloads/复制链接地址,迅雷下载。https://cmake.org/download/cmake->configure->generate,都默认即可生成x265.sln解决方案编译结果:...原创 2021-12-15 16:58:00 · 455 阅读 · 0 评论 -
音频基本概念
1. 采样率 采样设备每秒抽取样本的次数,每秒多少个sample;倒数表示每个sample多少秒。 声音是连续的模拟信号,采样设备每秒采样48k次,相当于做了量化处理,对一个音频曲线在1秒区间内划分48k个子区间,每个区间取一个点。划分区间越多,越接近一条完整的曲线。量化操作会损失一部分信号。2.音频格式及量化精度(位宽) 每种音频格式有不同的量化精度(位宽),位数越多,表示值就越精确,声音表现自然就越精准。图像颜色空间同样有位宽,例如RGB888,每个像素有rgb三种颜...原创 2021-12-15 11:32:59 · 2629 阅读 · 1 评论 -
熵编码概述
一、熵编码基本原理 熵编码即编码过程中按熵原理不丢失任何信息的无损编码方式,也是有损编码中的一个关键模块,处于编码器的末端。信息熵为信源的平均信息量(不确定性的度量)。常见的熵编码有:香农(Shannon)编码、哈夫曼(Huffman)编码,指数哥伦布编码(Exp-Golomb)和算术编码(arithmetic coding)。由于熵编码的是编码器通过量化、变换、运动、预测等一系列操作之后得到的需要编码的符号,根据编码符号的分布情况选择适合的熵编码模型,因此熵编码是一个相对独立的单...原创 2021-12-13 10:26:21 · 7630 阅读 · 1 评论 -
ffmpeg RGB raw数据H264编码写mp4
extern "C"{ #include <libavformat/avformat.h> #include <libswscale/swscale.h>}#include <iostream>using namespace std;#pragma comment(lib,"avformat.lib")#pragma comment(lib,"avcodec.lib")#pragma comment(lib,"avutil.lib")...原创 2021-12-12 12:31:58 · 771 阅读 · 0 评论 -
x264详解
x264默认是基于帧的线程,比基于切片的吞吐量更好帧线程添加帧等待时间是需要不同的帧上工作x264最大线程数128,一般控制16个线程以内。在基于片段线程的情况下,所有线程都在同一帧上工作。每个帧都被分割成片,每个片在一个核上编码,然后结果一起做出最终帧。一 码率控制 X264提供三种码率控制的方式:bitrate, qp, crf。这三种方式是互斥的,使用时设置其中之一即可。(1)bitratex264会尝试把给定的位元率作为整体平均值来编码。这意味着最终编码...原创 2021-12-11 21:40:36 · 11482 阅读 · 0 评论 -
ffmpeg新旧函数对比
从FFmpeg 3.0 开始 , 使用了很多新接口,对不如下:1. avcodec_decode_video2() 原本的解码函数被拆解为两个函数avcodec_send_packet()和avcodec_receive_frame() 具体用法如下:old:avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, pPacket);new:avcodec_send_packet(pCodecCtx, pPacket);a原创 2021-12-10 11:59:55 · 4554 阅读 · 3 评论 -
ffmpeg编译--configure参数配置
Usage: configure [options]用法:configure [选项]Options: [defaults in brackets after descriptions]选项:[描述之后的方括号里的是默认值]Standard options:标准选项:--helpprint this message打印这个信息,例如:./configure --help > ffmpegcfg.txt...原创 2021-12-09 13:50:58 · 1995 阅读 · 0 评论 -
NDI详解
NDI是Network Device Interface的简称,是一种IP网络设备接口协议;使视频兼容产品通过局域网进行视频共享的开放式协议。NDI协议能实时通过IP网络对多重广播级质量信号进行传输和接收,同时具有低延迟、精确帧视频、数据流相互识别和通信等特性。 在一个局域网内,NDI设备可以自动发现接收其他NDI协议流,可以灵活获取到任意的信号输入与输出,是一个完全创新的IP工作模式。普通网线或无线wifi连接即可,不必sdi,hdmi线连接,减少布线成本。国外很多电......原创 2021-12-08 14:50:37 · 6649 阅读 · 3 评论 -
janus流媒体服务器搭建
准备ubuntu20 虚拟机注意:切换root用户 sudo su,否则以下很多命令要加sudo; linux新版本推荐apt(低版本apt-get还能用)一 安装工具apt install gitaptinstall makeaptinstall nginxapt install pythonapt install net-tools二 安装janus依赖库apt install libmicrohttpd-devapt...原创 2021-12-08 09:25:53 · 2491 阅读 · 1 评论 -
直播常见问题原因汇总
目录一 播放卡顿二 首开慢三 延时高四 音画不同步五 黑屏、花屏、闪屏六 播放闪屏七 播放杂音、噪音、回声八 拖动不准一 播放卡顿 卡顿的本质就是播放器渲染的帧率太低,每秒显示不足25帧(人眼视觉特性经验值),可能的原因如下:1视频流显示时间戳PTS问题 播放器一般是严格根据码流中的音视频PTS来做音画同步的,如果码流中的PTS出现错误,肯定会影响播放画面的渲染时机。例如 pts 1 50 ...原创 2021-12-02 18:17:44 · 8718 阅读 · 0 评论 -
ffmpeg内存管理及API
/*Allocate and initialize an AVIOContext for buffered I/O. It must be later freed with av_free()3 param:write_flag Set to 1 if the buffer should be writable, 0 otherwise5 param:read_packet A function for refilling the buffer, may be N...原创 2021-12-01 17:16:24 · 1258 阅读 · 0 评论 -
ffmpeg win10编译及命令详解
一 编译1 ffmpeg源码下载 ffmpeg.org/releases/2 下载minGW+msysMinGW - Minimalist GNU for Windows-是Windows下模拟linux运行的库、头文件等的集合。msys-Minimal SYStem-是Windows下模拟linux运行的最新系统,可以通过类似于linux bash的命令行窗口进行代码编译。 3配置minGWMinGW下载完成后进入安装目录,如果...原创 2021-11-29 21:44:26 · 1699 阅读 · 0 评论 -
webrtc详解
获取媒体流第一步:获取视频源videoSourceString frontCameraName = VideoCapturerAndroid.getNameOfFrontFacingDevice();VideoCapturer videoCapturer = VideoCapturerAndroid.create(frontCameraName);VideoSource videoSource = factory.createVideoSource(videoCapturer,videoConstr原创 2021-11-09 11:31:44 · 5933 阅读 · 1 评论 -
Directshow播放框架详解
windows播放框架有directshow,ffmpeg等,本篇主要介绍direcshow,对应quartz.dll接口:IFilterGraph 过滤通道接口IFilterGraph2 增强的IFilterGraphIGraphBuilder 最为重用的COM接口,用于手动或者自动构造过滤通道Filter Graph ManagerIMediaControl 用来控制流媒体,例如流的启动和停止暂停等,播放控制接口IMediaEvent 播放事件接口 ,该接口在Filter Graph发原创 2021-08-19 17:50:46 · 996 阅读 · 0 评论 -
直播技术知识结构图 转
转自 https://blog.youkuaiyun.com/derek518/article/details/78362664转载 2018-09-20 18:46:15 · 929 阅读 · 0 评论 -
dx HLSL编程
目录前言1.HLSL入门 1.1什么是着色器 1.2什么是HLSL 1.3怎么写HLSL着色器 1.4怎么用HLSL着色器2.顶点着色器 2.1可编程数据流模型 2.2顶点声明 2.3用顶点着色器实现渐变动画3.像素着色器转载 2017-01-25 17:21:24 · 1060 阅读 · 0 评论 -
YUV详解
YUV格式有两大类:planar和packed。对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。对于packed的YUV格式,每个像素点的Y,U,V是连续交*存储的。YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chro原创 2017-02-16 10:42:45 · 838 阅读 · 0 评论