zjx94

zjx94

0个粉丝

7

问答

0

专栏

0

资料

zjx94  发布于  2017-03-09 17:54:01
采纳率 0%
7个问答
5820

音视频合流,ffmpeg音频问题

 
音视频合流为MP4.......
gs_enPayloadType =  PT_LPCM;//设定为LPCM格式
        /* init stAio. all of cases will use it */
    stAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_48000;//AUDIO_SAMPLE_RATE_8000
    stAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16;
    stAioAttr.enWorkmode = AIO_MODE_I2S_SLAVE;
    stAioAttr.enSoundmode =AUDIO_SOUND_MODE_MONO;//  若设置双声道则会SAMPLE_COMM_AUDIO_StartAi: HI_MPI_AI_EnableChn(4,1) faile
    stAioAttr.u32EXFlag = 1;
    stAioAttr.u32FrmNum = 30;
    stAioAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM;
    stAioAttr.u32ChnCnt = 2;
    stAioAttr.u32ClkSel = 1;

合流写进文件里我参考例子muxing.c,下面是add_stream里音频的参数
//c->codec_id = AV_CODEC_ID_AAC;//这个不能刻意标注,但是打印出来就是AAC,不懂为何
c->sample_fmt  = (*codec)->sample_fmts ?(*codec)->sample_fmts[0] : AV_SAMPLE_FMT_FLTP;
c->bit_rate    = 64000;
c->sample_rate = 48000;//44100;
c->channel_layout = AV_CH_LAYOUT_STEREO;

视频单独写没问题,音频用自带的例子也没问题。
合起来录制就有问题了,有时录制下来能播放视频,有时根本不能播放,反正音频肯定是一堆噪声。
我百度了下,也不懂是不是声道问题,u32PtNumPerFrm 是320,我从AENC_GetStream出来的长度是640。我像视频一样直接写AENC_GetStream出来的流和长度到AVPacket中。
论坛上发现有很多类似但又不同的情况。如果是声道问题该怎么弄双声道呢。ffmpeg的话,其中参数怎么修改呢。
我来回答
回答14个
时间排序
认可量排序

zjx94

0个粉丝

7

问答

0

专栏

0

资料

zjx94 2017-03-10 09:58:43
认可0
0回复啊                 

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-03-10 10:33:20
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=46367&ptid=14482]zjx94 发表于 2017-3-10 09:58[/url]
0回复啊[/quote]

从AI/AENC代码来看, 楼主的音频编完码是48kHz采样/16bits单声道的PCM的raw data

而从后面mux的代码来看,是采样率为48kHz,码率为64kHz的不知道什么编码格式的立体声

有点对不起来的感觉

zjx94

0个粉丝

7

问答

0

专栏

0

资料

zjx94 2017-03-10 11:43:37
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=46371&ptid=14482]zhuangweiye 发表于 2017-3-10 10:33[/url]
从AI/AENC代码来看, 楼主的音频编完码是48kHz采样/16bits单声道的PCM的raw data

而从后面mux的代码来 ...[/quote]

码率为64kHz,这个要改吗??还有就是后面的编码格式是AV_SAMPLE_FMT_FLTP的,改成其他的会报错。
而且48KHZ出来直接fwrite出来的声音也是不对的。
我在网上看到一段:pcm数据转为aac ,pcm数据的sample fmt 为S16  aac又只支持FLTP,就要用到swr_convert 重采样,但是我程序里直接就pkt.data=pstFrm->pStream;  pkt.size=pstFrm->u32Len;数据并没有进入swr_convert 中转变,也不懂是不是这个问题。


  frame = get_audio_frame(ost);       
    if (frame) {
           dst_nb_samples = av_rescale_rnd(swr_get_delay(ost->swr_ctx, c->sample_rate) + frame->nb_samples, c->sample_rate, c->sample_rate, AV_ROUND_UP);
            av_assert0(dst_nb_samples == frame->nb_samples);
            /* convert to destination format */
            ret = swr_convert(ost->swr_ctx,
                              ost->frame->data, dst_nb_samples,
                              (const uint8_t **)frame->data, frame->nb_samples);
            if (ret < 0) {
                printf( "Error while converting\n");
                return -1;
            }
            frame = ost->frame;

        frame->pts = av_rescale_q(ost->samples_count, (AVRational){1, c->sample_rate}, c->time_base);
        ost->samples_count += dst_nb_samples;
    }
                        printf("success  write_audio_frame!!!-=-=-=len=%#x\n",data_size);

    ret = avcodec_encode_audio2(c, &pkt, frame, &got_packet);
    if (ret < 0) {
        printf( "Error encoding audio frame: %s\n", av_err2str(ret));
        return -1;
    }
    if (got_packet) {                 
                        pkt.data=pstFrm->pStream;
                        pkt.size=pstFrm->u32Len;
                        //pkt.pts= av_rescale_q(c->coded_frame->pts, c->time_base, ost->st->time_base);
                        pkt.flags |= AV_PKT_FLAG_KEY;               
                        pkt.pts=pkt.dts=frame->pts;
        ret = write_frame(oc, &c->time_base, ost->st, &pkt);

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-03-10 11:51:38
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=46378&ptid=14482]zjx94 发表于 2017-3-10 11:43[/url]
码率为64kHz,这个要改吗??还有就是后面的编码格式是AV_SAMPLE_FMT_FLTP的,改成其他的会报错。
而且4 ...[/quote]

调音频,还是一步一步来,先Ai-〉Ao通,然后 Ai-〉Aenc-〉Adec-〉Ao通

然后Ai-〉Aenc-〉file-〉Adec-〉Ao通,然后再上网络等等

如果哪一步没通就先调,不然都混在一起,神仙也没招

zjx94

0个粉丝

7

问答

0

专栏

0

资料

zjx94 2017-03-10 14:29:56
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=46382&ptid=14482]zhuangweiye 发表于 2017-3-10 11:51[/url]
调音频,还是一步一步来,先Ai-〉Ao通,然后 Ai-〉Aenc-〉Adec-〉Ao通

然后Ai-〉Aenc-〉file-〉Adec ...[/quote]

是的。我用的都是例子audio中的,就是从Aenc出来的写成文件。  stAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_8000;输出的文件是没问题的,但是改成  stAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_48000;就声音不对了。
拿数据应该从AENC拿应该没错的,可能就是ffmpeg有问题吧。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-03-10 15:06:43
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=46395&ptid=14482]zjx94 发表于 2017-3-10 14:29[/url]
是的。我用的都是例子audio中的,就是从Aenc出来的写成文件。  stAioAttr.enSamplerate = AUDIO_SAMPLE_R ...[/quote]

48kHz采样声音不对,是那一步不对?是Ai-〉Aenc-〉Adec-〉Ao就不对了吗?一旦出问题了就回退一步看看

另外很好奇 楼主只改Ai的配置,没有改前端audio codec的配置吗?

qn1531980567

0个粉丝

3

问答

0

专栏

0

资料

qn1531980567 2020-05-19 14:20:39
认可0
楼主解决了么,我们现在也在用这个muxing来做海思的音视频合成?也遇到了相关的问题。时间戳怎么添加。

qn1513131564

0个粉丝

13

问答

0

专栏

3

资料

qn1513131564 2020-05-20 09:43:11
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=158592&ptid=14482]qn1531980567 发表于 2020-5-19 14:20[/url]
楼主解决了么,我们现在也在用这个muxing来做海思的音视频合成?也遇到了相关的问题。时间戳怎么添加。[/quote]

时间戳用海思编码里面自带的pts就可以

qn1531980567

0个粉丝

3

问答

0

专栏

0

资料

qn1531980567 2020-05-20 10:34:26
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=158686&ptid=14482]qn1513131564 发表于 2020-5-20 09:43[/url]
时间戳用海思编码里面自带的pts就可以[/quote]

typedef struct hiVENC_PACK_S
{
HI_U64 u64PhyAddr;
HI_U8 ATTRIBUTE* pu8Addr;
HI_U32 ATTRIBUTE u32Len;
HI_U64 u64PTS;
HI_BOOL bFrameEnd;
VENC_DATA_TYPE_U DataType;
HI_U32 u32Offset;
HI_U32 u32DataNum;
VENC_PACK_INFO_S stPackInfo[8];
} VENC_PACK_S;

你指的是这个u64PTS么,这个参数怎么用到ffmpeg中,试过直接把它当成pts,结果生成的视频文件没有时间戳呢。

qn1531980567

0个粉丝

3

问答

0

专栏

0

资料

qn1531980567 2020-05-20 10:48:12
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=158686&ptid=14482]qn1513131564 发表于 2020-5-20 09:43[/url]
时间戳用海思编码里面自带的pts就可以[/quote]

/******************************************************************************
* funciton : save stream
******************************************************************************/
HI_S32 SAMPLE_COMM_VENC_SaveStream(FILE* pFd, VENC_STREAM_S* pstStream)
{
    HI_S32 i;

    for (i = 0; i < pstStream->u32PackCount; i++)
    {
                /*
               
        fwrite(pstStream->pstPack.pu8Addr + pstStream->pstPack.u32Offset,
               pstStream->pstPack.u32Len - pstStream->pstPack.u32Offset, 1, pFd);

        fflush(pFd);
                */
               
                pkt.data=pstStream->pstPack.pu8Addr + pstStream->pstPack.u32Offset;
                pkt.size=pstStream->pstPack.u32Len - pstStream->pstPack.u32Offset;
                pkt.pts=pstStream->pstPack.u64PTS;
                pkt.dts=pkt.pts;
    }

    return HI_SUCCESS;
}

qn1513131564

0个粉丝

13

问答

0

专栏

3

资料

qn1513131564 2020-05-20 16:02:48
认可0
本帖最后由 qn1513131564 于 2020-5-20 16:05 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=158696&ptid=14482]qn1531980567 发表于 2020-5-20 10:48[/url]
/******************************************************************************
* funciton : save ...[/quote]

我没用过ffmpeg封装过,你进去看看ffmpeg的时间戳单位是什么,海思里面的pts是us微秒。还有就是我测试过循环保存到mp4,像你一样,保存的mp4好像不能播放。我的做法是把本次的视频放到一个bigbuffer中,时间戳用pkt[0].pts就行。你再测测。

qn1531980567

0个粉丝

3

问答

0

专栏

0

资料

qn1531980567 2020-05-21 15:20:13
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=158732&ptid=14482]qn1513131564 发表于 2020-5-20 16:02[/url]
我没用过ffmpeg封装过,你进去看看ffmpeg的时间戳单位是什么,海思里面的pts是us微秒。还有就是我测试 ...[/quote]

把本次的视频放到一个bigbuffer中,时间戳用pkt[0].pts,,这样保存到本地的mp4就可以播放了?

qn1513131564

0个粉丝

13

问答

0

专栏

3

资料

qn1513131564 2020-05-22 13:36:55
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=158799&ptid=14482]qn1531980567 发表于 2020-5-21 15:20[/url]
把本次的视频放到一个bigbuffer中,时间戳用pkt[0].pts,,这样保存到本地的mp4就可以播放了?[/quote]

我的是每次获取,用gpac封装的哦

qn1531980567

0个粉丝

3

问答

0

专栏

0

资料

qn1531980567 2020-05-23 14:36:48
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=158854&ptid=14482]qn1513131564 发表于 2020-5-22 13:36[/url]
我的是每次获取,用gpac封装的哦[/quote]

gpac封装?我找到一个自己产生时间戳的例子,但是它只能把视频封装进去。
http://blog.chinaunix.net/uid-20583043-id-5759408.html

有没有办法把音频和视频一起封装进去呢。因为自己产生时间戳时,我不知道这个time_base怎么计算呢
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区