FFmpeg基础:获取音视频的各种编码参数

这篇具有很好参考价值的文章主要介绍了FFmpeg基础:获取音视频的各种编码参数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

获取视频编码参数

视频编码参数主要包括:帧率、分辨率、编码格式、码率等,对应的概念如下。

帧率(Frame Rate)

每秒显示帧数(Frames Per Second)。电影的帧率一般是25fps和29.97fps,3D游戏要保持流畅则需要30fps以上的效果。

分辨率

指视频宽高的像素数值。标准1080P的分辨率为1920×1080,帧率为60fps,也就是真高清。而最常见的网络传播的1080P高清片帧率通常为 23.976 fps。

封装格式

多媒体封装格式也称多媒体容器 (Multimedia Container),它不同于H.264、 AAC这类编码格式,它只是为多媒体编码提供了一个“外壳”,也就是所谓的视频格式。如MP4、AVI、MKV、FLV、WMA等。

码率(Bit Rate)

指视频或音频文件在单位时间内使用的数据流量(单位通常是Kbps也就是千比特每秒)。通常2000kbps~3000kbps就已经足以将画质效果表现到极致了。码率参数与视频文件最终体积大小有直接性的关系。

编码格式
所谓视频编码方式就是指通过压缩技术,将原始视频格式的文件转换成另一种视频格式文件的方式。视频流传输中最为重要的编解码标准有国际电联的H.261、H.263、H.264。

通过ffmpeg获取视频编码参数的方法如下所示:

#include "libavutil/log.h"
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"

//按照固定格式打印
static void print_fps(double d, const char *postfix)
{
	uint64_t v = lrintf(d * 100);
	if (!v)
		av_log(NULL, AV_LOG_INFO, "%1.4f %s", d, postfix);
	else if (v % 100)
		av_log(NULL, AV_LOG_INFO, "%3.2f %s", d, postfix);
	else if (v % (100 * 1000))
		av_log(NULL, AV_LOG_INFO, "%1.0f %s", d, postfix);
	else
		av_log(NULL, AV_LOG_INFO, "%1.0fk %s", d / 1000, postfix);
}

int main(int argc, char* argv[])
{
	int ret;
	int streams;
	char buf[256];
	AVFormatContext *fmt_ctx = NULL;
	AVCodecContext *avctx = NULL;
	const AVInputFormat *fmt = NULL;
	
	//设置日志的输出级别
	av_log_set_level(AV_LOG_INFO);
	
	//打开视频的上下文
	//@1音视频上下文 
	//@2文件路径 
	//@3文件格式(不指定根据文件名判断)
	//@4获取配置项的字典
	ret = avformat_open_input(&fmt_ctx, "./test.mp4", fmt, NULL);
	if (ret < 0)
	{
		av_log(NULL, AV_LOG_ERROR, "Can't open file:%s\n", av_err2str(ret));
		return -1;
	}

	//获取封装格式
	const char* format_name = fmt_ctx->iformat->name;

	//通过上下文获取视频时长
	if (fmt_ctx->duration != AV_NOPTS_VALUE)
	{
		int64_t hours, mins, secs, us;
		int64_t duration = fmt_ctx->duration + (fmt_ctx->duration <= INT64_MAX - 5000 ? 5000 : 0);
		secs = duration / AV_TIME_BASE;
		us = duration % AV_TIME_BASE;
		mins = secs / 60;
		secs %= 60;
		hours = mins / 60;
		mins %= 60;
		av_log(NULL, AV_LOG_INFO, "duration:  %02"PRId64":%02"PRId64":%02"PRId64".%02"PRId64"\n", hours, mins, secs,
			(100 * us) / AV_TIME_BASE);
	}
	else 
	{
		av_log(NULL, AV_LOG_INFO, "N/A");
	}

	//查看视频文件中流的个数
	streams = fmt_ctx->nb_streams;
	av_log(NULL, AV_LOG_INFO, "file has:%d streams\n",streams);

	//查看流的类型,判断是视频流还是音频流
	for (int index = 0; index < streams; ++index)
	{
		const AVStream *stream = fmt_ctx->streams[index];
		if (stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
		{
			av_log(NULL, AV_LOG_INFO, "streams %d is Video Stream\n",index);
		}
		else if (stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
		{
			av_log(NULL, AV_LOG_INFO, "streams %d is Audio Stream\n",index);
		}
	}

	//获取视频帧率fps
	const AVStream *stream = fmt_ctx->streams[0];
	double fps = av_q2d(stream->avg_frame_rate);
	print_fps(fps, "fps\n");


	//获取流的类型名称(video/audio)
	avctx = avcodec_alloc_context3(NULL);
	ret = avcodec_parameters_to_context(avctx, stream->codecpar);
	const char* codec_type = av_get_media_type_string(avctx->codec_type);

	//获取视频编码类型(h264/h265)
	const char*codec_name = avcodec_get_name(avctx->codec_id);
	av_log(NULL, AV_LOG_INFO, "stream type:%s, stream codec:%s\n", codec_type,codec_name);

	//获得视频的码率
	int bitrate = avctx->bit_rate;
	av_log(NULL, AV_LOG_INFO,"%"PRId64" kb/s\n", bitrate / 1000);

	//获取视频的分辨率
	int width = avctx->width;
	int height = avctx->height;
	av_log(NULL, AV_LOG_INFO, "%dx%d\n", width, height);
	avcodec_free_context(&avctx);

	//关闭上下文
	avformat_close_input(&fmt_ctx);
	getchar();
}

获取音频编码参数

音频编码参数主要包括:声道数、码率、采样率、采样位数等,对应的概念如下。
声道数
现在主要有单声道和双声道之分。双声道又称为立体声,在硬件中要占两条线路,音质、音色好,但立体声数字化后所占空间比单声道多一倍。

码率
比特率也叫码率,指音乐每秒播放的数据量,单位用bit表示。一般mp3在128比特率左右为益。

采样率
指每秒钟取得声音样本的次数,22050 的采样频率是常用的,44100已是CD音质。为了保证声音不失真,采样频率应该在40kHz左右。

采样位数

采样位数也叫采样大小或量化位数。它是用来衡量声音波动变化的一个参数,也就是声卡的分辨率或可以理解为声卡处理声音的解析度。它的数值越大,分辨率也就越高,常见的声卡主要有8位和16位两种。

通过ffmpeg获取音频编码参数方法如下所示:

#include "libavutil/log.h"
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"

//按照固定格式打印
static void print_fps(double d, const char *postfix)
{
	uint64_t v = lrintf(d * 100);
	if (!v)
		av_log(NULL, AV_LOG_INFO, "%1.4f %s", d, postfix);
	else if (v % 100)
		av_log(NULL, AV_LOG_INFO, "%3.2f %s", d, postfix);
	else if (v % (100 * 1000))
		av_log(NULL, AV_LOG_INFO, "%1.0f %s", d, postfix);
	else
		av_log(NULL, AV_LOG_INFO, "%1.0fk %s", d / 1000, postfix);
}

int main(int argc, char* argv[])
{
	int ret;
	int streams;
	char buf[256];
	AVFormatContext *fmt_ctx = NULL;
	AVCodecContext *avctx = NULL;
	const AVInputFormat *fmt = NULL;
	
	//设置日志的输出级别
	av_log_set_level(AV_LOG_INFO);
	
	//打开视频的上下文
	//@1音视频上下文 
	//@2文件路径 
	//@3文件格式(不指定根据文件名判断)
	//@4获取配置项的字典
	ret = avformat_open_input(&fmt_ctx, "./test.mp4", fmt, NULL);
	if (ret < 0)
	{
		av_log(NULL, AV_LOG_ERROR, "Can't open file:%s\n", av_err2str(ret));
		return -1;
	}

	//获取封装格式
	const char* format_name = fmt_ctx->iformat->name;

	//通过上下文获取视频时长
	if (fmt_ctx->duration != AV_NOPTS_VALUE)
	{
		int64_t hours, mins, secs, us;
		int64_t duration = fmt_ctx->duration + (fmt_ctx->duration <= INT64_MAX - 5000 ? 5000 : 0);
		secs = duration / AV_TIME_BASE;
		us = duration % AV_TIME_BASE;
		mins = secs / 60;
		secs %= 60;
		hours = mins / 60;
		mins %= 60;
		av_log(NULL, AV_LOG_INFO, "duration:  %02"PRId64":%02"PRId64":%02"PRId64".%02"PRId64"\n", hours, mins, secs,
			(100 * us) / AV_TIME_BASE);
	}
	else 
	{
		av_log(NULL, AV_LOG_INFO, "N/A");
	}

	//查看视频文件中流的个数
	streams = fmt_ctx->nb_streams;
	av_log(NULL, AV_LOG_INFO, "file has:%d streams\n",streams);

	//查看流的类型,判断是视频流还是音频流
	for (int index = 0; index < streams; ++index)
	{
		const AVStream *stream = fmt_ctx->streams[index];
		if (stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
		{
			av_log(NULL, AV_LOG_INFO, "streams %d is Video Stream\n",index);
		}
		else if (stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
		{
			av_log(NULL, AV_LOG_INFO, "streams %d is Audio Stream\n",index);
		}
	}
	//获取音频流的类型名称(video/audio)
	const AVStream *audio_stream = fmt_ctx->streams[1];
	avctx = avcodec_alloc_context3(NULL);
	ret = avcodec_parameters_to_context(avctx, audio_stream->codecpar);
	const char* audio_codec_type = av_get_media_type_string(avctx->codec_type);

	//获取音频流的编码类型
	const char*audio_codec_name = avcodec_get_name(avctx->codec_id);
	av_log(NULL, AV_LOG_INFO, "audio stream type:%s, stream codec:%s\n", audio_codec_type, audio_codec_name);

	//获得音频流的码率
	int audio_bitrate = avctx->bit_rate;
	av_log(NULL, AV_LOG_INFO, "%"PRId64" kb/s\n", audio_bitrate / 1000);

	//获得音频的采样率
	int sample_rate = avctx->sample_rate;
	av_log(NULL, AV_LOG_INFO, "%dHZ\n",sample_rate);

	//采样位数
	int sample_bits = avctx->bits_per_coded_sample;
	av_log(NULL, AV_LOG_INFO, "%d\n", sample_bits);

	//获取音频的通道数量
	char channel_buf[512];
	ret = av_channel_layout_describe(&avctx->ch_layout, channel_buf, sizeof(channel_buf));
	avcodec_free_context(&avctx);

	//关闭上下文
	avformat_close_input(&fmt_ctx);
	getchar();
}

除了上面的方法之外,ffmpeg还提供了一个直接输出视频文件编码参数的接口,该接口可以直接输出音视频信息到终端,对应的接口调用方法如下:

#include "libavutil/log.h"
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"

int main(int argc, char* argv[])
{
	int ret;
	int streams;
	char buf[256];
	AVFormatContext *fmt_ctx = NULL;
	AVCodecContext *avctx = NULL;
	const AVInputFormat *fmt = NULL;
	
	//设置日志的输出级别
	av_log_set_level(AV_LOG_INFO);
	
	//打开视频的上下文
	//@1音视频上下文 
	//@2文件路径 
	//@3文件格式(不指定根据文件名判断)
	//@4获取配置项的字典
	ret = avformat_open_input(&fmt_ctx, "./test.mp4", fmt, NULL);
	if (ret < 0)
	{
		av_log(NULL, AV_LOG_ERROR, "Can't open file:%s\n", av_err2str(ret));
		return -1;
	}
	//输出视频信息参数
	//@1上下文
	//@2文件索引
	//@3文件路径
	//@4输入流还是输出流
	av_dump_format(fmt_ctx, 0, "./test.mp4", 0);
	//关闭上下文
	avformat_close_input(&fmt_ctx);
	getchar();
}

输出结果如下所示:

ffmpeg查看视频帧率,ffmpeg,音视频

原文链接:FFmpeg基础:获取音视频的各种编码参数_ffmpeg 查看视频编码_码农飞飞的博客-CSDN博客

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

 文章来源地址https://www.toymoban.com/news/detail-777302.html

到了这里,关于FFmpeg基础:获取音视频的各种编码参数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【FFmpeg】ffmpeg 命令行参数 ⑧ ( 使用 ffmpeg 转换封装格式 | 音视频编解码器参数设置 | 视频 帧率 / 码率 / 分辨率 设置 | 音频 码率 / 采样率 设置 )

    音视频 文件 从 采样 - 处理 - 得到原始数据帧队列 - 音视频编码 - 音视频包队列 - 格式封装 的过程如下 : 封装格式 参考 【音视频原理】音视频 “ 采样 - 编码 - 封装 过程 “ 和 “ 解封装 - 解码 - 播放 过程 “ 分析 ( 视频采集处理流程 | 音频采集处理流程 | 音视频文件解封装

    2024年04月17日
    浏览(62)
  • FFmpeg源码分析:avcodec_send_frame()和avcodec_receive_packet()音视频编码

    FFmpeg在libavcodec模块,旧版本提供avcodec_encode_video2()作为视频编码函数,avcodec_encode_audio2()作为音频编码函数。在FFmpeg 3.1版本新增avcodec_send_frame()与avcodec_receive_packet()作为音视频编码函数。后来,在3.4版本把avcodec_encode_video2()和avcodec_encode_audio2()标记为过时API。 在上一篇文章介绍

    2023年04月11日
    浏览(27)
  • 音视频学习之ffmpeg常用基础命令整理

    基于windows环境安装好必要的ffmpeg后,对ffmpeg基础命令进行一些了解:   有时候写入MP4文件会不成功,改成flv就好 1:视频裁剪:   2:文字水印: 编译的时候需要支持 FreeType、FontConfig、iconv,系统中需要有相关的子库, 在 FFmpeg 中增加纯字母水印可以使用 drawtext 滤镜进行支持

    2024年02月12日
    浏览(34)
  • 【音视频处理】基础框架介绍,FFmpeg、GStreamer、OpenCV、OpenGL

    大家好,欢迎来到停止重构的频道。  本期我们介绍 音视频处理的基础框架 。 包括FFmpeg、GStreamer、OpenCV、OpenGL 。 我们按这样的分类介绍 : 1、编解码处理:FFmpeg、GStreamer 2、图像分析:OpenCV 3、复杂图像生成:OpenGL 首先是编解码处理的基础框架,这类基础框架的 应用场景

    2024年02月08日
    浏览(37)
  • Java如何整合FFmpeg、FFprobe等音视频处理工具,零基础照样玩

    最后奉上工具的学习资料(感兴趣的可以看看),废话不多说!!!!! FFmpeg是啥 :​ ffmpeg(命令行工具) 是一个快速的音视频转换工具。 FFmpeg能干啥 :如果你用过爱剪辑的话或者其他一些音视频处理软件的话,你可以理解他们能做的你用玩意都能做。 为啥要用FFmpeg :开源

    2024年02月02日
    浏览(48)
  • ffmpeg@音视频工具@音视频合并

    FFmpeg中文网 (github.net.cn) FFmpeg 是一款强大的开源跨平台音视频处理工具集,它包含了一系列命令行工具以及用于音频和视频编码解码、格式转换、抓取、流化等功能的库。FFmpeg 支持多种视频、音频格式和编解码器,能够进行音视频的压缩、封装、转码、分割、合并、过滤、抓

    2024年03月17日
    浏览(54)
  • 音视频 FFmpeg音视频处理流程

    推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家: 零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核) https://xxetb.xet.tech/s/VsFMs

    2024年02月12日
    浏览(44)
  • 音视频 ffmpeg命令提取音视频数据

    保留封装格式 提取视频 提取音频 推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家: 零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核) https://xxetb.xet.tech/s/VsFMs

    2024年02月10日
    浏览(45)
  • 【FFmpeg】音视频录制 ① ( 查询系统中 ffmpeg 可录制的音视频输入设备 | 使用 ffmpeg 命令录制音视频数据 | 录制视频数据命令 |录制音频数据| 同时录制音频和视频数据命令 )

    在 Windows 系统中 , 使用 ffmpeg 命令 录制 音视频 , 需要先获取 系统的 音视频设备 信息 , 录制 音视频 本质上是从 系统音视频设备 中获取数据 ; 执行 命令 , 可以获取 系统中 ffmpeg 可用的 DirectShow 音视频输入设备 ; 命令参数解析 : -list_devices true : 列出所有 ffmpeg 的 指定类型的可

    2024年04月25日
    浏览(70)
  • 音视频 ffmpeg视频裁剪

    将输入视频帧的宽度和高度从x和y值表示的位置裁剪到指定的宽度和高度;x和y是输出的左上角坐标,协调系统的中心是输入视频帧的左上角。 如果使用了可选的keep_aspect参数,将会改变输出SAR(样本宽比)以补偿新的DAR(显示长宽比) 推荐一个零声学院项目课,个人觉得老师讲得不

    2024年02月10日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包