goodman

goodman

2个粉丝

30

问答

18

专栏

17

资料

goodman  发布于  2016-07-08 14:26:05
采纳率 0%
30个问答
wooshang@126.com
3781

3531播放mp4的音视频同步的问题

 
本帖最后由 goodman 于 2016-7-8 14:28 编辑

现在有个MP4视频(h264+aac), 使用ffmpeg demux 得到h264 和aac 数据, aac是16bit 48K 立体声.
我的代码大体是这样:
[code]
while (1){
     if (av_read_frame(mediaPlayer->_avFormatContext, &avp) == 0) {
            if(avp.stream_index < mediaPlayer->_avFormatContext->nb_streams) {
                AVMediaType type = mediaPlayer->_avFormatContext->streams[avp.stream_index]->codec->codec_type;
                AVCodecID id = mediaPlayer->_avFormatContext->streams[avp.stream_index]->codec->codec_id;
                if(type == AVMEDIA_TYPE_VIDEO && id == AV_CODEC_ID_H264) {  //视频
                    mediaPlayer->pushData(avp.data, avp.size, 0);
                }
                if(type == AVMEDIA_TYPE_AUDIO && id == AV_CODEC_ID_AAC) {   //音频
                        mediaPlayer->addAdtsheader(&avp);
                        if(mediaPlayer->aacdecode(avp.data, avp.size) == 0){   // 解码aac用时很小大概3个ms
                         mediaPlayer->pushData((uint8_t*)mediaPlayer->_fifo.data, frameSize);   // 这里推数据很耗时间,大概为45ms不知道为为什么(一帧AAC)
                        av_free_packet(&avp);
                         coutinue;
                }
            }
            av_free_packet(&avp);
            usleep(40*1000);
        }
}[/code]


说明:音频使用阻塞方式推(改成非阻塞的方式丢数据)
[code]        AUDIO_STREAM_S stStream;
        stStream.pStream = addr;
        stStream.u32Len = len;
        return HI_MPI_ADEC_SendStream(_adecChn, &stStream, HI_TRUE) == HI_SUCCESS ? 0 : -1;          // 也就是这个函数耗时
[/code]

现在的现象是,无法正常播放,声音正常了,视频一卡一卡的。有请做过音视频混合播放的大侠路过帮解决下。
或者我这个方式本身就 有问题。
我来回答
回答2个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-07-08 14:58:28
认可0
使用NOBLOCK方式,如果是文件的话,要么控制一下送数据的速度, 要么要判断ADEC是否队列满

        s32Ret = HI_MPI_ADEC_SendStream(adecchn, &aencStream,HI_IO_NOBLOCK);
        if(s32Ret != HI_SUCCESS)
        {
                if( s32Ret == HI_ERR_ADEC_BUF_FULL )
                {
                        usleep(1);
                        // 需要重新发送数据
                        // ...
                }
                else
                {
                        // 错误处理
                        // ...
                }
        }

楼主可以考虑读文件一个线程,读出来的数据放到发送list中
而音频视频解码分别用一个线程来送数据, 根据上面的list来处理,

同步问题一般以音频为准,因为音频是连续且固定采样率的, 问题就是要控制视频的播放时机, 总之有些难度的

fangshy

0个粉丝

3

问答

0

专栏

0

资料

fangshy 2017-07-03 16:05:34
认可0
楼上的方法有用!
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区