我目前正在this tutorial之后尝试学习FFmpeg API。但是,关于视频解码的第一课我已经遇到了问题。除了使用C++之外,我的代码与本教程中的代码基本相同。我的问题是视频流与av_read_frame返回的数据包中的视频流不匹配。

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

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
    }
}

然后,在检索帧数据时,将接缝抓取音频通道。
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?也许该教程不是最新的,并且做错了什么?如果是这样,提取帧数据的正确方法是什么?万一重要,我将在Windows 64位上使用最新的FFmpeg 4.0.2构建,并与Visual Studio 2017一起编译。

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

最佳答案

尝试这样:

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;

        ...
    }
}

关于c++ - FFmpeg av_read_frame从音频流返回数据包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51595363/

10-12 14:56