首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用BOS拆分ogg vorbis流

不使用BOS拆分ogg vorbis流
EN

Stack Overflow用户
提问于 2020-04-16 00:19:29
回答 1查看 92关注 0票数 0

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

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

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

我正在尝试使用vcut。我对其进行了修改,使其在一秒内创建了无限的块。这很简单,而且它可以在BOS中处理文件和流。我还破解了它,所以我将参考流的第一页写入文件,然后在没有BOS的情况下读取生产流。这样,vs->头就被填充了。当我检测到页面序列号发生变化时,我会对其进行更改,以便vcut和libogg不会异常:

代码语言:javascript
复制
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;
    }

然而,这种巨大的黑客攻击并不起作用。如何解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2020-04-16 01:26:51

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

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

在process_audio_packet中,我添加了:

代码语言:javascript
复制
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) {
...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61233600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档