关于speex音频编码的问题.

honglqin 2012-08-22 06:31:17
最近在研究speex音频编解码.如果是一个线程在进行编码的话那是可以用的.但是为了提高编码速度,我想用两个或两个以上的线程同时编码两个或两个以上帧的数据.可是这样编码出来的数据解码后播放出来完全不对啊.
有没有哪位大侠知道如何用speex在多线程下同时编码的吗?
...全文
399 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
程一个大前端 2014-05-07
  • 打赏
  • 举报
回复
你的编码 是怎么弄的哦?能跟我说说么,我弄了好久了,是iOS端的!
honglqin 2012-10-09
  • 打赏
  • 举报
回复
我原来的数据是双声道的,提取出一个声道的数据进行编码就可以了。
honglqin 2012-08-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
数据是大于两帧的,知道帧数据的区别吗?是不同的通道,还是什么的?
[/Quote]

好吧,就这么和你说吧.
我通过某种特别的方法获取耳机的PCM数据.但这种方法有个特点,如果你不快点把数据读出数据就会丢失.
现在我要用speex编码然后再用网络发送出去.可是speex编码速度不够快,使得PCM数据丢失.现在我只是想提高speex编码速度就用多线程进行同时编码.可是多线程编码出错了.就是这样.
图灵狗 2012-08-23
  • 打赏
  • 举报
回复
数据是大于两帧的,知道帧数据的区别吗?是不同的通道,还是什么的?
honglqin 2012-08-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
一个音频设备的话,物理上你无法多个线程同时去操作它。而且没有必要这么做,你可以一个线程去编码,然后编码出来的音频流,其它线程是可以共享的。
[/Quote]

我没有用多线程操作设备.我只是用一个线程操作设备,从设备里读出来的数据是大于两帧的.所以我想在读取完数据后再用多个线程同时编码.我也只是想提高编码速度而已.
图灵狗 2012-08-23
  • 打赏
  • 举报
回复
一个音频设备的话,物理上你无法多个线程同时去操作它。而且没有必要这么做,你可以一个线程去编码,然后编码出来的音频流,其它线程是可以共享的。
honglqin 2012-08-23
  • 打赏
  • 举报
回复
不可行也没有意义,能否说明一下为什么?这个我还真是不懂.要不然会很纠结的.
图灵狗 2012-08-23
  • 打赏
  • 举报
回复
1个音频设备多线程同时编码是不可行也没有意义的,不同的音频同时解码然后混合输出是可以的。
honglqin 2012-08-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
你的音频设备应该只有1个,2个以上的线程不能同时去操作音频设备,所以你得用一些信号量来管理它。
[/Quote]

我每次从从音频设备里读出来的数据是大于两帧的.所以我想用多线程进行同时编码.
honglqin 2012-08-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
实时是相对的,你的系统资源不足所以才需要多加Buffer,一点点延迟而已。
[/Quote]

那我试下你的方法,有结果后告诉你.
图灵狗 2012-08-23
  • 打赏
  • 举报
回复
实时是相对的,你的系统资源不足所以才需要多加Buffer,一点点延迟而已。
honglqin 2012-08-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
原来如此!所以其实你应该把这个过程分成两个部分,用Double Buffer来解决问题,如果仍然不够快,可以试着增加Buffer,原理是一样的。两个Buffer假设都为32KB,PCM先往第一块Buffer写,第二块Buffer空闲,当写满后送给speex编码,PCM接着往第二块Buffer写,满了之后把第二块Buffer送给speex编码,如此循环。


引用 8 楼 的回复:

引用……
[/Quote]

如果是这样的话,那往Buffer写数据的速度肯定是比编码的速度快.Buffer肯定会被写满的.要是加多一些Buffer,那接收方的声音就会延迟的.我这个项目是要求实时性的.
图灵狗 2012-08-23
  • 打赏
  • 举报
回复
原来如此!所以其实你应该把这个过程分成两个部分,用Double Buffer来解决问题,如果仍然不够快,可以试着增加Buffer,原理是一样的。两个Buffer假设都为32KB,PCM先往第一块Buffer写,第二块Buffer空闲,当写满后送给speex编码,PCM接着往第二块Buffer写,满了之后把第二块Buffer送给speex编码,如此循环。

[Quote=引用 8 楼 的回复:]

引用 7 楼 的回复:
数据是大于两帧的,知道帧数据的区别吗?是不同的通道,还是什么的?


好吧,就这么和你说吧.
我通过某种特别的方法获取耳机的PCM数据.但这种方法有个特点,如果你不快点把数据读出数据就会丢失.
现在我要用speex编码然后再用网络发送出去.可是speex编码速度不够快,使得PCM数据丢失.现在我只是想提高speex编码速度就用多线程进行同时编码.可是多线程编……
[/Quote]
就想叫yoko 2012-08-23
  • 打赏
  • 举报
回复
采集到的PCM数据应该放入队列,另起线程做编码发送处理。
图灵狗 2012-08-22
  • 打赏
  • 举报
回复
你的音频设备应该只有1个,2个以上的线程不能同时去操作音频设备,所以你得用一些信号量来管理它。

70,021

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧