首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FFmpeg av_read_frame从音频流返回数据包

FFmpeg av_read_frame从音频流返回数据包
EN

Stack Overflow用户
提问于 2018-07-30 13:43:01
回答 1查看 2K关注 0票数 1

目前,我正在尝试学习FFmpeg API,遵循本教程。然而,我已经对视频解码的第一课有了问题。我的代码与本教程中的代码基本相同,但我使用的是C++。我的问题是视频流与av_read_frame返回的数据包中的视频流不匹配。

在可用流上循环获得视频流,直到找到视频流为止。

代码语言:javascript
运行
复制
for(int i = 0; i < pFormatCtx->nb_streams; i++) { // nb_streams == 2

    if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO) {
        videoStream = i; 
        break; // videoStream == 0
    }
}

然后,当检索帧数据时,它接缝抓住音频通道。

代码语言:javascript
运行
复制
while(av_read_frame(pFormatCtx, &packet) >= 0) { // read returns 0

    // Is this a packet from the video stream?
    if(packet.stream_index == videoStream) { 
        //packet.stream_index == 1, which correspond to the audio stream
    } 
}

我还没有在网上找到这个测试实际上失败的例子。我是否错过了一些方法来指定本教程中没有的stream_index?也许这个教程不是最新的,是不是做错了什么?如果是,那么提取帧数据的正确方法是什么?如果这很重要,我将在Windows64位上使用最新的FFmpeg 4.0.2版本,并使用Visual 2017进行编译。

在没有声音的视频上,两个流匹配,我能够正确地解码和显示帧。

EN

回答 1

Stack Overflow用户

发布于 2018-08-01 10:38:56

就像这样:

代码语言:javascript
运行
复制
while(av_read_frame(pFormatCtx, &packet) == 0) {

    AVStream *st = pFormatCtx->streams[packet.stream_index];
    switch (st->codecpar->codec_type)
    {
        case AVMEDIA_TYPE_AUDIO:
            /* handle audio */
            break;

        case AVMEDIA_TYPE_VIDEO:
            /* handle video */
            break;

        ...
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51595363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档