C语言结合ffmpeg打印音视频信息

目录
  • 一、通过此文可以得到什么
  • 二、实现思路
  • 三、实现效果
  • 四、实现源代码 

一、通过此文可以得到什么

通过此练习:

1、知道了如何计算一个音频和视频的播放时间;

2、知道了音视频解码的思路的大体流程,之后无非就是在这个流程上进行扩充细节;

3、知道了如何通过C语言或者C++编程语言结合ffmpeg拿到一些音视频的关键信息,例如:帧率等;

二、实现思路

三、实现效果

zhenghui@zh-pc:/data/project/VSCProject/ffmpegStudy$ make
make all
make[1]: 进入目录“/data/project/VSCProject/ffmpegStudy/src”
Compiling main.cpp to main.o ..
cp hello /data/project/VSCProject/ffmpegStudy/src/../
# make 【hello】 finish !!!
make[1]: 离开目录“/data/project/VSCProject/ffmpegStudy/src”
zhenghui@zh-pc:/data/project/VSCProject/ffmpegStudy$
zhenghui@zh-pc:/data/project/VSCProject/ffmpegStudy$ ./hello
Hello World !
decode video fileName=/home/zhenghui/视频/1080P.mp4
[NULL @ 0x5654cc332d80] Opening '/home/zhenghui/视频/1080P.mp4' for reading
[file @ 0x5654cc333380] Setting default whitelist 'file,crypto,data'
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5654cc332d80] Format mov,mp4,m4a,3gp,3g2,mj2 probed with size=2048 and score=100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5654cc332d80] ISO: File Type Major Brand: isom
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5654cc332d80] Unknown dref type 0x206c7275 size 12
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5654cc332d80] Processing st: 0, edit list 0 - media time: 1072, duration: 3621888
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5654cc332d80] Offset DTS by 1072 to make first pts zero.
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5654cc332d80] Setting codecpar->delay to 2 for stream st: 0
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5654cc332d80] Unknown dref type 0x206c7275 size 12
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5654cc332d80] Processing st: 1, edit list 0 - media time: 0, duration: 9990149
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5654cc332d80] rfps: 29.916667 0.006250
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5654cc332d80] rfps: 30.000000 0.000066
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5654cc332d80] rfps: 60.000000 0.000265
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5654cc332d80] rfps: 120.000000 0.001061
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5654cc332d80] rfps: 240.000000 0.004244
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5654cc332d80] rfps: 29.970030 0.000868
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5654cc332d80] rfps: 59.940060 0.003473
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5654cc332d80] Before avformat_find_stream_info() pos: 87425182 bytes read:315205 seeks:1 nb_streams:2
[h264 @ 0x5654cc3340c0] nal_unit_type: 7(SPS), nal_ref_idc: 3
[h264 @ 0x5654cc3340c0] nal_unit_type: 8(PPS), nal_ref_idc: 3
[h264 @ 0x5654cc3340c0] nal_unit_type: 7(SPS), nal_ref_idc: 3
[h264 @ 0x5654cc3340c0] nal_unit_type: 8(PPS), nal_ref_idc: 3
[h264 @ 0x5654cc3340c0] nal_unit_type: 6(SEI), nal_ref_idc: 0
[h264 @ 0x5654cc3340c0] nal_unit_type: 5(IDR), nal_ref_idc: 3
[h264 @ 0x5654cc3340c0] Format yuv420p chosen by get_format().
[h264 @ 0x5654cc3340c0] Reinit context to 1920x1088, pix_fmt: yuv420p
[h264 @ 0x5654cc3340c0] no picture
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5654cc332d80] All info found
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5654cc332d80] After avformat_find_stream_info() pos: 53231 bytes read:393067 seeks:2 frames:4
video_index=0
audio_index=1
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/zhenghui/视频/1080P.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
    description     : Packed by Bilibili XCoder v2.0.2
  Duration: 00:03:46.53, start: 0.000000, bitrate: 3087 kb/s
  Stream #0:0[0x1](und), 3, 1/16000: Video: h264 (High), 1 reference frame (avc1 / 0x31637661), yuv420p(progressive, left), 1920x1080 (1920x1088) [SAR 1:1 DAR 16:9], 0/1, 2951 kb/s, 30 fps, 30 tbr, 16k tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](und), 1, 1/44100: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
media name =/home/zhenghui/视频/1080P.mp4
stream number: 2
media average ratio: 3015 kbps
media total time: 0:3:46
######## Video info: ########
stream index : 0
fps:29.999914 fps
video codec : H264
video_time : 00:03:46
######## Audio info: ########
stream index : 1
stream sample_rate : 44100 Hz
stream format : AV_SAMPLE_FMT_FLTP
channels number:2
audio codec:AAC
audio_time : 00:03:46
[AVIOContext @ 0x5654cc33b7c0] Statistics: 393067 bytes read, 2 seeks
zhenghui@zh-pc:/data/project/VSCProject/ffmpegStudy$

四、实现源代码 

视频教程

#include <iostream>
#include <stdio.h>

#ifdef __cplusplus //表示是一个c++程序
extern "C"{
#endif

#include <libavdevice/avdevice.h>
#include <libavutil/frame.h>
#include <libavutil/imgutils.h>
#include <libavutil/log.h>
#include <libswscale/swscale.h>
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>

#ifdef __cplusplus
}
#endif

//g++ -I ../include/ hello_world.cpp -o hello_world -L../lib/ -lavcodec -lavdevice -lavfilter -lavformat -lavutil
void decode()
{
    char *fileName = "/home/zhenghui/视频/1080P.mp4"; 

    printf("decode video fileName=%s \n",fileName);

    int ret = 0;
    // 1、分配解复用器上下文
    AVFormatContext *ctx = NULL;
    ctx = avformat_alloc_context(); 

    // 2、根据url打开本地文件或网络流
    ret = avformat_open_input(&ctx,fileName,NULL,NULL);

    if(ret < 0)
    {
        printf("打开%s失败 ! \n",fileName);
        return;
    }

    // 3、读取媒体的部分数据包,获取码流信息
    ret = avformat_find_stream_info(ctx,NULL);
    if(ret < 0){
        printf("获取码流信息失败 !\n");
        return;
    }

    // 3、获取音频流和视频流的索引
    int video_index = -1;
    int audio_index = -1;

    video_index = av_find_best_stream(ctx,AVMEDIA_TYPE_VIDEO,-1,-1,NULL,0);
    printf("video_index=%d \n",video_index);

    audio_index = av_find_best_stream(ctx,AVMEDIA_TYPE_AUDIO,-1,-1,NULL,0);
    printf("audio_index=%d \n",audio_index);

    // 打印流信息
    av_dump_format(ctx,0,fileName,0);

    //打印媒体文件url
    printf("media name =%s \n",ctx->url);
    //打印流数量
    printf("stream number: %d \n",ctx->nb_streams);
    //打印码率
    printf("media average ratio: %lld kbps\n",(int64_t)(ctx->bit_rate/1024));

    //打印时长
    int total_seconds,hour,minute,second;
    //ctx->duration的单位是微妙,先转换成秒,再进行转换成其他的时间单位就比较简单了
    total_seconds = (ctx->duration) / AV_TIME_BASE;
    hour = total_seconds / 3600;
    minute = (total_seconds % 3600) /60;
    second = (total_seconds % 60);

    // 文件总时长
    printf("media total time: %d:%d:%d \n",hour,minute,second);

    //老版本查找流索引
    for(int i = 0;i < ctx->nb_streams;i++){
        AVStream  *av_stream = ctx->streams[i];

        //判断流是什么类型
        //视频流
        if( AVMEDIA_TYPE_VIDEO == av_stream->codecpar->codec_type)
        {
            printf("######## Video info: ######## \n");
            // 流索引
            printf("stream index : %d \n",av_stream->index);
            //帧率
            printf("fps:%lf fps\n",av_q2d(av_stream->avg_frame_rate));

            if(AV_CODEC_ID_MPEG4 == av_stream->codecpar->codec_id)
            {
                printf("video codec : MPEG4 \n");
            }
            else if(AV_CODEC_ID_H264 == av_stream->codecpar->codec_id)
            {
                printf("video codec : H264 \n");
            }else
            {
                printf("video codec other value=%d \n", av_stream->codecpar->codec_id);
            }

            //获取视频总时长
            if(AV_NOPTS_VALUE != av_stream->duration)
            {
                int video_time =av_stream->duration * av_q2d(av_stream->time_base);
                printf("video_time : %02d:%02d:%02d\n" ,
                (video_time / 3600),
                (video_time % 3600) / 60,
                (video_time % 60)
                );
            }
            else{
                printf("audio duration unknown ! \n");
            }
        }
        //音频流
        else if(AVMEDIA_TYPE_AUDIO == av_stream->codecpar->codec_type)
        {
            printf("######## Audio info: ######## \n");
            // 流索引
            printf("stream index : %d \n",av_stream->index);

            // 音频编解码器的采样率 单位Hz
            printf("stream sample_rate : %d Hz \n",av_stream->codecpar->sample_rate);

            //音频采样格式
            if(AV_SAMPLE_FMT_FLTP == av_stream->codecpar->format)
            {
                printf("stream format : AV_SAMPLE_FMT_FLTP \n");
            }
            else  if(AV_SAMPLE_FMT_S16P == av_stream->codecpar->format)
            {
                printf("stream format : AV_SAMPLE_FMT_S16P \n");
            }else{
                printf("stream format : other; value=%d \n",av_stream->codecpar->format);
            }

            // 音频信道数目
            printf("channels number:%d \n",av_stream->codecpar->channels);

            //音频压缩编码格式
            if(AV_CODEC_ID_AAC == av_stream->codecpar->codec_id)
            {
                printf("audio codec:AAC \n");
            }else if(AV_CODEC_ID_MP3 == av_stream->codecpar->codec_id)
            {
                printf("audio codec:MP3 \n");
            }else{
                printf("audio codec : other; value=%d \n",av_stream->codecpar->codec_id);
            }

            //获取视频总时长
            if(AV_NOPTS_VALUE != av_stream->duration)
            {
                int audio_time =av_stream->duration * av_q2d(av_stream->time_base);
                printf("audio_time : %02d:%02d:%02d\n" ,
                (audio_time / 3600),
                (audio_time % 3600) / 60,
                (audio_time % 60)
                );
            }
            else{
                printf("audio duration unknown ! \n");
            }

            audio_index = i;
        }

    }

    if(ctx)
        avformat_close_input(&ctx);
}

int main() {
    // 设置控制台输出级别
    av_log_set_level(AV_LOG_DEBUG);
    // // 打印输出字符串Hello World !
    av_log(NULL, AV_LOG_DEBUG, "%s", "Hello World !\n");

    decode();
    return 0;
}
 

到此这篇关于C语言结合ffmpeg打印音视频信息的文章就介绍到这了,更多相关C语言打印音视频信息内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用ffmpeg 合并aac格式音频文件的方法

    FFmpeg简介 FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的. FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows.Mac OS X等.这个项目最早由Fabrice Bellard发起,2004

  • ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码

    安装 官网下载 http://ffmpeg.org/ 选择需要的版本 在这个网址下载ffmpeg,https://github.com/BtbN/FFmpeg-Builds/releases 将解压后得到的以下几个文件放置在E:\FFmpeg下 环境变量 此电脑--属性--高级系统设置--环境变量 在系统变量(也就是下面那一半)处找到新建,按如下所示的方法填写 再将%FFMPEG_HOME%以及%FFMPEG_HOME%\bin写入系统变量的Path中 然后一路确定即可 验证 win+R,cmd

  • php利用ffmpeg提取视频中音频与视频画面的方法详解

    前言 FFmpeg的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward",FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.可以轻易地实现多种视频格式之间的相互转换. FFmpeg的用户有Google,Facebook,Youtube,优酷,爱奇艺,土豆等. 组成 1.libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能,包含demuxer

  • PHP获取音频文件的相关信息

    项目需求:现在有一个音频文件上传的功能,在上传后PHP需要获取这个音频文件的相关信息,例如:时长等,由于这个文件是放在买的空间上的,没有像ffmpeg这样的扩展来处理,那么PHP能不能获取到这些信息? 下面是之前在项目中用到的一个用PHP进行音频文件头部信息的读取与写入操作的实现,主要针对 WMA 和 MP3 两种格式,供参考. <?php // AudioExif.class.php // 用PHP进行音频文件头部信息的读取与写入 // 目前只支持 WMA 和 MP3 两种格式, 只支持常用的

  • 使用Java和ffmpeg把音频和视频合成视频的操作方法

    FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的. FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它包括了目前领先的音/视频编码库libavcodec. FFmpeg是在Linux下开发出来的,但它可以在包

  • C语言结合ffmpeg打印音视频信息

    目录 一.通过此文可以得到什么 二.实现思路 三.实现效果 四.实现源代码  一.通过此文可以得到什么 通过此练习: 1.知道了如何计算一个音频和视频的播放时间: 2.知道了音视频解码的思路的大体流程,之后无非就是在这个流程上进行扩充细节: 3.知道了如何通过C语言或者C++编程语言结合ffmpeg拿到一些音视频的关键信息,例如:帧率等: 二.实现思路 三.实现效果 zhenghui@zh-pc:/data/project/VSCProject/ffmpegStudy$ make make al

  • Qt利用ffmpeg实现音视频同步

    目录 一.前言 二.效果图 三.体验地址 四.相关代码 五.功能特点 5.1 基础功能 5.2 特色功能 5.3 视频控件 5.4 内核ffmpeg 一.前言 用ffmpeg来做音视频同步,个人认为这个是ffmpeg基础处理中最难的一个,无数人就卡在这里,怎么也不准,本人也是尝试过网上各种demo,基本上都是渣渣,要么仅仅支持极其少量的视频文件比如收到的数据包是一帧视频一帧音频的,要么根本没法同步歪七八糟的,要么进度跳过去直接蹦蹦蹦崩溃的,其实最完美的音视频同步处理demo就是ffplay,我亲

  • C# 调用FFmpeg处理音视频的示例

    FFmpeg 开源.跨平台.体积小.功能强大,提供了录制.转换以及流化音视频的完整解决方案. 官网:https://www.ffmpeg.org/ 百科:https://baike.baidu.com/item/ffmpeg/2665727?fr=aladdin FFmpeg 应用非常广泛,可以用来播放本地视频甚至网络视频,查看音视频信息,还可以用于从视频中提取音频,转换音视频文件格式等等,本文主要介绍如何调用 FFmpeg 来查看音视频信息.从视频中提取音频.转换音视频格式等. 1. 调用FF

  • C#调用FFmpeg操作音视频的实现示例

    目录 项目背景 FFmpeg介绍 FFmpeg相关教程 博客示例源码 下载FFmpeg.exe安装包 C#进程调用FFmpeg操作音视频 项目背景 因为公司需要对音视频做一些操作,比如说对系统用户的发音和背景视频进行合成,以及对多个音视频之间进行合成,还有就是在指定的源背景音频中按照对应的规则在视频的多少秒钟内插入一段客户发音等一些复杂的音视频操作.本篇文章主要讲解的是使用C#进程(Process)调用FFmpeg.exe进行视频合并,音频合并,音频与视频合并成视频这几个简单的音视频操作,还有些

  • android采用FFmpeg实现音视频合成与分离

    上一篇文章谈到音频剪切.混音.拼接与转码,也详细介绍cMake配置与涉及FFmpeg文件的导入: android端采用FFmpeg进行音频混合与拼接剪切.现在接着探讨音视频的合成与分离. 1.音频提取 从多媒体文件中提取音频,关键命令为"-acodec copy -vn",其中"-acodec copy"是采用音频编码器拷贝音频流,"-vn"是去掉video视频流: /** * 使用ffmpeg命令行进行抽取音频 * @param srcFile

  • Javacv使用ffmpeg实现音视频同步播放

    最近用javaCV的ffmpeg包的FFmpegFrameGrabber帧捕捉器对捕捉到的音频帧和视频帧做了同步的播放.采用的同步方法是视频向音频同步. 程序和源码 具体的思路如下: (1)首先介绍ffmpeg是如何捕捉视频文件的图像和声音的 FFmpegFrameGrabber fg = new FFmpegFrameGrabber("a video file path or a url); 得到帧捕捉器对象后,调用它的grab()方法就会返回捕捉到的Frame对象.这个Frame可以是视频帧

  • php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间

    FFmpeg是一个视频插件,我们可以利用调用FFmpeg接口来获取视频的相关信息,包括视频的播放时长,视频的码率,视频的缩略图以及视频创建时间,本文章向大家介绍php如何使用FFmpeg接口获取视频信息,需要的朋友可以参考一下. FFmpeg获得视频文件的缩略图: function getVideoCover($file,$time,$name) { if(empty($time))$time = '1';//默认截取第一秒第一帧 $strlen = strlen($file); // $vid

  • Android音视频开发之MediaExtactor使用教程

    目录 前言 MediaExtactor 使用MediaExtactor 加载音视频文件代码 获取轨道代码 提取轨道数据信息 一些源码细节分析 前言 在之前学习如何使用MediaPlayer后,了解到Android系统提供开发者播放多媒体全家桶能力,但对于开发者希望DIY自由度更高的播放器能力也是可以利用Android内部提供组件包自行实现一个播放器的.举例实现一个视频播放这个流程,它大致流程是[多媒体文件解析提取视频文件]-> [视频流解码]-> [解码数据播放渲染到Render].首要需要实

  • JavaCV实现读取视频信息及自动截取封面图详解

    目录 概述 javacv 介绍 引入 javacv 读取视频信息 创建 VideoInfo 类 使用 FFmpegFrameGrabber 读取视频信息 截图 概述 最近在对之前写的一个 Spring Boot 的视频网站项目做功能完善,需要利用 FFmpeg 实现读取视频信息和自动截图的功能,查阅资料后发现网上这部分的内容非常少,于是就有了这篇文章. 视频网站项目地址 GitHub 码云 本文将介绍如何利用Javacv实现在视频网站中常见的读取视频信息和自动获取封面图的功能. javacv 介

  • 音视频基本概念和FFmpeg的简单入门教程详解

    目录 写在前面 基本概念 容器/文件(Conainer/File): 媒体流(Stream): 数据帧/数据包(Frame/Packet): 编解码器(Codec): 复用(mux): 解复用(mux): 帧率(Frame rate): 码率(Bit Rate): FFmpeg 第一条FFmpeg命令 FFmpeg命令处理流程 FFmpeg常用命令 总结 [参考] 写在前面 最近正好有音视频编辑的需求,虽然之前粗略的了解过FFmpeg不过肯定是不够用的,借此重新学习下: 基本概念 ffmpeg概

随机推荐