Android 音视频流媒体研发
文章目录
1.Ubuntu环境搭建
创建Ubuntu Linux环境
安装相关的库
sudo apt-get install build-essential
sudo apt-get install autoconf autogen automake
sudo apt-get install cmake
2.Linux 进程与子进程
#include <unistd.h>
#include <stdio.h>
int main(){
pid_t pid;
//返回值 成功有两个值 子进程是返回的0 父进程返回的子进程的ID
pid=fork();
if(pid<0){
printf("fork error");
}else if(pid==0){
printf("child space ,my id is :%d\n",getpid());
}else{
printf("parent space,my id is :%d\n",getpid());
}
return 0;
}
通过fork函数创建线程,创建一个.c文件并进行编译运行
通过执行gcc命令进行编译,并输出可指定文件test,并执行可执行文件
gcc main.c -o test
./test
3.Linux POSIX 线程接口pthread 以及signal 信号
发送信号:signal(SIGINT,exitThreadProcess);
pthread_join,线程插入
pthread_cancel ,线程取消(不常用)
pthread_detach,线程分离,这样就交给CPU去控制了
#include <stdio.h>
#include <stdbool.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
pthread_mutex_t m_mutex;
bool m_thread_running = true;
int m_value = 0;
//接受发送的信号,对变量进行控制,从而控制线程是否运行
void exitThreadControll(int signal){
printf("signal is %d,signal set m_thread_runing=false \n",signal);
m_thread_running=false;
}
void* threadProcess1(void* params){
while(m_thread_running){
pthread_mutex_lock(&m_mutex);
m_value+=1;
pthread_mutex_unlock(&m_mutex);
printf("threadProcess1....%d \n",m_value);
usleep(1000*1000); //单位是微妙
}
printf("thread process 1 is exit \n");
}
void* threadProcess2(void* params){
while(m_thread_running){
pthread_mutex_lock(&m_mutex);
m_value+=1;
pthread_mutex_unlock(&m_mutex);
printf("threadProcess2....%d \n",m_value);
usleep(1000*1000); //单位是微妙
}
printf("thread process 2 is exit \n");
}
int main(){
pthread_t thread1;
pthread_t thread2;
pthread_mutex_init(&m_mutex,NULL);
//给函数发送信号
signal(SIGINT,exitThreadControll);
//创建线程
pthread_create(&thread1,NULL,threadProcess1,NULL);
pthread_create(&thread2,NULL,threadProcess2,NULL);
//插入线程
pthread_join(thread1,NULL);
pthread_join(thread2,NULL);
//销毁互斥锁
pthread_mutex_destroy(&m_mutex);
printf("----test thread \n");
return 0;
}
通过gcc进行编译,生成可执行文件,并进行运行(注意:需要通过链接 -lpthread 来链接线程函数库,否则找不到pthread)
gcc thread_and_lock.c -o test_thread -lpthread
4.通过cmake对项目进行管理
4.1新建头文件PFMath.h
class CCMath
{
public:
CCMath();
~CCMath();
};
4.2 新建PFMath.cpp
#include <stdio.h>
#include "PFMath.h"
PFMath::PFMath()
{
printf("-----------PFMath ---------\n");
}
PFMath::~PFMath()
{
}
4.3 新建main.cpp
#include <stdio.h>
#include "PFMath.h"
int main(){
PFMath pFMath;
return 0;
}
4.4 新建CMakeLists.txt 配置文件
cmake_minimum_required(VERSION 3.5)
project(PFTEST VERSION 1.0.0)
SET(MATHLIB_SRC PFMath.cpp)
#add_executable命令用于使用指定的源文件向项目(project)添加可执行文件 意思增加PFTEST 这个作为可执行文件
add_executable(PFTEST main.cpp)
#创建动态库
add_library(PFTEST_LIB SHARED ${MATHLIB_SRC})
#将动态库链接到可执行文件中
target_link_libraries(PFTEST PFTEST_LIB)
新建build文件夹
#执行以下命令:
mkdir build
cd build
cmake ..
make
#执行上边的命令就能完成编译,并生成动态库以及可执行文件 PFTEST
./PFTEST #就可以看到执行的结果
5.文件读写
二进制文件读写,方便使用,一般使用fread和fwrite进行读写。
size_t fread(void *buf,size_t size,size_t count,FILE *fp);
size_t fwrite(void *buf,size_t size,size_t_count,FILE *fp);
size:单个元素的大小,一般写1
count:读写元素的数量
写入成功就返回count,如果遇到EOF就返回0;
读写模式:W+ 文件指针地址的位置开始写,替换到之后的内容,a+从问价的末尾开始添加
wb:二进制的方式写
rb:二进制的方式写
6.Socket套接字
Socket套接字是用用层根据TCP/IP UDP通信协议的的软件抽象。
TCP/IP(Transmission Control Portocol/Intenet Protocol) 即传输控制协议、网间协议
UDP(User Data Portocol,用户数据报协议)是与TCP相对应的协议
7.Linux系统进行音频采集alsa
安装alsa库
sudo apt-get install libalsa-ocaml-dev
安装好之后,可以在/usr/lib/ocaml/alsa/看到静态库
ls /usr/lib/ocaml/alsa/