【问题标题】:Split ogg vorbis stream without BOS在没有 BOS 的情况下拆分 ogg vorbis 流
【发布时间】:2020-04-16 01:26:50
【问题描述】:

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

问题:在不转码的情况下创建一秒的输出块。

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

我正在尝试使用vcut。我对其进行了修改,以便它创建一秒钟的无限块。这很简单,并且可以使用 BOS 处理文件和流。 我还破解了它,以便我将参考流的第一页写入文件,然后在读取没有 BOS 的生产流之前读取它们。这样,vs->headers 就被填充了。当我检测到页面序列号发生变化时,我会对其进行更改,以便 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;
    }

但是,这个巨大的 hack 不起作用。如何解决这个问题?

【问题讨论】:

    标签: c audio ogg vorbis


    【解决方案1】:

    它确实有效:见VS1053 split ogg

    我需要做的是考虑从流的中间开始阅读,granulepos 自然很高。所以这是我的逻辑错误。

    在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) {
    ...
    

    【讨论】:

      猜你喜欢
      • 2012-06-09
      • 1970-01-01
      • 2014-12-28
      • 2020-02-05
      • 2011-06-12
      • 2018-08-09
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      相关资源
      最近更新 更多