yang1372073

yang1372073

0个粉丝

19

问答

0

专栏

2

资料

yang1372073  发布于  2016-09-14 12:22:26
采纳率 0%
19个问答
9330

【已解决】HI3516A音频丢帧

 
本帖最后由 yang1372073 于 2016-10-31 17:20 编辑

Hi3516A音频输出没有声音,VLC播放RTSP流,只有图像没有声音,VLC查看,音频丢帧严重,讨论一下大概什么问题?
/******************************************
        * start audio
        ******************************************/
    /* init stAio. all of cases will use it */
    AIO_ATTR_S stAioAttr;
    stAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_8000;
    stAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16;
    stAioAttr.enWorkmode = AIO_MODE_I2S_MASTER;
    stAioAttr.enSoundmode = AUDIO_SOUND_MODE_MONO;       
    stAioAttr.u32EXFlag = 1;
    stAioAttr.u32FrmNum = 30;
    stAioAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM;
    stAioAttr.u32ChnCnt = 2;
    stAioAttr.u32ClkSel = 1;

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

yang1372073

0个粉丝

19

问答

0

专栏

2

资料

yang1372073 2016-09-18 14:56:17
认可0
好像是第一帧播放了,后边的都被阻塞了,不知道配置参数有没有什么问题

wahuqeir

0个粉丝

1

问答

0

专栏

1

资料

wahuqeir 2016-09-18 16:49:00
认可0
可以先使用海思的audio sample,看看效果,再对比参数,也有可能是功能集成导致的!

yang1372073

0个粉丝

19

问答

0

专栏

2

资料

yang1372073 2016-09-19 13:04:09
认可0
现在的情况是G726可以采集存文件,RTSP流无法播放。
大致流程:
SAMPLE_COMM_AUDIO_CfgAcodec -->SAMPLE_COMM_AUDIO_StartAi -->SAMPLE_COMM_AUDIO_StartAenc
-->SAMPLE_COMM_AUDIO_AencBindAi-->SAMPLE_COMM_AUDIO_CreatTrdAencAdec2
最后一个步骤的线程获取数据流。
音频数据有链接过来,播放不对,VLC查看媒体信息采样率参数也显示不正常


补充内容 (2016-9-21 11:24):
[AI] Version: [Hi3516A_MPP_V1.0.3.0 B040 Debug], Build Time: [Mar 13 2015, 19:10:02]

-----AI DEV ATTR---------------------------------------------------------------------------------------------------------
AiDev WorkMod   SampR  BitWid  ChnCnt  ClkSel SondMod  PoiNum  ExFlag  FrmNum
    0 i2s_mas    8kHZ   16bit       2       1    mono     320       1      50

-----AI DEV STATUS-------------------------------------------------------------------------------------------------------
AiDev      IntCnt     fifoCnt     buffInt FrmTime  MaxFrmTime TranLen IsrTime  MaxIsrTime     CBPhy  CBSize   ROffSet   WOffSet
    0        5367           0           0   39996       42209    1280     220         253  a1257000    2560       500         0

-----AI DEV EXTEND STATUS------------------------------------------------------------------------------------------------
AiDev enTrack   bMute  Volume
    0       0       0       0

-----AI CHN STATUS-------------------------------------------------------------------------------------------------------
AiDev   AiChn   State    Read   Write      BufFul u32Data0 u32Data1
    0       0  enable       0       0           0 f801c801 40027002
    0       1  enable       0       0           0 ac018a00 60011802

-----AI CHN RESAMPLE STATUS----------------------------------------------------------------------------------------------
AiDev AiChn   State  bResmp  PoiNum   InSampR  OutSampR
    0     0  enable disable       0    (null)    (null)
    0     1  enable disable       0    (null)    (null)

-----AI CHN VQE STATUS---------------------------------------------------------------------------------------------------
AiDev AiChn   State    bVqe    RATE  PoiNum    bAnr    bAec   AecMode   AecAo     AecFail    bAlc  MaxLev  MinLev MaxGain  WrFile
    0     0  enable disable  (null)       0 disable disable    (null) (-1,-1)           0 disable       0       0       0 disable
    0     1  enable disable  (null)       0 disable disable    (null) (-1,-1)           0 disable       0       0       0 disable

-----AI CHN VQE EXTEND STATUS---------------------------------------------------------------------------------------------------
AiDev AiChn    bHpf HpfFreq    bRnr  MaxNrLev  UseHPF  NrThresh     Burst VadThresh    RATE    Chns  NrMode
    0     0 disable       0 disable         0 disable         0   disable         0  (null)       0       0
    0     1 disable       0 disable         0 disable         0   disable         0  (null)       0       0
#

补充内容 (2016-9-21 17:39):
sample_audio采集的pcm数据没有问题,可以播放出来。

yang1372073

0个粉丝

19

问答

0

专栏

2

资料

yang1372073 2016-09-21 17:39:59
认可0
# cat /proc/umap/aenc

[AENC] Version: [Hi3516A_MPP_V1.0.3.0 B040 Debug], Build Time[Mar 13 2015, 19:10:02]

-----AENC CHN ATTR--------------------------------------------------------------
ChnId  PlType   ADPCMType  PoiNum BufSize        G726Rate
    0    g726        NULL     320      50  MEDIA_G726_40K

-----AENC CHN STATUS------------------------------------------------------------
ChnId      RcvFrm       EncOk      FrmErr     BufFull     GetStrm     RlsStrm      WtFile
    0        6503        6503           0           0        6503        6503     disable
#

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-09-22 08:00:28
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=38158&ptid=12654]yang1372073 发表于 2016-9-21 17:39[/url]
# cat /proc/umap/aenc

[AENC] Version: [Hi3516A_MPP_V1.0.3.0 B040 Debug], Build Time[Mar 13 2015,  ...[/quote]

先确定本地的编码没有问题

如果Ao接出来了,那么可以考虑调一下Adec->Ao, 编码线程得到的数据直接放到Adec中去, 听听声音是否对。
如果没有输出设备,那么只能存文件,然后放到pc上去解码回放了

如果确定了采集和编码没有问题, 那么就是网传有问题了
另外不要忘了海思的音频头,裸码送去海思解码时要加上,从海思编码器取来的码流要去掉才是裸码

Singcol

0个粉丝

4

问答

0

专栏

1

资料

Singcol 2016-09-22 08:35:15
认可0
G726/g711等音频流海思有加私有头,标准播放要去掉私有头

yang1372073

0个粉丝

19

问答

0

专栏

2

资料

yang1372073 2016-09-22 12:23:40
认可0
本帖最后由 yang1372073 于 2016-9-22 17:49 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=38172&ptid=12654]zhuangweiye 发表于 2016-9-22 08:00[/url]
先确定本地的编码没有问题

如果Ao接出来了,那么可以考虑调一下Adec->Ao, 编码线程得到的数据直接放到A ...[/quote]

非常感谢zhuangweiye友人的建议,现在情况是:
采用PT_G726编码,50帧率,320样点每帧,linein接入,8KHz采样。

SAMPLE_COMM_AUDIO_CreatTrdAencAdec2()线程获取数据流
/******************************************************************************
* function : Create the thread to get stream from aenc and send to adec
******************************************************************************/
HI_S32 SAMPLE_COMM_AUDIO_CreatTrdAencAdec2(AENC_CHN AeChn, ADEC_CHN AdChn)
{
    SAMPLE_AENC_S *pstAenc = NULL;
   
    pstAenc = &gs_stSampleAenc;
    pstAenc->AeChn = AeChn;
    pstAenc->AdChn = AdChn;
    pstAenc->bSendAdChn = HI_TRUE;
    pstAenc->bStart = HI_TRUE;   
    pthread_create(&pstAenc->stAencPid, 0, SAMPLE_COMM_AUDIO_AencProc2, pstAenc);                //spring
   
    return HI_SUCCESS;
}

在SAMPLE_COMM_AUDIO_AencProc2()函数
/**********************************************************
********************
* function : get stream from Aenc, send it  to Adec & save it to file
******************************************************************************/
void *SAMPLE_COMM_AUDIO_AencProc2(void *parg)
{
    HI_S32 s32Ret;
    HI_S32 AencFd;
    SAMPLE_AENC_S *pstAencCtl = (SAMPLE_AENC_S *)parg;
    AUDIO_STREAM_S stStream;
    fd_set read_fds;
    struct timeval TimeoutVal;
          
        printf( "******enter audio streamProc2 ************\n" );
       
    FD_ZERO(&read_fds);   
    AencFd = HI_MPI_AENC_GetFd(pstAencCtl->AeChn);
    FD_SET(AencFd, &read_fds);
   
    while (pstAencCtl->bStart)
    {     
        TimeoutVal.tv_sec = 1;
        TimeoutVal.tv_usec = 0;
        
        FD_ZERO(&read_fds);
        FD_SET(AencFd,&read_fds);
        
        s32Ret = select(AencFd+1, &read_fds, NULL, NULL, &TimeoutVal);
        if (s32Ret < 0)
        {
            break;
        }
        else if (0 == s32Ret)
        {
            printf("%s: get aenc stream select time out\n", __FUNCTION__);
            break;
        }
        
        if (FD_ISSET(AencFd, &read_fds))
        {
            /* get stream from aenc chn */
            s32Ret = HI_MPI_AENC_GetStream(pstAencCtl->AeChn, &stStream, HI_FALSE);
            if (HI_SUCCESS != s32Ret )
            {
                printf("%s: HI_MPI_AENC_GetStream(%d), failed with %#x!\n",\
                       __FUNCTION__, pstAencCtl->AeChn, s32Ret);
                pstAencCtl->bStart = HI_FALSE;
                return NULL;
            }

            /* send stream to decoder and play for testing */
             if (HI_TRUE == pstAencCtl->bSendAdChn)
             {
                //HI_MPI_ADEC_SendStream(0/*pstAencCtl->AdChn*/, &stStream, HI_TRUE);
                                SAMPLE_COMM_AUDIO_AdecProc3( stStream.pStream+4, stStream.u32Len-4 );
             }
            
            /* save audio stream to file */
           fwrite(stStream.pStream,1,stStream.u32Len, pstAencCtl->pfd);

                        int timestamp = get_millisecond( (void*)&stStream, AUDIO );

                        dpf( "audio len: %d\n", stStream.u32Len );   //len: 324

                        AddToAudioBuf( stStream.pStream+4, stStream.u32Len-4, timestamp );

            /* finally you must release the stream */
            HI_MPI_AENC_ReleaseStream(pstAencCtl->AeChn, &stStream);
        }   
    }
   
    fclose(pstAencCtl->pfd);
    pstAencCtl->bStart = HI_FALSE;
    return NULL;
}

1.首先确定采集没有问题,是可以正常播放的
2.AI/AENC参数显示正常
3.SAMPLE_COMM_AUDIO_AencProc2()函数存储的文件播放全是噪声,打印出来的dpf( "audio len: %d\n", stStream.u32Len );   //信息显示不正常audio len =204,并不是324.
4.vlc播放器显示的媒体信息,音频采样率、编码方式不对,声道,位宽正确。SDP信息显示不正确
5.aenc显示的信息没什么问题,但HI_MPI_AENC_GetStream()获取的数据文件在PC端播放都是噪声,不确定是这个线程函数获取的数据流有问题,还是编码本身有问题。这个SAMPLE_COMM_AUDIO_AdecProc3()是把编码数据直接拿去Adec了,存的文件播放都是噪声
6.把Aenc接到Adec,存文件,可以播放,但是一直混杂着噪音

yang1372073

0个粉丝

19

问答

0

专栏

2

资料

yang1372073 2016-09-22 12:27:15
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=38173&ptid=12654]Singcol 发表于 2016-9-22 08:35[/url]
G726/g711等音频流海思有加私有头,标准播放要去掉私有头[/quote]

多谢Singcol同志的提醒,如果说这个头没有去掉,播放会是什么情况,播不出来,还是会播错?或者说其他什么情况

yang1372073

0个粉丝

19

问答

0

专栏

2

资料

yang1372073 2016-09-22 12:27:59
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=37910&ptid=12654]wahuqeir 发表于 2016-9-18 16:49[/url]
可以先使用海思的audio sample,看看效果,再对比参数,也有可能是功能集成导致的![/quote]

谢谢wahuqeir的建议

Singcol

0个粉丝

4

问答

0

专栏

1

资料

Singcol 2016-09-22 15:14:15
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=38195&ptid=12654]yang1372073 发表于 2016-9-22 12:27[/url]
多谢Singcol同志的提醒,如果说这个头没有去掉,播放会是什么情况,播不出来,还是会播错?或者说其他什 ...[/quote]

我试过G711的数据,没有去私有头,放在window平台播放会是噪声

yang1372073

0个粉丝

19

问答

0

专栏

2

资料

yang1372073 2016-09-28 09:11:18
认可0
更新进度来了,
现在确定采集,编解码都没有问题,开始研究网传部分,RTSP server这部分。
验证如下:
1)确定AI采集的数据可以播放;
            /* get frame from ai chn */
            s32Ret = HI_MPI_AI_GetFrame(pstAiCtl->AiDev, pstAiCtl->AiChn, &stFrame, &stAecFrm, HI_FALSE);
    获取stFrame中的采集数据,可以播放
2)采集的数据经过编码,存成文件后,送入解码器解码没有问题,可以播放;

            /* get stream from aenc chn */
            s32Ret = HI_MPI_AENC_GetStream(pstAencCtl->AeChn, &stStream, HI_FALSE);
  获取stStream中的编码数据,存文件,利用sample_audio去读文件,解码,确定可以播放(cool edit工具)
3)采集的数据经过编码,解码,存成文件也可以播放没问题
         /* get stream from adec chn */
                s32Ret = HI_MPI_ADEC_GetFrame(pstAdecCtl->AdChn, &stStream, HI_TRUE);
                if (HI_SUCCESS != s32Ret )
                {
                        printf("%s: HI_MPI_ADEC_GetFrame(%d), failed with %#x!\n",\
                                   __FUNCTION__, pstAdecCtl->AdChn, s32Ret);
                        //pstAdecCtl->bStart = HI_FALSE;
                        //return NULL;
                        continue;
                }
               
                /* save audio stream to file */
                fwrite(stStream.pstFrame->pVirAddr[0],1,stStream.pstFrame->u32Len, pstAdecCtl->pfd);

   获取解码通道的数据,存文件,可以播放。注意是虚拟地址,用HI_MPI_ADEC_GetFrame()时,解除AO与ADEC的绑定

yang1372073

0个粉丝

19

问答

0

专栏

2

资料

yang1372073 2016-09-28 10:05:31
认可0
RTSP server部分:,研究进行中。。。
        rtpHeader.version = RTP_VERSION;
        rtpHeader.padding = false;
        rtpHeader.extension = false;
        rtpHeader.csrc_cnt = 0;
        rtpHeader.marker = false;
        rtpHeader.payload_type = 8;       
        rtpHeader.timestamp = htonl(timestampIncrement);
        rtpHeader.ssrc =  htonl(pSessionInfo->session_id);

yang1372073

0个粉丝

19

问答

0

专栏

2

资料

yang1372073 2016-09-28 21:05:42
认可0
问题已经基本解决,
RTSPserver存在两方面问题,一是SDP设置不正确;
二是UDP接收有问题
int ProcessUDPRecieveDataForA(unsigned int recvlen ,unsigned char *pData,SESSIONINFO *pSessionInfo,unsigned int ts)
{
        if(pData == NULL )
        {
                return 1;
        }

        unsigned char  *pStream = pData;
        //int buflen = recvlen;
        //int frag_size = 0;
        int b_fragment = false;

        if((recvlen - H264_NALU_DATA_OFFSET) > RTP_MTU_SIZE){
                b_fragment = true;
        }
        //unsigned int  timestampIncrement = ts;
        unsigned int  timestampIncrement = (unsigned int)(8 * (ts) + 0.5);
        RtpHeader_t rtpHeader;
        memset(&rtpHeader,0,sizeof(RtpHeader_t));
        int lRtpLen = 0;
       
        rtpHeader.version = RTP_VERSION;
        rtpHeader.padding = false;
        rtpHeader.extension = false;
        rtpHeader.csrc_cnt = 0;
        rtpHeader.marker = false;
        rtpHeader.payload_type = 97;       
        rtpHeader.timestamp = htonl(timestampIncrement);
        rtpHeader.ssrc =  htonl(pSessionInfo->session_id);
        /*char fu_indicat = (pStream[4] & 0x60) | 28;
        char cfu_header;*/

        char sRtpData[1500] = {0};
        if(b_fragment == false)
        {
                rtpHeader.sequence_number = htons( ++pSessionInfo->AudioSeq);
                rtpHeader.marker = true;
                memcpy(sRtpData,&rtpHeader,sizeof(RtpHeader_t));
                //memcpy(sRtpData + sizeof(RtpHeader_t) , pStream + H264_NALU_OFFSET , recvlen - H264_NALU_OFFSET );
                //lRtpLen = recvlen -  H264_NALU_OFFSET + sizeof(RtpHeader_t);
                memcpy(sRtpData + sizeof(RtpHeader_t) , pStream , recvlen);
                lRtpLen = recvlen + sizeof(RtpHeader_t);


                if(sendto(rtpVsock,sRtpData,lRtpLen,0,(struct sockaddr *)&pSessionInfo->Auaddr,sizeof(struct sockaddr_in)) != lRtpLen)
                {
                        RTSP_DEBUG(" lRtpLen ==%d erron--%d" ,lRtpLen,errno);
                        return 0;
                }

        }
        return 1;
}


现在还存在一些很小的咔嚓声

zcc246

0个粉丝

1

问答

0

专栏

0

资料

zcc246 2016-10-04 16:53:51
认可0
楼主 同时传输音频视频怎么实现的啊? 是开两个线程分别运行音频传输和视频传输的就可以了吗?

yang1372073

0个粉丝

19

问答

0

专栏

2

资料

yang1372073 2016-10-05 10:25:13
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=38836&ptid=12654]zcc246 发表于 2016-10-4 16:53[/url]
楼主 同时传输音频视频怎么实现的啊? 是开两个线程分别运行音频传输和视频传输的就可以了吗?[/quote]

一个线程获取音频流,一个线程获取视频流(音频、视频都带时间戳)。
然后把音频流和视频流存入同一个BUF,建立一个rtsp server,
由rstp server开两个线程从BUF取数据,分别去发音视频流

飘逸太极

0个粉丝

2

问答

0

专栏

1

资料

飘逸太极 2017-01-16 09:31:15
认可0
可以接高清视频(720P60,甚至1080P60),然后声音播放还正常吗。谢谢。

Karthus

0个粉丝

12

问答

0

专栏

0

资料

Karthus 2016-10-06 15:18:50
认可0
可以可以!!
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区