gpt4 book ai didi

c - 实现网络电台 : trying to open '.au' file in c

转载 作者:太空宇宙 更新时间:2023-11-04 03:43:14 25 4
gpt4 key购买 nike

我正在尝试用 C 语言实现“互联网广播”。这需要一个持续播放音频文件的服务器,并且每当客户端请求到达时,服务器都会创建一个线程来将音频文件传送给用户。服务器在启动时会生成一个线程,该线程继续将音频文件写入全局缓冲区空间,用户相应的缓冲区继续从全局缓冲区空间读取,并继续以“ block ”的形式向用户发送音频文件。并且用户尝试通过“/dev/audio”(我使用的是 ubuntu)的帮助来播放音频文件。

问题是,当我尝试在服务器上使用“打开”功能打开“.au”文件时,分配的文件描述符为 0。因此,我无法从音频文件中提取内容并将其发送给客户端(而是我在终端上输入的任何内容都会发送给客户端)。

有没有什么方法可以用 C 中的“打开”功能打开“.au”文件?如果不是,那么“打开”功能支持哪些文件扩展名,我可以做什么,即我应该使用什么类型的文件扩展名来使“打开”功能打开文件并发送给用户?

最佳答案

确保您使用的是二进制打开文件模式 - IE。 given_mode = "rb"其中 r 表示读取,b 表示二进制 - 以下代码读取二进制文件并输出前几个字节 - 享受

//  gcc -o read_binary_au_file  read_binary_au_file.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

int main() {

const char * given_mode = "rb";
const char * given_filename = "/home/scott/Documents/data/audio/sample.au";

FILE * fh;
fh = fopen(given_filename, given_mode);

if (fh == NULL) {
fprintf(stderr, "ERROR - failed to open file %s in mode %s\n",
given_filename, given_mode);
return (-2);
}

// --- identify file size --- //

off_t file_size;
struct stat stat_struct; // data structure to be returned from call to fstat on file descriptor

int fd = fileno(fh); // get file descriptor from file handle

if ((fstat(fd, & stat_struct) != 0) || (! S_ISREG(stat_struct.st_mode))) {

fprintf(stderr, "ERROR - failed to stat file");
return (-3);
}


file_size = stat_struct.st_size;

printf("file_size %lu\n", file_size);

// --- now read data from the binary file --- //

unsigned long MAX_READ_CHARS = 4096;

unsigned long desired_num_bytes_to_read = (file_size > MAX_READ_CHARS) ? MAX_READ_CHARS : file_size;

char * mem_buffer = malloc(sizeof(char) * desired_num_bytes_to_read);

unsigned long num_bytes_actually_io = 0;

// read initial bytes into memory buffer

num_bytes_actually_io = fread(mem_buffer, sizeof(char), desired_num_bytes_to_read, fh);

if (fclose(fh)) {

fprintf(stderr, "ERROR - failed to close file\n");
return (-4);
}

if (num_bytes_actually_io != desired_num_bytes_to_read) {

fprintf(stderr, "ERROR - failed to read desired_num_bytes_to_read %lu ... instead num_bytes_actually_io %lu\n",
desired_num_bytes_to_read, num_bytes_actually_io);

return (-1);
}

printf("num_bytes_actually_io %lu\n", num_bytes_actually_io);

// ... now do something with mem_buffer which contains data read from binary file

int num_bytes_to_show = 100;

num_bytes_to_show = (num_bytes_actually_io > num_bytes_to_show) ? num_bytes_to_show : num_bytes_actually_io;

printf("\nhere are the first %d characters from given binary file\n", num_bytes_to_show);

printf("-->");
int i = 0;
for (; i < num_bytes_to_show; i++) {

// printf("%c", mem_buffer[i]); // as chars
printf("%x", mem_buffer[i]); // as hex
}
printf("<--");

printf("\n");

free(mem_buffer);

printf("\nprocessing complete\n");

return 0;
}

关于c - 实现网络电台 : trying to open '.au' file in c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26830961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com