Как изменить битрейт аудио кодирования в Gstreamer в состоянии PLAYING?

  • Я хочу преобразовать файл FLAC в файл MP3 (и Vorbis, во второй раз).

  • Эти потоки MP3/Vorbis затем передаются в сыром виде на второе устройство, которое их декодирует.

  • В зависимости от качества передачи, я хочу иметь возможность изменять битрейт на лету.

  • Изменение должно быть без пропусков (отсюда и "в состоянии PLAYING" в заголовке).

  • Конкретные кодеры lamemp3enc а также vorbisenc (и не может быть изменено).


Насколько мне известно, изменение битрейта во время игры на самом деле невозможно с этими кодеками.

Но я думаю, что есть чистые и простые способы изменить битрейт без какого-либо пробела в потоке: я хотел бы узнать о любом из них.

(NB: я написал любой, не все, я не прошу "лучший" способ, я не прошу рецензию, я просто хочу что-то, что работает.)

1 ответ

Решение

Прочитайте это..

Ты сможешь:

  • заблокировать элемент перед lamemp3enc
  • сбросить закодированные кадры в очередь с EOS, отправленным в lame, и сбросить EOS, когда он выйдет из lame
  • затем установите lamemp3enc в состояние NULL
  • изменить параметры
  • установите lame на PLAYING или PAUSED - это снова добавит новые данные, используя новый битрейт
  • проверьте, когда хромает в игре, а затем вы знаете, что все работает
  • не должно быть пробела, так как в очереди много старых буферов, которые она отправляет вперед, когда вы делаете ведьму

Вы можете вдохновиться примером из приведенной выше ссылки. Однако вы не удаляете и не добавляете новые элементы. Не забудьте установить его в состояние NULL, так как он отбросит все внутренние состояния (надеюсь, если он не глючит), Тогда вы просто измените параметры с g_object_set...

Также я никогда не делал этого, поэтому вы также можете спросить на IRC#gstreamer на freenode, если вы застряли или не уверены.

НТН

Другие вопросы по тегам