FFmpeg av_read_frame从音频流返回数据包

时间:2018-07-30 13:43:01

标签: c++ ffmpeg visual-studio-2017 video-processing

我目前正在尝试按照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 进行编译。

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

1 个答案:

答案 0 :(得分:0)

尝试这样:

@objc func imageTapped() {

        let imageView = userImageView
        let newImageView = UIImageView(image: imageView?.image)
        newImageView.frame = UIScreen.main.bounds
        newImageView.backgroundColor = UIColor.black
        newImageView.contentMode = .scaleAspectFit
        newImageView.isUserInteractionEnabled = true
        let tap = UITapGestureRecognizer(target: self, action: #selector(dismissFullscreenImage))
        newImageView.addGestureRecognizer(tap)
        self.view.addSubview(newImageView)

        self.navigationController?.isNavigationBarHidden = true
        self.tabBarController?.tabBar.isHidden = true

    }