- 博客(39)
- 资源 (18)
- 问答 (2)
- 收藏
- 关注

原创 ffmpeg之音频转码及重采样
最近在用ffmpeg做音频这一块,奈何网上这一块的确少,能找到的有些还不能用。今天算是磕磕绊绊把代码调通了。写篇博客讲讲我的拙见。之所有把转码和重采样写在一起,因为感觉他们是同一个流程完成的工作。下面以我的项目为例,先给各位客官梳理下流程。1. 我的输入的rtsp地址,先打开rtsp地址:avformat_open_input。最好加上rtsp-tcp参数。然后找到音频流。别忘了先 find_stream_info.2. 打开音频的编解码器。avcodec_open2。3. 然后构造编码器A
2021-02-04 18:27:33
1677
3

原创 C++ uint8_t数据串如何按位写入
撸码不易,网上找不到,索性自己写,且撸且珍惜!void bitsWrite(uint8_t* buff, int pos, int size, uint32_t value){ uint32_t index[] = { 0x80000000, 0x40000000, 0x20000000, 0x10000000, 0x8000000, 0x4000000, 0x2000000, 0x1000000, 0x800000, 0x400000, 0
2020-11-04 10:52:02
2270

原创 最简单的GB28181视频PS流播放器。
一 从PS流中提取h264和aac。移步:https://blog.youkuaiyun.com/qq_39805297/article/details/107083322二 基于ffmpeg解码h264获取rgb图像,解码aac成pcm格式。bool H264Decoder::init(){ av_register_all(); _pCodecContext = avcodec_alloc_context3(NULL); _pH264VideoDecoder = avcodec_find_dec
2020-08-31 15:43:00
3415
1

原创 基于librtmp推送h264文件至媒体服务器。
一 可以搭建nginx作为rtmp服务器,需要的自行搜索nginx搭建rtmp服务器。二 安装librtmp。三 代码如下:(已上传至github https://github.com/cdebug/h264_to_rtmp)sps_decode.h/** * Simplest Librtmp Send 264 * * 雷霄骅,张晖 * leixiaohua1020@126.com * zhanghuicuc@gmail.com * 中国传媒大学/数字电视技术 * Commu
2020-08-27 17:54:07
1217
原创 ffmpeg ndk高版本编译arm32位neon汇编启用失败
好久没有写博客了,因为是内网开发,写个知识点吧,手机撸一个。如题,ndk现今版本编译器已经从gcc改为了clang于是出现了这个问题,解决办法是在编译命令中加入 -fno_integrated_as 即可解决。拼写应该没错吧。...
2021-11-05 11:25:02
360
原创 C++ 超大数字的运算——求100的阶乘
uint8_t arr[1000]; memset(arr, 0, sizeof(arr)); arr[0] = 1; for(int i = 1; i <= 100; ++i) { int lastCal = 0; for(int j = 0; j < sizeof(arr); ++j) { int res = arr[j] * i + lastCal; a...
2021-03-12 17:32:35
1010
原创 流媒体转发——rtsp转ps
基于FFMPEG提取音视频数据,及PS封包,借鉴了很多资料及博客,对于封装PS包,很多属性没有弄懂,但至少目前做出了功能,发表用以记录,供人学习。Github:https://github.com/cdebug/Rtsp2ps优快云:https://download.youkuaiyun.com/download/qq_39805297/14022436主要功能代码如下:RtspDecoder 解RTSP码流rtspdecoder.h#ifndef RTSPDECODER_H#defi..
2021-01-04 17:56:48
1837
原创 多线程日志库
本文参考自陈硕老师的muduo网络库,删减的繁多的依赖文件,精简如此,供更多的人参考学习(感谢陈硕老师的muduo)。copyable.h#ifndef MUDUO_BASE_COPYABLE_H#define MUDUO_BASE_COPYABLE_Hnamespace muduo{/// A tag class emphasises the objects are copyable./// The empty base class optimization applies.//
2020-11-23 09:40:31
371
原创 C++ 十进制字符串与十六进制字符串互转
1. 十进制----十六进制std::string decstr2hexstr(std::string str){ uint32_t num = std::stoul(str); std::string ret; for(int i = 0; i < 4; ++i) { ret.push_back("0123456789ABCDEF"[(((uint8_t*)num)[i] >> 4) & 0xF]); ret
2020-11-12 14:34:10
1595
原创 C++ openssl的rtsp握手鉴权加密算法
std::string MD5(const std::string& src ){ MD5_CTX ctx; std::string md5_string; unsigned char md[16] = { 0 }; char tmp[33] = { 0 }; MD5_Init( &ctx ); MD5_Update( &ctx, src.c_str(), src.size() ); MD5_Final( md, &.
2020-11-09 11:18:33
490
原创 rtsp流转rtmp流
一 socket拉取rtsp流。先讲rtsp拉流的过程,如下是rtsp命令交互的过程,后面一点点分解。OPTIONS rtsp://192.168.31.29:554/0/0/101?transportmode=unicast&profile=Profile_1 RTSP/1.0CSeq: 2RTSP/1.0 200 OKCSeq: 2Public: OPTIONS, DESCRIBE, PLAY, PAUSE, SETUP, TEARDOWN, SET_PARAMETER, G
2020-09-02 16:58:30
1708
原创 QTreeWidget整行选中的边框样式
效果如下:首先是用QSS来设置,把能做的都做了,设置branch和item的上下边框,最后一个item的有边框,如下:QTreeWidget::item:selected{border-top:1px solid #8d8d8d;border-bottom:1px solid #8d8d8d;}QTreeWidget::item:last:selected{border-right:1px solid #8d8d8d;}QTreeWidget::branch:selected{
2020-08-07 09:34:09
3061
原创 jrtplib发送数据时指定起始的序列号(Seq)和时间戳(Timestamp)
使用jrtplib发送数据的时候没有开放的接口设置序列号和时间戳,所以抓包看到的包的起始序列和时间是随机数,而我的项目里需要时从0开始的。这是因为源码中已经把这个参数写死为随机数了,修改下源码再重新编译即可。将以下两处的随机数的赋值改为0.https://github.com/j0r1/JRTPLIB/blob/master/src/rtppacketbuilder.cpp#L165https://github.com/j0r1/JRTPLIB/blob/master/src/rtppack
2020-07-17 09:07:26
671
原创 GB28181学习之路——PS流解复用H264和ACC
上一篇讲了PS中提取视频,今天顺手把音频提取的也做了出来,代码结构也梳理了一下。音频提取的方式和视频是一样的,关于视频的提取方式请移步:GB28181学习之路——PS流解析H264话不多说直接上代码了streamresolver.h:#ifndef STREAMRESOLVER_H#define STREAMRESOLVER_H#include <iostream>#include "common.h"class StreamResolver{public:
2020-07-02 14:19:35
1914
原创 GB28181学习之路——PS流解析H264
磕磕绊绊的做了出来,也算为自己留个资料吧。先讲理论再上代码。挑些重点讲。1. 首先就是获取到 rtp 包,rtp包的结构是:rtp包头+payload,payload就是我们要的ps包,rtp包头的长度是12个字节,所以rtp包去掉前12字节就是ps包了。比如这个 rtp 包,跳过12个字节,从00 00 01 ba 开始就是ps包了。2. 找到ps包之后就要从它的格式入手开始解析,ps荷载h264是把一帧帧的数据打包传过来,一个完整的ps包会包含一帧的数据。而h264的帧分为 i 帧和
2020-07-01 10:31:00
2862
2
原创 Qt+VLC视频画面上覆盖半透明控件
很多人遇到过这个问题吧,我也不例外,试了很多常规的方法没有达到预期的效果。后来想到把控件原有的绘制屏蔽掉,才得到了现在的解决方法。效果图如下:
2020-06-19 12:28:25
2609
10
原创 GB28181学习之路——eXosip获取IP和端口
当设备注册进来时,我们需要记录下设备的IP和端口,以便后续与其进行通信,其实好多地方都可以获取到,但是不一定是准确的,尤其是经过映射的地址更是不好难以捕捉。今天写一下怎么样获取设备的IP和端口,对映射与非映射同样有效。先构造获answer,然后再answer的Via header中取,这时answer中含有映射地址的信息:if (MSG_IS_REGISTER(je->request)){ FLOG ("MSG_IS_REGISTER!\n"); eXosip_lock
2020-06-17 17:19:40
2439
原创 GB28181学习之路——eXosip多线程
多线程开发的主要的工作就是就是使用多个eXosip_t int i,j; TRACE_INITIALIZE (6, NULL); m_ctx1 = eXosip_malloc(); m_ctx1 = eXosip_malloc(); if (m_ctx1==NULL || m_ctx2==NULL) { FLOG("eXosip_malloc failed\n"); return -1; } i=eXosi.
2020-05-15 11:19:15
2214
1
原创 海康大华摄像头播放地址
rtsp://admin:admin12345@192.168.9.63:554/Streaming/Channels/101?transportmode=unicast&profile=Profile_1
2020-05-15 11:09:35
1330
原创 GB28181学习之路——eXosip TCP模式
eXosip 的TCP模式与UDP模式大致相同,基本代码如下:bool CSipContact::initialize(){ int i; TRACE_INITIALIZE (6, NULL); m_ctx = eXosip_malloc(); if (m_ctx==NULL) { FLOG("eXosip_malloc failed\n"); return -1; } i=eXosip_init(m_ctx);
2020-05-13 09:37:14
3917
6
原创 GB28181学习之路——再探invite信令规范
最近对接压缩机和nvr设备,出现了很多的问题,原因是之前对接IPC所写的信令不规范,所以这次暴露出了很多问题。wireshark抓的包忘记保存了,懒着抓了,就干吧的写吧。一、sip头proxy、to、contact的国标编码要用通道号的编码。二、invite请求要加subject,值为 (发送者:媒体序列,接受者:媒体序列),发送者是通道编码,接受者有就写,序列号点播第一位为0,历史第...
2020-04-27 10:40:02
1909
原创 GB28181学习之路——基于osip的sdp文本解析
话不多说上代码吧 char buff[4096]; sprintf(buff, "v=0\r\n""o=1001 0 0 IN IP4 10.64.49.44\r\n""s=Play\r\n""c=IN IP4 10.64.49.44\r\n""t=0 0\r\n""m=video 5494 RTP/AVP 96 97 98\r\n""a=rtpmap:96 PS/...
2020-04-27 10:14:11
2457
2
原创 GB28181学习之路——实时视频点播
主要写下信令构造吧,我也是到处查资料然后调试才调通的,所以就拿我的代码来看吧,也不用解释。下面是构造invite的方法:osip_message_t *invite = NULL;i=osip_message_init(&invite);bSipInviteBuild(&invite);#define MAXLINE 4096#define MESSAGE_...
2020-04-15 09:21:20
1946
5
原创 GB28181学习之路——构造osip_message_t
辗转好久找到了有效的方法,如下: osip_message_t *res; i=osip_message_init(&res); osip_message_set_version(res, osip_strdup("SIP/2.0")); osip_message_set_status_code(res, 401); osip_message_s...
2020-04-10 09:09:25
2269
1
原创 GB28181学习之路——SIP报文解析转换
由于某些原因没有用eXosip,于是自己tcpsocket建立连接并解析报文,osip安装的自己找找吧。解析代码如下:#include<osipparser2/osip_message.h>#include<osipparser2/osip_parser.h>int main(){ parser_init ();//必须要有这句话 char t...
2020-04-09 09:14:21
1855
原创 Qt自定义控件之动态数字Label+动态百分比背景
资源地址:https://download.youkuaiyun.com/download/qq_39805297/12028664话不多说直接上图一、动态数字的LabelNumberLabel::NumberLabel(QWidget * parent) :QLabel(parent), m_currNumber(0){ m_timeLine = new QTimeLin...
2019-12-12 15:20:12
1904
原创 基于openssl的3DES(ECB)加密算法
项目中需要用到就找了下,借鉴网上的一些代码,在加上自己的改良,得到了现在的代码,也解决了我的需求。附openssl安装教程https://blog.youkuaiyun.com/qq_39805297/article/details/100532833先说下,3DES加密算法有几种填充方式,比如zeropadding、pkcs5padding、pkcs7padding等等,我使用的pkcs7padd...
2019-10-30 10:02:05
1909
原创 vs使用nuget安装openssl
最近需要在项目中使用openssl,查了下资料发现了nuget这个方便的东西。可以直接为解决方案配置sdk环境。配置openssl所需的最低版本是vs2013。打开一个项目,点击 工具->NuGet包管理器->程序包管理控制台。例如vs2012,控制台中输入如下命令。可在 NuGet官网 查看Install-Package openssl -Version 1.0...
2019-09-04 09:49:55
1176
原创 cmake编译时如何指定vs的版本
通常cmake编译命令cmake dir想要指定cmake版本在其后附加参数 -G 即可cmake dir -G "Visual Studio 11 2012"
2019-08-30 14:35:35
4415
原创 Qt Creator出现“启动程序失败,路径或者权限错误?”错误的解决办法
最近Qt creator项目会出现“启动程序失败,路径或者权限错误?”的报错,一个最简单的项目都无法执行。观察发现,项目在构建后目录中会出现可执行文件,但是在运行时文件就消失了,而且打印 程序丢失 类似信息。因为Qt总不至于把要运行的文件删除,所以猜测与安装的安全软件有关。退出了我的360安全卫士,程序正常运行了,完美!!!...
2019-08-27 17:47:20
1538
原创 windows下编译ffmpeg教程(for linux,库文件.a .o)
参考文章:https://blog.youkuaiyun.com/zhouyongku/article/details/44961447ffmpeg源码csdn下载链接:https://download.youkuaiyun.com/download/qq_39805297/11617400ffmpeg编译产物csdn下载链接:https://download.youkuaiyun.com/download/qq_39805...
2019-08-27 11:37:21
563
原创 QML中两个窗口切换,隐藏一个显示另一个
比如登录页和主页面,用 QQmlApplicationEngine 加载两个qmlQQmlApplicationEngine engine;engine.load(QUrl(QStringLiteral("qrc:/login.qml")));engine.load(QUrl(QStringLiteral("qrc:/MainWindow.qml")));在cpp代码中,隐藏一个,显...
2019-05-09 16:50:45
3901
原创 TypeError: Property 'xx' of object xx(0x3bfb34) is not a function
做进刚开始做QtQuick遇到了这个问题,在向QML注册C++对象是出现了这个错误。QML debugging is enabled. Only use this in a safe environment.file:///C:/Qt/QtPrj/build-visibleKitchen-Desktop_Qt_5_2_1_MSVC2012_32bit-Debug/qml/visibleKi...
2019-04-25 15:10:37
2172
1
原创 如何在Qt中调用activeX插件
如何在Qt中调用ocx插件,介绍可用的两种方法。先说第一种方法:使用QAxObject,设置插件的classid后就可以调用插件的方法了。QAxObject *flash = new QAxObject;flash->setControl(QString::fromUtf8("{C803CB4E-71F6-411D-8A93-770E19F3DFE5}"));QVarian...
2019-04-08 12:57:33
2450
2
原创 如何使QGraphicsScene的背景不平铺。
QGraphicsScene使用setBackgroundBrush加载图片作为背景的话,通常会出现背景平铺重复的问题,像这样:因为这个方法就是设置背景色的不是设置场景图片的方法,想要使背景不平铺开来的话,只要添加一个QGraphicsPixmapItem作为背景就可以了,简单有效。QGraphicsPixmapItem* bgItem = new QGraphicsPixmapIt...
2019-03-27 16:46:30
1901
2
原创 如何在QTableView中item被选中时,使其表头字体不变粗
经常在使用QTableView时选中item,会同时使表头出现字体加粗的高亮状态,像这样:的确不大好看,解决这个问题的方法:ui.tableView->horizontalHeader()->setHighlightSections(false);是不是好看多了呢。...
2019-03-27 16:33:35
4678
原创 去掉QTableView、QTreeView内item被选中时的虚线框
像这种虚线框有时看起来的确挺丑的,那么怎么去掉它呢只需要添加一行代码即可:ui.tableView->setFocusPolicy(Qt::NoFocus);修改后顺眼多了吧。
2019-03-27 16:07:05
4604
1
原创 Qt5项目,使用QWebEngineView替换QWebView
在Qt项目中,升级Qt版本时难免会遇到从QWebView到QWebEngineView的转换,他们之间的用法也多少有些变化。话不多说,下面是我遇到这个问题时的几个关键部分。一、Qt调用jsQWebView的方法是webview->page()->mainFrame()->evaluateJavaScript(cmd);QWebEnginePage的用法为w...
2019-01-10 14:59:22
6352
1
原创 qt+directshow usb摄像头及音频设备录制视频
最近来了个项目,有一块功能是usb摄像头录制视频并且录音的实现,网上的东西七七八八什么技术都有,先用opencv打了半天环境不能录音频,后来用ffmpeg,原谅我太菜,视频编码和格式让人头疼,不懂怎么移植到自己的程序中,后来用的directshow,希望大家少走些弯路。#include "PreviewController.h"std::string TCHAR2STRING(const TCHA...
2018-03-12 16:28:10
2990
4
GBPlayer.rar
2020-08-24
基于openssl的3DES加密算法
2019-11-01
exosip 接收到Invite构造answer失败
2020-05-16
qt的关键字不识别怎么办
2017-10-30
TA创建的收藏夹 TA关注的收藏夹
TA关注的人