药导

药导

1个粉丝

23

问答

0

专栏

11

资料

药导  发布于  2016-09-12 20:45:56
采纳率 0%
23个问答
4979

海思播放音频的问题

 
本帖最后由 药导 于 2016-9-13 08:35 编辑

题主最近在尝试使用海思接口播放音频,做法借鉴了sample_audio.c 里面的从文件中读数据输入给ADEC,然后ADEC绑定AO,不同的是我只播一次(demo的做法是一直循环播),我现在的问题是,只播一次的话,文件后面很长一段播不出来,请问有人遇到过吗?



我来回答
回答21个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-09-13 08:03:23
认可0
贴代码吧, 不然谁也猜不出来

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-09-13 08:28:01
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=37676&ptid=12632]zhuangweiye 发表于 2016-9-13 08:03[/url]
贴代码吧, 不然谁也猜不出来[/quote]

好的,这就贴

goodman

4个粉丝

30

问答

18

专栏

17

资料

goodman 2016-09-13 08:28:40
认可0
发送数据以640为单位发,我之前测试的时候发送任意大小不行,640位单位发送是OK的。(3531下的立体声)

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-09-13 08:37:28
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=37679&ptid=12632]goodman 发表于 2016-9-13 08:28[/url]
发送数据以640为单位发,我之前测试的时候发送任意大小不行,640位单位发送是OK的。(3531下的立体声)[/quote]

我是在3518E上的单声道,demo也是640,但是声音最后的一段会播不出来

Singcol

0个粉丝

4

问答

0

专栏

1

资料

Singcol 2016-09-13 08:44:03
认可0
这是解码什么格式的音频?

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-09-13 09:15:51
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=37683&ptid=12632]Singcol 发表于 2016-9-13 08:44[/url]
这是解码什么格式的音频?[/quote]

我现在解码的是AAC

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-09-13 09:52:01
认可0
1。楼主的代码并没有体现出编码格式
2。楼主的代马也没有体现出海思的音频头

海思的音频头是比较重要的东西(不管是编码还是解码)
海思音频帧包括头和数据(这个和AUDIO_STREAM_S不是一个东西)
音频头4个字节, 前两个为0x00, 0x01,第三个是数据长度(单位是HI_S16),第四个是计数器

所以送到解码器的应该是下面的例子( 其中buffer是裸码流,buflen是裸码流长度)
        unsigned char decodebuf[1024];

        decodebuf[0] = 0x00;
        decodebuf[1] = 0x01;
        decodebuf[2] = buflen/2;
        decodebuf[3] = 0;
        memcpy(decodebuf + 4, buffer, buflen);

        adecStream.u64TimeStamp = 0;
        adecStream.u32Seq = s_seq++;
        adecStream.u32Len = buflen + 4;
        adecStream.pStream = ((unsigned char *)decodebuf);
        s32Ret = HI_MPI_ADEC_SendStream(adecchn, &adecStream,HI_TRUE);

需要注意的,不同的编码格式,buflen海思有可能有一些限制

楼主说后面一段播不出来,是多长?

drafour

1个粉丝

7

问答

0

专栏

1

资料

drafour 2016-09-13 12:30:23
认可0
本帖最后由 drafour 于 2016-9-13 12:34 编辑

播完之后不要马上释放adec相关,做一个sleep多等待几秒。
我试过,就好像播放里面有buffer似的,明明文件读完了,但是播放没有完毕。
如果你文件读完就释放,会导致后面的播放不了了。

如果sleep时间长,能播放完毕了,那就是我说的这个问题。
如果sleep再长,也播放不完,那就是文件后面的编码不对,导致无法播放

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-09-13 14:05:30
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=37703&ptid=12632]drafour 发表于 2016-9-13 12:30[/url]
播完之后不要马上释放adec相关,做一个sleep多等待几秒。
我试过,就好像播放里面有buffer似的,明明文件 ...[/quote]

睡眠到60s都播不完,但是我用sample的方法,就是读到文件尾又从文件头重新开始读的话,是没问题的

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-09-13 14:17:34
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=37694&ptid=12632]zhuangweiye 发表于 2016-9-13 09:52[/url]
1。楼主的代码并没有体现出编码格式
2。楼主的代马也没有体现出海思的音频头

[/quote]

我编码是AAC,解码也是用的海思的AAC解码库。
最后一段大概有一秒多播不出来吧

drafour

1个粉丝

7

问答

0

专栏

1

资料

drafour 2016-09-13 14:50:19
认可0
本帖最后由 drafour 于 2016-9-13 14:51 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=37707&ptid=12632]药导 发表于 2016-9-13 14:05[/url]
睡眠到60s都播不完,但是我用sample的方法,就是读到文件尾又从文件头重新开始读的话,是没问题的[/quote]

如果说sleep2秒和sleep60秒,未播完的长度都是一样的话,
那只能在你结束while的地方,加log输出,看到底从文件里共读了多少个字节,是否和文件大小一致。
另外文件是否正好是640的整数倍?

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-09-13 15:12:28
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=37714&ptid=12632]drafour 发表于 2016-9-13 14:50[/url]
如果说sleep2秒和sleep60秒,未播完的长度都是一样的话,
那只能在你结束while的地方,加log输出,看 ...[/quote]

文件不是640整数倍的,我试试你书偶读

drafour

1个粉丝

7

问答

0

专栏

1

资料

drafour 2016-09-13 15:19:55
认可0
本帖最后由 drafour 于 2016-9-13 15:23 编辑

不足640,用0去填充试试。
stAudioStream.u32Len = 640;
固定死

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-09-13 15:39:48
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=37718&ptid=12632]drafour 发表于 2016-9-13 15:19[/url]
不足640,用0去填充试试。
stAudioStream.u32Len = 640;
固定死[/quote]

刚用 0 填充了,也是不行

Singcol

0个粉丝

4

问答

0

专栏

1

资料

Singcol 2016-09-14 09:10:36
认可0
我当时解码AAC也遇到了这个问题,先尝试用0填充发现没用,后面就从网上找段完全静音的音频文件,转成AAC格式,再读一小段到程序buffer里面,每当往这个接口HI_MPI_ADEC_SendStream里面送完一段音频流后,再往这个接口里面送填充mute音频流的buffer。问题就解决了,笨方法,哈哈!

drafour

1个粉丝

7

问答

0

专栏

1

资料

drafour 2016-09-14 11:25:34
认可0
楼上说的应该对。
时间太久忘记了,我当初好像是不用0,不足640用静音填充测试的。

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-09-16 09:28:48
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=37765&ptid=12632]Singcol 发表于 2016-9-14 09:10[/url]
我当时解码AAC也遇到了这个问题,先尝试用0填充发现没用,后面就从网上找段完全静音的音频文件,转成AAC格 ...[/quote]

我明白你这样的意思,我现在在每段音频后面都加了一段时间的静音,不过我现在是用流的方式去播的,可能换成packet会更好一点

seawaterblue

0个粉丝

6

问答

0

专栏

0

资料

seawaterblue 2016-09-19 14:58:15
认可0
这算海思的bug吗?

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-09-20 08:29:18
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=37966&ptid=12632]seawaterblue 发表于 2016-9-19 14:58[/url]
这算海思的bug吗?[/quote]

这个应该不算吧

zjx94

0个粉丝

7

问答

0

专栏

0

资料

zjx94 2017-03-09 11:47:10
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=37679&ptid=12632]goodman 发表于 2016-9-13 08:28[/url]
发送数据以640为单位发,我之前测试的时候发送任意大小不行,640位单位发送是OK的。(3531下的立体声)[/quote]

我设置只能设置单声道,但是aenc_getstream()出来的数据是640,这640的数据我要怎么处理呢
加载中···
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区