- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有 .wav 文件,我会使用 opus 对它们进行编码,将所有内容写入 .opus 文件,然后使用 vlc 读取它。我已经使用 opus trivial example 完成了一些代码,但质量很差。其实有个问题,我从来不写header,这正常吗?我忘记了什么?
#define FRAME_SIZE 960
#define SAMPLE_RATE 48000 //frequence
#define CHANNELS 1 // up to 255
#define APPLICATION OPUS_APPLICATION_AUDIO
#define MAX_FRAME_SIZE 6*960
#define MAX_PACKET_SIZE (3*1276)
#define BUFFER_LEN 1024
int main(int argc, char **argv)
{
char *inFile;
FILE *fin;
char *outFile;
FILE *fout;
opus_int16 in[FRAME_SIZE*CHANNELS];
unsigned char cbits[MAX_PACKET_SIZE];
OpusEncoder *encoder;
int err;
/*Create a new encoder state */
encoder = opus_encoder_create(SAMPLE_RATE, CHANNELS, APPLICATION, &err);
if (err<0)
{
fprintf(stderr, "failed to create an encoder: %s\n", opus_strerror(err));
return EXIT_FAILURE;
}
opus_encoder_ctl(encoder, OPUS_SET_BITRATE(512000)); //500 to 512 000 // 350 000 pas trop mal
if (err<0)
{
fprintf(stderr, "failed to set bitrate: %s\n", opus_strerror(err));
return EXIT_FAILURE;
}
inFile = "toencode.wav";
fin = fopen(inFile, "r");
if (fin==NULL)
{
fprintf(stderr, "in: failed to open file: %s\n", strerror(errno));
return EXIT_FAILURE;
}
if (err<0)
{
fprintf(stderr, "failed to create decoder: %s\n", opus_strerror(err));
return EXIT_FAILURE;
}
outFile = "encoded.opus";
fout = fopen(outFile, "w");
if (fout==NULL)
{
fprintf(stderr, "failed to open file: %s\n", strerror(errno));
return EXIT_FAILURE;
}
while (1)
{
int i;
unsigned char pcm_bytes[MAX_FRAME_SIZE*CHANNELS*2];
/* Read a 16 bits/sample audio frame. */
fread(pcm_bytes, sizeof(short)*CHANNELS, FRAME_SIZE, fin);
if (feof(fin))
break;
/* Convert from little-endian ordering. */
for (i=0;i<CHANNELS*FRAME_SIZE;i++)
in[i]=pcm_bytes[2*i+1]<<8|pcm_bytes[2*i];
/* Encode the frame. */
if (opus_encode(encoder, in, FRAME_SIZE, cbits, MAX_PACKET_SIZE)<0)
{
// fprintf(stderr, "encode failed: %s\n", opus_strerror(nbBytes));
return EXIT_FAILURE;
}
fwrite(in,sizeof(short),sizeof(in),fout);
}
/*Destroy the encoder state*/
opus_encoder_destroy(encoder);
fclose(fin);
fclose(fout);
return EXIT_SUCCESS;
}
我认为我如何编写文件存在一个真正的问题,但我不知道它来自哪里,你能帮我吗?
最佳答案
要制作可播放的 .opus 文件,您需要构建标题并将它们封装在一系列 Ogg 页面中,然后再写出流。参见 https://git.xiph.org/?p=opus-tools.git;a=blob;f=src/opusenc.c用于开源实现。
请注意,如果您对 MAX_FRAME_SIZE 使用 960 个样本,您将获得更好的结果。将比特率提高到最大值也不会对听觉产生太大影响。
关于c++ - 如何使用 libopus 获得格式正确的 opus 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32457874/
目前我正在尝试为 libopus 构建 JNI 绑定(bind)。我目前的问题是我有一个像这样的 C 方法: JNIEXPORT jobject JNICALL Java_de_akuz_androi
我正在从 Windows 10 机器上运行 ffmpeg。 我的目标是从轨道的开头到结尾修剪静音(这很好用)并使用 opus 进行压缩。 我是“音频精化”世界的新手,所以也许我没有正确理解这一点……但
我从 avcodec_open2 得到一个无效的选项结果在带有 libopus 1.1.4 的 ffmpeg 3.1.6 中。我已对所有选项进行了排序,但找不到有问题的选项 I created a g
我有 .wav 文件,我会使用 opus 对它们进行编码,将所有内容写入 .opus 文件,然后使用 vlc 读取它。我已经使用 opus trivial example 完成了一些代码,但质量很差。
是否可以使用 Emscripten 优化构建/编译 Opus/libopus?我不确定这是否是 Emscripten 和 WebAssembly 的一般当前限制,或者是否存在确保解码器在 WebAss
我正在尝试使用 libopus 对来自硬件的传入 pcm 数据进行编码,然后使用相同的库对其进行解码,但我得到的结果是 decoded.raw 可以使用 aplay 播放-t raw --rate=4
我是一名优秀的程序员,十分优秀!