- 博客(17)
- 收藏
- 关注
原创 ffmpeg api实现将音视频混合
将AVPacket写入输出环境时,音频和视频的stream_index不能相等,如果音频的stream_index等于0,那么视频的stream_index需要等于1,可以手动改。出现这种情况的原因是输入的xxx1.mp3可能包含2个流,一个是音频,另一个是视频,音频流索引是0,视频流索引是1。输入的xxx2.mp4至少包含2个流,一个是音频,另一个是视频,而这里视频流索引是0,音频流索引是1。将从输入流解析出的AVPacket的跟时间相关字段,从当前的输入流时基对应的值转为输出流时基对应的值。
2023-05-09 14:46:59
96
原创 声音是如何存储下来的
对声音进行采样,每秒固定采样44100次,那么频率就能量化。对振幅进行采样,振幅就能量化。那么声音就被记录下来了。重现声音的时候,在这44100个时间点去还原出振幅,声音的波形就重现了。而振动只有两个变量,一个是振幅,一个是频率。
2023-04-25 16:23:50
58
原创 ffmpeg在windows编译带ffplay.exe使用msvc工具链
改脚本(msys2_shell.cmd文件set MSYS2_PATH_TYPE=inherit去掉set)-sdl2.pc(/usr/lib/pkgconfig/创建文件sdl2.pc并编辑好)-sdl2 include目录里所有的头文件放入/usr/local/include/sdl2。-SDL2main.lib, SDL2.lib放入/usr/local/lib。这里的/usr/local/include/sdl2是相对msys2的目录。ffmpeg/config.h里面的中文字符去掉。
2023-04-25 15:25:51
45
原创 魔兽争霸3游戏改键原理
如果是war3的窗口,则判断此键盘消息的键值码是否是z的键值码,如果是,则通过代码产生一个虚拟按键事件,如果不是,则也进行默认的消息处理。虚拟键盘事件也同按了键盘一样,会在系统消息队列产生新的小键盘1的键盘消息,然后此消息又会被全局钩子捕获到,但它此时不是z了,默认不处理派发给游戏窗口。至此,本来按z产生的键盘消息,变成了按1产生的键盘消息,被放入游戏窗口队列,被游戏窗口的消息处理函数处理,从而实现了改键。当按下z的时候,把这个键盘消息替换为小键盘1,再传递给游戏窗口队列,需求就能实现。
2023-03-30 12:14:12
117
原创 访问多点计算最短路线
举例,武汉出发,想去五岳旅游,最后返回武汉,如果全程高铁或动车,怎样依次访问到并费用最低?我的思路比较简单,首先手动查询票价信息,整理成表格。然后列出全排列并记录。最后计算费用,找出最低值并打印整理出的表格,为简化问题仅考虑高铁动车费用,10000表示不方便(需要多次换乘等) 武汉 泰山 华山 恒山 衡山 嵩山 武汉 0 497.5 419 651.5 229 312 泰山 506 0
2022-04-26 11:26:30
239
原创 delete基类指针能不能释放子类对象
#include <stdio.h>class A{public: A() { printf("A\n"); } ~A() { printf("~A\n"); }};class B : public A{public: B() { printf("B\n"); } ~B() { printf("~B\n"); }};int main(){ A *p = new B; delete p; return 0;}执行结果:AB~A基类析构函.
2021-03-02 10:39:20
1007
1
原创 getdelim
详见man手册man getdelim#include <stdio.h>ssize_t getline(char **lineptr, size_t *n, FILE *stream);如果用户没有给*lineptr分配堆内存,那么系统默认分配的堆内存长度是120。如果用户有给*lineptr分配堆内存,如果足够,系统不会修改长度,如果不够,系统会realloc两倍的长度。第二个参数类型需要时size_t,不要是int。参数类型尽量一致,搞规范,不要随意地搞隐式转.
2020-09-09 17:29:50
830
原创 研究va_list
测试代码#include <stdarg.h>#include <stdio.h>void s(const char* str1, const char* str2, ...){ va_list va_list_; va_start(va_list_, str1); const char* p1 = va_arg(va_list_, const char*); printf("p1 : [%p] [%s]\n", p1, p1); c...
2020-08-21 12:08:26
88
原创 16进制字符串数转10进制整数
bool hexchar2int(char* p, int* num){ if (*p >= '0' && *p <= '9') *num = *p - '0'; else if (*p >= 'A' && *p <= 'F') *num = *p - 'A' + 10; else if (*p >= 'a' && *p <= 'f') *num = ...
2020-08-14 14:50:41
127
原创 研究C++类的成员变量构造析构顺序
#include <stdio.h>class A{public: A() { printf("a\n"); } ~A() { printf("~a\n"); }};class B{public: B() { printf("b\n"); } ~B() { printf("~b\n"); }};class C{public: C() { printf("c\n"); } ~C() { printf("~c\n".
2020-07-08 14:53:09
3059
原创 修改vscode文本编辑器默认的输入方式
vscode的文本编辑器继承了linux上vim的功能。用vscode打开源文件后,可能默认的模式是一般模式,这种模式下是不能输入字符的,对于用惯了windows的人来说是非常不习惯的。如何将默认的模式更改为插入模式呢。File-Preferences-Settings,搜索vim.startInInsertMode,再Start in Insert mode前面打上勾。...
2020-06-01 11:50:45
4888
原创 零基础尝试使用cmake
本文适合新手,从未使用过cmake的人。本文介绍自己对cmake的理解。同时也介绍自己在linux下成功使用cmake编译好自己的项目,及踩过的坑。cmake是一个跨平台的工具,起初耳闻cmake,是为了解决当项目变大源文件变多时,在linux写Makefile工作量太大,所以使用cmake来自动生成Makefile,以减轻工作量。在linux上确实是如此...
2020-05-17 10:32:59
527
原创 boost::asio异步收消息
需求背景说明,boost::asio网络编程库,在进行同步收发消息的时候,本身是不支持超时的。如果自己想尝试去实现,给同步收消息增加一个超时,会有一系列弊端,比如额外的工作量,简单的代码变得不好看,程序可能变得不稳定。同时,在高并发情况下,就更是需要使用异步收消息来提升性能,开更少的线程去做更多的事。本人能力有限,本文只介绍boost::asio异步收消息的基本使用。要想实现异步操作,就...
2020-04-27 18:03:42
515
原创 MFC控件组合框
组合框,例如为了确定ip是30网段还是50网段,可以在对话框提供一个组合框来选择。当点击组合框的下拉按钮的时候,就显示出30和50来选择。组合框对应的是CComboBox类。在对话框中,拖入的组合框控件上,右键-添加变量-添加CComboBox类型的变量,输入变量名。那么,对话框中就有此组合框类的成员变量了,并且自动在DoDateExchange()里面添加了DDX_Control(),这样对话框...
2020-04-22 11:43:50
226
原创 缓存数据时别名的使用
在缓存数据时,写了一个类,专门负责保存数据,保存到类的成员变量里,并提供写入和读取接口。在保存的时候,使用写入接口,传递参数时不能使用别名,否则成员变量不能真的把数据保存下来,使用别名,在外面的局部变量析构后,数据就没了。所以在保存时,不能使用别名,保存时需要拷贝一次,从局部变量拷贝到类的成员变量。在读取时,需要使用别名,否则读取不到。变量在传参时,就拷贝了一次,在函数里面,拷贝的变量是能拿到数据...
2020-04-16 10:15:06
142
原创 程序员好的工作习惯
作为一名新手程序员,刚开始工作的时候,总感觉乱七八糟的。现在写代码,完成一个或多个需求,就编译,然后自测,最好进行路径覆盖,自测没问题后,就上传代码到svn。这样一连串的一套动作,都完成,才算一个需求完成了。如果代码写完不自测,不将没问题的代码上传到svn,就好像吃完饭不洗碗,起床不叠被子,比较乱,该做的工作并没有做完。...
2020-04-16 10:09:48
186
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人