Gstreamer在PLAYING状态下如何改变音频编码的码率?
How to change the bitrate of audio encoding in Gstreamer in the PLAYING state?
我想将 FLAC 文件转换为 MP3(和 Vorbis,第二次)文件。
然后将这些 MP3/Vorbis 流以原始方式传输到第二台设备进行解码。
根据传输质量,我希望能够更改比特率on-the-fly。
变化必须是无缝的(因此标题中的 "in the PLAYING state")。
具体的编码器是lamemp3enc
和vorbisenc
(且不可更改)。
据我所知,这些编解码器实际上无法在播放时更改比特率。
但我想有一些简单明了的方法可以改变比特率,而不会在流中引入任何间隙:我想了解其中的任何一种。
(注意:我确实写了 any,而不是 all,我不是在要求 "best" 方式,我我不要求评论,我只想要有用的东西。)
通读 this ..
你会:
- lamemp3enc 之前的块元素
- 将编码的帧与发送到 lame 的 EOS 一起冲入队列,并在 EOS 从 lame 出来时丢弃 EOS
- 然后将 lamemp3enc 设置为 NULL 状态
- 更改参数
- 将 lame 设置为播放或暂停 - 这将使用新比特率使用新数据再次预播放它
- 检查 lame 何时播放,然后您就知道一切正常
- 应该没有间隙,因为队列有很多旧缓冲区,它会在您执行
期间向前发送这些缓冲区
你可以用上面 link 的例子来启发自己。但是你没有做任何删除和添加新元素。不要忘记将它设置为 NULL 状态,因为它会丢弃所有内部状态(如果它不是越野车,希望如此)。然后你只需更改参数 g_object_set
...
此外,我从未这样做过,所以如果您遇到困难或不确定,也可以在 freenode 的 #gstreamer 的 IRC 上提问。
HTH
我想将 FLAC 文件转换为 MP3(和 Vorbis,第二次)文件。
然后将这些 MP3/Vorbis 流以原始方式传输到第二台设备进行解码。
根据传输质量,我希望能够更改比特率on-the-fly。
变化必须是无缝的(因此标题中的 "in the PLAYING state")。
具体的编码器是
lamemp3enc
和vorbisenc
(且不可更改)。
据我所知,这些编解码器实际上无法在播放时更改比特率。
但我想有一些简单明了的方法可以改变比特率,而不会在流中引入任何间隙:我想了解其中的任何一种。
(注意:我确实写了 any,而不是 all,我不是在要求 "best" 方式,我我不要求评论,我只想要有用的东西。)
通读 this ..
你会:
- lamemp3enc 之前的块元素
- 将编码的帧与发送到 lame 的 EOS 一起冲入队列,并在 EOS 从 lame 出来时丢弃 EOS
- 然后将 lamemp3enc 设置为 NULL 状态
- 更改参数
- 将 lame 设置为播放或暂停 - 这将使用新比特率使用新数据再次预播放它
- 检查 lame 何时播放,然后您就知道一切正常
- 应该没有间隙,因为队列有很多旧缓冲区,它会在您执行 期间向前发送这些缓冲区
你可以用上面 link 的例子来启发自己。但是你没有做任何删除和添加新元素。不要忘记将它设置为 NULL 状态,因为它会丢弃所有内部状态(如果它不是越野车,希望如此)。然后你只需更改参数 g_object_set
...
此外,我从未这样做过,所以如果您遇到困难或不确定,也可以在 freenode 的 #gstreamer 的 IRC 上提问。
HTH