欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

CELT编码解码

发布时间:2025/7/14 编程问答 36 豆豆
生活随笔 收集整理的这篇文章主要介绍了 CELT编码解码 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
解码:

 
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
 
#include "celt.h"
 
int
main(int argc, char **argv) {
    char data[2048] = { };
    short pcm[2048] = { };
    int rate        = 48000;
    int framesize   = 960;
    int channels    = 1;
    int tmp;
    int rem;
    void *mode;
    void *state;
    uint16_t len;
 
    while ((tmp = getopt(argc, argv, "r:f:c:")) != -1) {
        switch (tmp) {
          case 'r':
            rate = atoi(optarg);
            break;
          case 'f':
            framesize = atoi(optarg);
            break;
          case 'c':
            channels = atoi(optarg);
            break;
        }
    }
    if (!(mode = celt_mode_create(rate, framesize, &tmp))) {
        fprintf(stderr, "error: celt_mode_create: %s\n", celt_strerror(tmp));
        return 1;
    }
    if (!(state = celt_decoder_create_custom(mode, channels, &tmp))) {
        fprintf(stderr, "error: celt_decoder_create_custom: %s\n", celt_strerror(tmp));
        celt_mode_destroy(mode);
        return 1;
    }
 
    for (len = 0;;) {
        if (!len) {
            if (read(STDIN_FILENO, &len, sizeof(len)) != sizeof(len)) {
                break;
            }
            if (len > sizeof(data)) {
                fprintf(stderr, "error: celt packet larger than buffer\n");
                celt_decoder_destroy(state);
                celt_mode_destroy(mode);
                return 1;
            }
            rem = len;
        }
        if ((tmp = read(STDIN_FILENO, data + (len - rem), rem)) < 0) {
            fprintf(stderr, "error: read: %s\n", strerror(errno));
            celt_decoder_destroy(state);
            celt_mode_destroy(mode);
            return 1;
        }
        if (!tmp) {
            break;
        }
        if (tmp != rem) {
            rem -= tmp;
            continue;
        }
        if ((tmp = celt_decode(state, (void *)data, len, pcm, framesize)) < 0) {
            fprintf(stderr, "error: celt_decode: %s\n", celt_strerror(tmp));
            celt_decoder_destroy(state);
            celt_mode_destroy(mode);
            return 1;
        }
        len = 0;
        if (write(STDOUT_FILENO, pcm, sizeof(*pcm) * framesize * channels) < 0) {
            fprintf(stderr, "error: write: %s\n", strerror(errno));
            celt_decoder_destroy(state);
            celt_mode_destroy(mode);
            return 1;
        }
    }
 
    celt_decoder_destroy(state);
    celt_mode_destroy(mode);
 
    return 0;
}



编码: #include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
 
#include "celt.h"
 
int
main(int argc, char **argv) {
    short pcm[2048] = { };
    char data[2048] = { };
    int rate        = 48000;
    int framesize   = 960;
    int channels    = 1;
    int bitrate     = 0;
    int variable    = 0;
    int prediction  = 2;
    int complexity  = 10;
    int tmp;
    int rem;
    void *mode;
    void *state;
    uint16_t len;
 
    while ((tmp = getopt(argc, argv, "r:f:c:b:vp:x:")) != -1) {
        switch (tmp) {
          case 'r':
            rate = atoi(optarg);
            break;
          case 'f':
            framesize = atoi(optarg);
            break;
          case 'c':
            channels = atoi(optarg);
            break;
          case 'b':
            bitrate = atoi(optarg);
            break;
          case 'v':
            variable = 1;
            break;
          case 'p':
            prediction = atoi(optarg);
            break;
          case 'x':
            complexity = atoi(optarg);
            break;
        }
    }
    if (!(mode = celt_mode_create(rate, framesize, &tmp))) {
        fprintf(stderr, "error: celt_mode_create: %s\n", celt_strerror(tmp));
        return 1;
    }
    if (!(state = celt_encoder_create_custom(mode, channels, &tmp))) {
        fprintf(stderr, "error: celt_encoder_create_custom: %s\n", celt_strerror(tmp));
        celt_mode_destroy(mode);
        return 1;
    }
    if (bitrate && celt_encoder_ctl(state, CELT_SET_BITRATE(bitrate)) != CELT_OK) {
        fprintf(stderr, "error: celt_encoder_ctl: CELT_SET_BITRATE: bitrate request failed\n");
        celt_encoder_destroy(state);
        celt_mode_destroy(mode);
        return 1;
    }
    if (variable && celt_encoder_ctl(state, CELT_SET_VBR(variable)) != CELT_OK) {
        fprintf(stderr, "error: celt_encoder_ctl: CELT_SET_VBR: vbr request failed\n");
        celt_encoder_destroy(state);
        celt_mode_destroy(mode);
        return 1;
    }
    if (celt_encoder_ctl(state, CELT_SET_PREDICTION(prediction)) != CELT_OK) {
        fprintf(stderr, "error: celt_encoder_ctl: CELT_SET_PREDICTION: prediction request failed\n");
        celt_encoder_destroy(state);
        celt_mode_destroy(mode);
        return 1;
    }
    if (celt_encoder_ctl(state, CELT_SET_COMPLEXITY(complexity)) != CELT_OK) {
        fprintf(stderr, "error: celt_encoder_ctl: CELT_SET_COMPLEXITY: complexity 0 through 10 is only supported\n");
        celt_encoder_destroy(state);
        celt_mode_destroy(mode);
        return 1;
    }
 
    for (len = 0;;) {
        if (!len) {
            len = sizeof(*pcm) * framesize * channels;
            if (len > sizeof(pcm)) {
                fprintf(stderr, "error: pcm frame larger than buffer\n");
                celt_encoder_destroy(state);
                celt_mode_destroy(mode);
                return 1;
            }
            rem = len;
        }
        if ((tmp = read(STDIN_FILENO, (void *)pcm + (len - rem), rem)) < 0) {
            fprintf(stderr, "error: read: %s\n", strerror(errno));
            celt_encoder_destroy(state);
            celt_mode_destroy(mode);
            return 1;
        }
        if (!tmp) {
            break;
        }
        if (tmp != rem) {
            rem -= tmp;
            continue;
        }
        if ((tmp = celt_encode(state, pcm, framesize, (void *)data, sizeof(data))) < 0) {
            fprintf(stderr, "error: celt_encode: %s\n", celt_strerror(tmp));
            celt_encoder_destroy(state);
            celt_mode_destroy(mode);
            return 1;
        }
        len = tmp;
        if (write(STDOUT_FILENO, &len, sizeof(len)) < 0 || write(STDOUT_FILENO, data, len) < 0) {
            fprintf(stderr, "error: write: %s\n", strerror(errno));
            celt_encoder_destroy(state);
            celt_mode_destroy(mode);
            return 1;
        }
        len = 0;
    }
 
    celt_encoder_destroy(state);
    celt_mode_destroy(mode);
 
    return 0;
}

总结

以上是生活随笔为你收集整理的CELT编码解码的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。