用ffmpeg解析mp4文件得到时长、比特率、音视频信息

这篇具有很好参考价值的文章主要介绍了用ffmpeg解析mp4文件得到时长、比特率、音视频信息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

以下是使用C++语言调用FFmpeg获取视频流和音频流信息的示例代码:

#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>

extern "C" {
    #include <libavformat/avformat.h>
}

class MediaInfo {
public:
    std::string filename;
    double duration;
    int bitrate;
    std::vector<std::pair<int, int>> video_streams; // (width, height)
    std::vector<std::pair<int, int>> audio_streams; // (sample_rate, channels)

    MediaInfo(const std::string& filename_) : filename(filename_) {}
};

MediaInfo get_media_info(const std::string& filename) {
    int ret=0;
    MediaInfo info(filename);

    av_register_all();

    AVFormatContext* format_ctx = nullptr;
    ret=avformat_open_input(&format_ctx, filename.c_str(), nullptr, nullptr);
    if(ret < 0)
    {
        std::cout << "avformat_open_input error\n";
        return info;
    }
    avformat_find_stream_info(format_ctx, nullptr);

    info.duration = static_cast<double>(format_ctx->duration) / AV_TIME_BASE;
    info.bitrate = format_ctx->bit_rate;

    for (unsigned int i = 0; i < format_ctx->nb_streams; i++) {
        if (format_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
            int width = format_ctx->streams[i]->codecpar->width;
            int height = format_ctx->streams[i]->codecpar->height;
            info.video_streams.push_back({width, height});
        }
        else if (format_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
            int sample_rate = format_ctx->streams[i]->codecpar->sample_rate;
            int channels = format_ctx->streams[i]->codecpar->channels;
            info.audio_streams.push_back({sample_rate, channels});
        }
    }

    avformat_close_input(&format_ctx);

    return info;
}

// 测试
int main() {
    MediaInfo info = get_media_info("./example.mp4");

    std::cout << "文件名:" << info.filename << std::endl;
    std::cout << "时长:" << info.duration << "秒" << std::endl;
    std::cout << "比特率:" << info.bitrate << "bps" << std::endl;

    std::cout << "视频流信息:" << std::endl;
    for (unsigned int i = 0; i < info.video_streams.size(); i++) {
        std::cout << "  分辨率:" << info.video_streams[i].first << "x" << info.video_streams[i].second << std::endl;
    }

    std::cout << "音频流信息:" << std::endl;
    for (unsigned int i = 0; i < info.audio_streams.size(); i++) {
        std::cout << "  采样率:" << info.audio_streams[i].first << "Hz"
                  << ", 声道数:" << info.audio_streams[i].second << std::endl;
    }

    return 0;
}

上述代码通过AVFormatContext结构体和FFmpeg库函数avformat_open_inputavformat_find_stream_info等,获取MP4文件的视频流和音频流信息,并将结果存储到MediaInfo类中。在实际应用中,可以将上述代码封装成一个函数,方便地在程序中调用,达到自动化处理多个视频文件的目的。

编译运行文章来源地址https://www.toymoban.com/news/detail-652304.html

book@ubuntu:~/Desktop/c++_study$ g++ -g -o test_ff test_ff.cpp -lavformat 
book@ubuntu:~/Desktop/c++_study$ ./test_ff 
文件名:./example.mp4
时长:5.888秒
比特率:434519bps
视频流信息:
  分辨率:720x480
音频流信息:
  采样率:16000Hz, 声道数:1

到了这里,关于用ffmpeg解析mp4文件得到时长、比特率、音视频信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ffmpeg把RTSP流分段录制成MP4,如果能把ffmpeg.exe改成ffmpeg.dll用,那音视频开发的难度直接就降一个维度啊

    比如,原来我们要用ffmpeg录一段RTSP视频流转成MP4,我们有两种方案: 方案一:可以使用以下命令将rtsp流分段存储为mp4文件 ffmpeg -i rtsp://example.com/stream -vcodec copy -acodec aac -f segment -segment_time 3600 -reset_timestamps 1 -strftime 1 output_%Y-%m-%d_%H-%M-%S.mp4 方案二:可以直接调用ffmpeg库avcode

    2024年02月10日
    浏览(59)
  • 如何使用ffmpeg将MP4文件转化为YUV文件?

    可以使用以下命令将 MP4 文件转化为 YUV 文件: 其中, input.mp4 是输入文件的文件名, output.yuv 是输出文件的文件名。 需要注意的是,在使用这个命令之前,你需要在你的电脑上安装 ffmpeg。如果没有安装,可以使用以下命令安装: 如果你使用的是 Windows 系统,可以到 ffmpeg 官网

    2024年02月15日
    浏览(58)
  • 第4课 FFmpeg读取本地mp4文件并显示

    在上节课,我们使用FFmpeg实现了一个最简单的rtmp播放器,它看起来工作正常。这节课,我们尝试让它来播放本地的mp4文件试试。 1.压缩备份上节课工程文件夹为demo3.rar,并修改工程文件夹demo3为demo4,重要的事情再说一遍:及时备份源文件并在原基础上继续迭代开发是一种好

    2024年02月03日
    浏览(50)
  • JavaScript音视频,使用JavaScript如何在浏览器录制电脑摄像头画面为MP4视频文件并下载视频文件到本地

    本章介绍使用JavaScript如何在浏览器录制电脑摄像头画面为MP4视频文件并下载视频文件到本地。 1、使用navigator.mediaDevices.getUserMedia获取摄像头画面 2、将获取到的摄像头画面渲染到canvas画板上 3、将canvas转换为blob对象 4、通过document.createElement(‘a’)调用 href 方法获取此链接并触

    2024年02月02日
    浏览(83)
  • python统计mp4/avi视频的时长

    当代码中导入了特定的库,它会使得在代码中可以使用该库所提供的功能和工具。以下是导入的两个库及其作用的解释: os(Operating System)是Python标准库之一,提供了与操作系统交互的功能。它允许您在代码中执行各种与文件和目录操作相关的任务,例如创建、删除、移动文

    2024年02月14日
    浏览(54)
  • MP4文件格式解析

    读完本文你将收获: 知道如何读取一个mp4文件的基本信息。 知道如何从一个mp4文件中分离对应的视频数据或者音频数据的基本原理。 知道播放一个mp4文件时seek到指定时间,如何在mp4文件中查找到对应的媒体数据。 一个 mp4 文件通常由音频和视频两部分组成(当然有些还包含

    2023年04月26日
    浏览(53)
  • java获取一段视频/mp4的时长

    引言 在日常开发中,经常会遇到产品经理提出一个需求“上传视频”,而且还得显示出视频的播放时长,我们直接上最简单的代码,必须是最简单,多一句啰嗦都不准点赞。 How to do 1.提前引入包 2.逻辑实现

    2024年01月24日
    浏览(36)
  • 使用FFMPEG分离mp4/flv文件中的264视频和aac音频

    ffmpeg 4.4 一个MP4或flv格式的视频文件 大致分为以下几个简单步骤: 1.使用avformat_open_input 函数打开文件并初始化结构AVFormatContext 2.查找是否存在音频和视频信息 3.构建一个h264_mp4toannexb比特流的过滤器,用来给视频avpaket包添加头信息 4.打开2个输出文件(音频, 视频) 5.循环读

    2024年02月15日
    浏览(49)
  • 使用FFMPEG库封装264视频和acc音频数据到MP4文件中

    ffmepeg 4.4 一段H264的视频文件 一段acc格式的音频文件 1.使用avformat_open_input分别打开视频和音频文件,初始化其AVFormatContext,使用avformat_find_stream_info获取编码器基本信息 2.使用avformat_alloc_output_context2初始化输出的AVFormatContext结构 3.使用函数avformat_new_stream给输出的AVFormatContext结

    2024年02月11日
    浏览(48)
  • Qt/C++音视频开发69-保存监控pcm音频数据到mp4文件/监控录像/录像存储和回放/264/265/aac/pcm等

    用ffmpeg做音视频保存到mp4文件,都会遇到一个问题,尤其是在视频监控行业,就是监控摄像头设置的音频是PCM/G711A/G711U,解码后对应的格式是pcm_s16be/pcm_alaw/pcm_mulaw,将这个原始的音频流保存到mp4文件是会报错的,在调用avformat_write_header写文件头的时候提示(-22) Invalid argument,

    2024年04月11日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包