Boehm螺旋模型

alt none

ref:《设计原本》

AudioRecord录制音频的基本步骤

采样定理,又称香农采样定理,奈奎斯特采样定理:

​ 在进行模拟/数字信号的转换过程中,当采样频率fs.max大于信号中最高频率fmax的2倍时(fs.max >= 2fmax),采样之后的数字信号完整地保留了原始信号中的信息。 ​ 一般实际应用中保证采样频率为信号最高频率的5~10倍。要使实信号采样后能够不失真还原,采样频率必须大于信号最高频率的两倍。

	//设置声音采样率
	int frequency = 8000;

	//设置声道
	int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;

	//设置声音编码格式
	int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;

	//获取AudioRecord的最小缓冲区大小
	int minSize = AudioRecord.getMinBufferSize(frequency, 
                                                   channelConfig, 
                                                   audioEncoding);

	//录制缓冲区
	short audioBuffer = new short[BUFSZ];

	AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 
                                                  frequency, 
                                                  channelConfig, 
                                                  audioEncoding,minSize);

        //开始录制	
	audioRecord.startRecording();

	while(true) {
		audioRecord.read(audioBuffer, 0, BUFSZ);
	}

ref:http://zh.wikipedia.org/zh-cn/%E5%A5%88%E5%A5%8E%E6%96%AF%E7%89%B9%E9%87%87%E6%A0%B7%E5%AE%9A%E7%90%86

编译ffmpeg使支持PIPE输入

查看ffmpeg支持的输入协议

./configure  --list-protocols

可能的输出:

applehttp
httpproxy
rtmp
bluray    
https			
rtmpe
cache			
librtmp			
rtmps
concat			
librtmpe		
rtmpt
crypto			
librtmps		
rtmpte
ffrtmpcrypt		
librtmpt		
rtmpts
ffrtmphttp		
librtmpte		
rtp
file			
md5			
sctp
gopher			
mmsh			
tcp
hls			
mmst			
tls
http			
pipe			
udp

增加PIPE支持

./configure --enable-protocol=pipe

一个完整的编译参数

./configure  --enable-libmp3lame 
             --enable-vdpau 
             --enable-libx264 
             --enable-gpl 
             --disable-static 
             --enable-shared 
             --disable-armv5te 
             --disable-armv6 
             --disable-armv6t2 
             --disable-armvfp 
             --enable-gpl  
             --enable-protocol=pipe

linux c 使用socket处理HTTP请求

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/select.h>

#define BUFSIZE 4096 

int main(int argc, char **argv) {

	int sockfd;
	struct sockaddr_in servaddr;
	charhttpRequest[BUFSIZE], buf[BUFSIZE];

	bzero(httpRequest, sizeof(httpRequest));
	
	//构建请求信息,这里请求http://192.168.2.184:8090/test.flv,这是一个由ffserver搭建的流媒体服务
	strcat(httpRequest, "GET /test.flv HTTP/1.1\n");
	strcat(httpRequest, "Host: 192.168.2.184:8090\n");
	strcat(httpRequest, "User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:23.0) Gecko/20100101 Firefox/23.0\n");
	strcat(httpRequest, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\n");
	strcat(httpRequest, "Accept-Language: en-US,en;q=0.5\n");
	strcat(httpRequest, "Accept-Encoding: gzip, deflate\n");
	//注意这里必须是2个"\n"
	strcat(httpRequest, "Connection: keep-alive\n\n");

        //http请求只支持tcp协议
	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if(sockfd < 0) {
		fprintf(stderr, "create socket error\n");
		exit(1);
	}

	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons(PORT);
	if(inet_pton(AF_INET, IPSTR, &servaddr.sin_addr) <= 0) {
		fprintf(stderr, "inet_pton error\n");
                close(sockfd);
		exit(1);
	}
	
	if(connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) {
		fprintf(stderr, "connect error\n");
                close(sockfd);
		exit(1);
	}

	fprintf(stderr, "connect OK\n");
	fprintf(stderr, "httpRequest: %s\n",httpRequest);

        //发送请求
	int ret = write(sockfd,httpRequest, strlen(httpRequest));	
	if(ret < 0) {
		fprintf(stderr, "write error\n");
                close(sockfd);
		exit(1);
	}

	fprintf(stderr, "writen: %d\n", ret);

        //设置select的超时时间3S
        struct timeval tv;

	fd_set fdSet;

	//TODO: 接收数据,需要处理接收完成等
	while(true) {
                //因为select返回后tv的值是未定义的,所以每次需要重设一下
		tv.tv_sec = 3;
                tv.tv_usec = 0;

	        FD_ZERO(&fdSet);
	        FD_SET(sockfd, &fdSet);
		//这里的第5个参数指定超时时间
		int status = select(sockfd + 1, &fdSet, NULL, NULL, &tv);
                if(status > 0 && FD_ISSET(sockfd, &fdSet)) {
        
           	        memset(buf, 0, 4096);
			int i = read(sockfd, buf, 4096);

			//TODO:需要判断服务器是否返回了正确的状态等
			#if 1
			fprintf(stderr, "read: %d\n", i);
			fprintf(stderr, "buffer: %s\n", buf);
			#endif
                }
      }

	close(sockfd);

	return 0;
}

linux网络编程之AF_INET AF_INET6 AF_UNSPEC

int getaddrinfo(const char *node, const char *service,
                const struct addrinfo *hints,
                struct addrinfo **res);
struct addrinfo {
    int ai_flags;
    int ai_family;
    int ai_socktype;
    int ai_protocol;
    socklen_t ai_addrlen;
    struct sockaddr *ai_addr;
    char *ai_canonname;
    struct addrinfo *ai_next;
};

ai_family参数指定调用者期待返回的套接口地址结构的类型。 它的值包括三种:

  1. AF_INET: 函数返回IPV4相关的地址信息
  2. AF_INET6: 函数返回IPV6相关的地址信息
  3. AF_UNSPEC: 函数返回的是适用于指定主机名和服务名且适合任何协议族的地址

如果某个主机既有AAAA记录(IPV6)地址,同时又有A记录(IPV4)地址,那么AAAA记录将作为sockaddr_in6结构返回,而A记录则作为sockaddr_in结构返回。

ref: http://blog.sina.com.cn/s/blog_8184e033010134c4.html