FFmpeg 入门学习 01--打开视频文件

489 篇文章 14 订阅
464 篇文章 13 订阅

1、背景

FFmpeg 是音视频开发中最常用到的开源软件,许多商业软件都以 FFmpeg 为基础进行开发定制。 由于近期工作中的项目涉及到了音视频相关开发,本系列文章用来整理和记录在使用 FFmpeg 开发过程中的一些学习经验,以备之后的查阅。

2、视频播放基本原理

上图来源于网上,描述了视频播放的基本原理。即:要实现一个视频播放器,需要完整实现上图中的每一个过程。 本文先从打开视频文件开始,记录怎么使用 FFmpeg 打开一个视频文件。

3、打开视频文件

3.1 概述

在进行音视频解码之前,需要先打开媒体文件,以获取其中包含的音/视频流的相关信息。打开音视频文件包含以下步骤:

【学习地址】:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发

【文章福利】:免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击1079654574加群领取哦~

 

3.2 创建 FFmpegPlayer 类

创建一个 FFmpegPlayer 类用于对相关资源进行管理:

class FFmpegPlayer {
public:
    explicit FFmpegPlayer(const char* m_url);
    ~FFmpegPlayer();
public:
    bool        openFile();//打开文件
private:
    std::string             url;//文件路径
    AVFormatContext*        formatContext = nullptr;//封装格式上下文
};

实现 openFile 接口:

bool FFmpegPlayer::openFile() {
    // 创建 formatContext
    formatContext = avformat_alloc_context();
    if( !formatContext )
    {
        avformat_close_input(&formatContext);
        return false;
    }
    // 打开文件
    if (avformat_open_input(&formatContext, url.c_str(), nullptr, nullptr) != 0)
    {
        if( !formatContext ) {
            avformat_close_input(&formatContext);
        }
        return false;
    }
​
    // 查找输入流信息
    if (avformat_find_stream_info(formatContext, nullptr) < 0)
    {
        if( !formatContext ) {
            avformat_close_input(&formatContext);
        }
        return false;
    }
    // 查找音视频流索引
    int video_index = av_find_best_stream(formatContext, AVMEDIA_TYPE_VIDEO, -1, -1, nullptr, 0);
    int audio_index = av_find_best_stream(formatContext, AVMEDIA_TYPE_AUDIO, -1, video_index, nullptr, 0);
​
    //打印视频信息
    std::cout <<"视频流索引:" << video_index <<std::endl;
    std::cout <<"音频流索引:" << audio_index<<std::endl;
    std::cout <<"时长:"<< formatContext->duration / AV_TIME_BASE <<std::endl;
    std::cout <<"视频宽度:" << formatContext->streams[video_index]->codecpar->width << std::endl;
    std::cout <<"视频高度:" << formatContext->streams[video_index]->codecpar->height << std::endl;
    auto frame_rate =  av_guess_frame_rate(formatContext, formatContext->streams[video_index], nullptr);
    std::cout <<"帧率:" <<  (double )frame_rate.num / frame_rate.den << std::endl;
    
    return true;
}

3.3 运行示例

传入视频文件路径,打开文件:

#include "FFmpegPlayer.h"
int main() {
    const char  * url = "C:\\Users\\111111\\Desktop\\ts\\0.ts";
    FFmpegPlayer * player = new FFmpegPlayer(url);
    if( player->openFile())
    {
        std::cout << "文件打开成功!"<<std::endl;
    }
​
    return 0;
}

代码运行结果如下:

原文链接:FFmpeg 入门学习 01--打开视频文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值