输入4通道数据,将第三和第四通道的数据延迟10ms,同时加入时间戳,依赖开源循环buffer
1. C++实现
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/time.h>
#include "speech/circ_buff.h"
#define SIZE_16ms 2048
#define SIZE_10ms 1280
FILE *file_in;
FILE *file_out;
int pcm_size;
char *pcm_buffer;
char *audio_10ms;
char *audio_16ms;
tCircularBuffer *audio_buffer_tmp;
void AudioInit() {
file_in = fopen("test_audio/2.pcm", "rb");
if(!file_in) {
std::cout << "open audio file_in failed !!!" << std::endl;
}
file_out = fopen("test_audio/out2_1.pcm", "wb");
if(!file_out) {
std::cout << "open audio file_out failed !!!" << std::endl;
}
audio_buffer_tmp = CreateCircularBuffer(100 * 16 * 2 * 4);
audio_10ms = reinterpret_cast<char *>(malloc(SIZE_10ms));
audio_16ms = reinterpret_cast<char *>(malloc(SIZE_16ms));
memset(audio_10ms, 0, SIZE_10ms);
memset(audio_16ms, 0, SIZE_16ms);
FillBuffer(audio_buffer_tmp, audio_10ms, SIZE_10ms);
pcm_size = 8 * SIZE_16ms;
pcm_buffer = new char[pcm_size];
}
void AudioProcess() {
while(fread(pcm_buffer, 1, pcm_size, file_in)){
char tmp[8 + 512 * 4];
struct timeval start_time;
gettimeofday(&start_time, NULL);
int64_t timestamp = start_time.tv_sec * 1000 + start_time.tv_usec / 1000;
for(int i = 0; i < 8; ++i) {
FillBuffer(audio_buffer_tmp,
reinterpret_cast<char *>(pcm_buffer) + SIZE_16ms * i, SIZE_16ms);
ReadBuffer(audio_buffer_tmp, audio_16ms, SIZE_16ms);
for(int j = 0; j < SIZE_16ms / 8; ++j) {
pcm_buffer[i * SIZE_16ms + j * 8 + 4] = audio_16ms[j * 8 + 4];
pcm_buffer[i * SIZE_16ms + j * 8 + 5] = audio_16ms[j * 8 + 5];
pcm_buffer[i * SIZE_16ms + j * 8 + 6] = audio_16ms[j * 8 + 6];
pcm_buffer[i * SIZE_16ms + j * 8 + 7] = audio_16ms[j * 8 + 7];
}
memcpy(tmp, reinterpret_cast<char *>(×tamp), sizeof(timestamp));
memcpy(tmp + sizeof(timestamp),
reinterpret_cast<char *>(pcm_buffer) + SIZE_16ms * i, SIZE_16ms);
timestamp += 16;
}
fwrite(pcm_buffer, 1, SIZE_16ms * 8, file_out);
}
}
void AudioEnd() {
free(audio_10ms);
free(audio_16ms);
fclose(file_in);
fclose(file_out);
DestroyCircularBuffer(audio_buffer_tmp);
}
int main(int argc, char *argv[]) {
std::cout << "start lch !!!" << std::endl;
AudioInit();
AudioProcess();
AudioEnd();
std::cout << "end lch !!!" << std::endl;
return 0;
}
- cmake编译
include_directories(${PROJECT_SOURCE_DIR})
set(SDK_AUDIO_DEMO_SRC
${PROJECT_SOURCE_DIR}/demo/test.cc
${PROJECT_SOURCE_DIR}/src/circ_buff.c)
add_executable(test_audio ${SDK_AUDIO_DEMO_SRC})
- g++编译
g++ -g -o test ./test.cc ../src/circ_buff.c -I ../include/
|