簡體   English   中英

分體ogg vorbis stream 不帶BOS

[英]Split ogg vorbis stream without BOS

輸入:來自嵌入式系統的編碼器芯片的 ogg/vorbis 的 stream。

問題:無需轉碼即可創建一秒的 output 塊。

問題:stream 正在“中間”讀取,因此帶有 BOS(流開始)的第一頁不可用。 由於編碼器芯片始終具有相同的參數,因此我想使用從一開始就讀取的 stream 的 BOS 頁面(參考流)重新創建 BOS 頁面。

我正在嘗試使用vcut 我對其進行了修改,以便它創建一秒鍾的無限塊。 這很簡單,並且可以使用 BOS 處理文件和流。 我還破解了它,以便我將參考 stream 的第一頁寫入文件,然后在閱讀沒有 BOS 的生產 stream 之前閱讀它們。 這樣,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 不起作用。 如何解決這個問題?

它確實有效:參見VS1053 split ogg

我需要做的是考慮在stream中間開始閱讀,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) {
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM