Сплит Ogg Vorbis поток без ЛС - PullRequest
0 голосов
/ 15 апреля 2020

Входные данные: поток ogg / vorbis, поступающий от микросхемы кодировщика встроенной системы.

Проблема: создание выходных фрагментов за одну секунду без перекодирования.

Проблема: поток обрабатывается читайте "посередине", поэтому первая страница с BOS (Beginning of Stream) недоступна. Поскольку микросхема кодера всегда имеет одни и те же параметры, я бы хотел воссоздать страницу BOS, используя страницу BOS потока, который был прочитан с начала (эталонный поток).

Я пытаюсь использовать vcut . Я изменил его так, чтобы он создавал бесконечные куски за одну секунду. Это было легко, и это работает с файлами и потоками с BOS. Я также взломал его, чтобы записать в файл первые страницы ссылочного потока, а затем прочитать их, прежде чем читать рабочий поток без BOS. Таким образом, vs-> заголовки заполняются. Когда я обнаруживаю изменение серийного номера страницы, я изменяю его так, чтобы 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;
    }

Однако, этот гигантский взлом c не работает. Как решить эту проблему?

1 Ответ

0 голосов
/ 15 апреля 2020

Это на самом деле работает: см. 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) {
...
...