输入:来自嵌入式系统编码器芯片的ogg / vorbis流。

问题:创建一秒钟的输出块而不进行代码转换。

问题:正在“中间”读取流,因此带有BOS的第一页(流的开头)不可用。由于编码器芯片始终具有相同的参数,因此我想使用从头开始读取的流(引用流)的BOS页面重新创建BOS页面。

我正在尝试使用vcut。我对其进行了修改,以便创建一秒钟的无限块。这很容易,并且可以与BOS一起处理文件和流。
我还对其进行了修改,以便将引用流的第一页写入文件,然后在没有BOS的情况下读取生产流之前先对其进行读取。这样,将填充vs-> header。当我检测到页面序列号更改时,会对其进行更改,以使vcut和libogg不会出现异常:

int process_page(vcut_state *s, ogg_page *page) {
    ...
    else if(vs->serial != ogg_page_serialno(page))
    {
        // fprintf(stderr, _("Multiplexed bitstreams are not supported.\n"));

        vs->stream_in.serialno = ogg_page_serialno(page);
        vs->serial = ogg_page_serialno(page);
        vs->granulepos = -1;
        vs->initial_granpos = 0;
        // ogg_stream_init(&vs->stream_in, vs->serial);
        // vorbis_info_init(&vs->vi);
        // vorbis_comment_init(&vs->vc);
        s->vorbis_init = 1;
    }

但是,这种巨大的黑客无法正常工作。如何解决这个问题?

最佳答案

它实际上有效:请参见VS1053 split ogg

我需要做的是考虑从溪流中间开始阅读,grainpospos自然很高。因此,这是我的逻辑错误。

在process_audio_packet中,我添加了:

int process_audio_packet(vcut_state *s,
        vcut_vorbis_stream *vs, ogg_packet *packet)
{
    ...

    if(packet->granulepos >= 0)
    {

        if (!firstNonZeroGranule) { // my addition
            firstNonZeroGranule = 1;
            vs->initial_granpos = packet->granulepos - bs;
            if(vs->initial_granpos < 0)
                vs->initial_granpos = 0;
        } else if(vs->granulepos == 0 && packet->granulepos != bs) {
...

关于c - 不带BOS的分割Ogg vorbis流,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61233600/

10-10 16:46