FFmpeg学习记录(二)—— ffmpeg多媒体文件处理

1.日志系统

常用的日志级别:

  • AV_LOG_ERROR
  • AV_LOG_WARNING
  • AV_LOG_INFO
  • AV_LOG_DEBUG
#include <stdio.h>
#include <libavutil/log.h>int main(int argc, char *argv[])
{av_log_set_level(AV_LOG_DEBUG);av_log(NULL, AV_LOG_DEBUG, "hello world!\n");return 0;
}

2.文件的删除与重命名

文件删除与重命名的API:

  • avpriv_io_delete()
  • avpriv_io_move()
	int ret;// 重命名ret = avpriv_io_move("111.txt", "222.txt");if(ret < 0) {av_log(NULL, AV_LOG_ERROR, "Failed to rename\n");return -1;}av_log(NULL, AV_LOG_INFO, "Success to renmae\n");// 删除ret = avpriv_io_delete("./test.txt");if(ret < 0) {av_log(NULL, AV_LOG_ERROR, "Failed to delete\n");return -1;}av_log(NULL, AV_LOG_INFO, "Success to delete\n");

3.目录操作

操作目录重要函数:

  • avio_open_dir()
  • avio_read_dir()
  • avio_close_dir()

操作目录重要结构体:

  • AVIODirContext
  • AVIODirEntry
    avdevice_register_all();int ret;AVIODirContext *ctx = NULL;AVIODirEntry *entry = NULL;av_log_set_level(AV_LOG_INFO);ret = avio_open_dir(&ctx, "./", NULL);if(ret < 0){av_log(NULL, AV_LOG_ERROR, "Can't open dir: %s\n", av_err2str(ret));return -1;}while(1) {avio_read_dir(ctx, &entry);if(ret < 0){av_log(NULL, AV_LOG_ERROR, "Can't read dir: %s\n", av_err2str(ret));goto __fail;}if(!entry) {break;}av_log(NULL, AV_LOG_INFO,"%-9s %12"PRId64"  %s\n", entry->size, entry->name);avio_free_directory_entry(&entry);}__fail:avio_close_dir(&ctx);

4.抽取音频数据

  • 1.处理一些参数
  • 2.打开多媒体文件
  • 3.从多媒体文件中找到音频流
  • 4.打开目的文件的上下文
  • 5.为目的文件,创建一个新的音频流
  • 6.设置输出音频参数
  • 7.写多媒体文件头到目的文件
  • 8…从源多媒体文件中读音频数据到目的文件中
  • 9.写多媒体文件尾到文件中
  • 10.将申请的资源释放掉

步骤比较多,一点一点来实现:

 // 1.处理一些参数if(argc < 3) {av_log(NULL, AV_LOG_INFO, "argument must be 3");exit(-1);}src = argv[1];dst = argv[2];// 2.打开多媒体文件ret = avformat_open_input(&pFmtCtx, src, NULL, NULL);if(ret < 0) {av_log(NULL, AV_LOG_ERROR, "%s\n", av_err2str(ret));exit(-1);}
// 3.从多媒体文件中找到音频流idx = av_find_best_stream(pFmtCtx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);if(idx < 0) {av_log(pFmtCtx, AV_LOG_ERROR, "Does not include audio\n");goto _ERROR;}// 4.打开目的文件的上下文oFmtCtx = avformat_alloc_context();if(!oFmtCtx) {av_log(NULL, AV_LOG_ERROR, "No Memory\n");goto _ERROR;}outFmt = av_guess_format(NULL, dst, NULL);oFmtCtx->oformat = outFmt;// 5.为目的文件,创建一个新的音频流outStream = av_format_new_stream(oFmtCtx, NULL);// 6.设置输出音频参数inStream = pFmtCtx->stream[idx];avcodec_parameters_copy(outStream->codecpar, inStream->codecpar);outStream->codecpar->codec_tag = 0;
    // 7.写多媒体文件头到目的文件ret = avformat_write_header(oFmtCtx, NULL);if(ret < 0) {av_log(NULL, AV_LOG_ERROR, "%s\n", av_err2str(ret));goto _ERROR;}// 8.聪源多媒体文件中读到音频数据到目的文件中while(av_read_frame(pFmtCtx, &pkt) >= 0) {if(pkt.stream_index == idx) {pkt.pts = av_rescale_q_rnd(pkt.pts, inStream->time_base, outStream->time_base, AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX);pkt.dts = pkt.dts;pkt.duration = av_rescale_q(pkt.duration, inStream->time_base, outStream->time_base);pkt.stream_index = 0;pkt.pos = -1;av_interleaved_write_frame(oFmtCtx, &pkt);av_packet_unref(&pkt);}}// 9.写多媒体文件尾到文件中av_write_trailer(oFmtCtx);// 10.将申请的资源释放掉
_ERROR:if(pFmtCtx) {avformat_close_input(&pFmtCtx);pFmtCtx = NULL;}if(oFmtCtx->pb) {avio_close(oFmtCtx->pb);}if(oFmtCtx) {avformat_free_context(oFmtCtx);oFmtCtx = NULL;}

6.抽取视频数据

与处理音频流程相同,简单修改即可

 // 3.从多媒体文件中找到视频流idx = av_find_best_stream(pFmtCtx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);if(idx < 0) {av_log(pFmtCtx, AV_LOG_ERROR, "Does not include VIDEO\n");goto _ERROR;}... ...// 8.从源多媒体文件中读到视频数据到目的文件中while(av_read_frame(pFmtCtx, &pkt) >= 0) {if(pkt.stream_index == idx) {pkt.pts = av_rescale_q_rnd(pkt.pts, inStream->time_base, outStream->time_base, AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX);pkt.dts = av_rescale_q_rnd(pkt.dts, inStream->time_base, outStream->time_base, AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX);// pkt.dts = pkt.dts;pkt.duration = av_rescale_q(pkt.duration, inStream->time_base, outStream->time_base);pkt.stream_index = 0;pkt.pos = -1;av_interleaved_write_frame(oFmtCtx, &pkt);av_packet_unref(&pkt);}}

6.多媒体格式转封装

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

7.视频裁剪

在这里插入图片描述

程序是在上面的程序基础上修改的,这里就把核心修改地方贴出来。

有两个注意点:(对应下面的修改2和修改3)

第一个是音视频时间的问题。

针对音频:从第5秒钟截取,那他就是第5秒。针对视频:因为有IPB 帧,如果刚好第5秒是P帧或者B帧,没有了I帧,那么就不能解码成功,播放的时候就会花屏。

解决:告诉ffmpeg如果不是I帧,就要向前或者向后找最近的I帧

第二个是时间的问题。

由于是裁剪,所以需要计算相对时间。 使用后面的时间减去第一个时间基的时间,这样子才能保证时间的正确性。音频的dts和pts是相同的,而视频可能是不同的,所以这里需要多加一步判断。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1411781.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【网站项目】社区互助平台

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Java | AI+编程 | 如何使用通义灵码提升开发效率

大家好&#xff0c;我是程序员影子 | 全网同名 一名致力于帮助更多朋友快速入门编程的程序猿 今天&#xff0c;我将以小白入门的视角带着大家学会如何在Idea上使用通义灵码&#xff0c;提高开发效率&#xff0c;减少重复工作&#xff1b;话不多说&#xff0c;我们直接进入正题…

深入解析I2C协议:通讯简化之道

在现代电子系统中&#xff0c;组件间的通信是必不可少的。而I2C协议&#xff08;Inter-Integrated Circuit&#xff09;&#xff0c;由Philips Semiconductor&#xff08;现为NXP Semiconductors&#xff09;在1980s初期发明&#xff0c;已成为一种广泛使用的串行通信协议。其设…

Endnote X9 20 21如何把中文引用的et al 换(变)成 等

描述 随着毕业的临近&#xff0c;我在写论文时可能会遇到在引用的中文参考文献中出现“et al”字样。有的学校事比较多&#xff0c;非让改成等等&#xff0c;这就麻烦了。 本身人家endnote都是老美的软件&#xff0c;人家本身就是针对英文文献&#xff0c;你现在让改成等等&a…

揭秘Fabric交易流程:一文带你深入了解

随着区块链技术的日益普及&#xff0c;Hyperledger Fabric作为一种联盟链解决方案&#xff0c;受到了广泛关注。那么&#xff0c;Fabric的交易流程究竟是怎样的呢&#xff1f;本文将为您一一揭晓。 1. Fabric交易的参与方 客户端&#xff1a;交易流程的发起方&#xff0c;发起…

面试中算法(最大公约数)

高效求出两个整数的最大公约数&#xff0c;要尽量优化算法的性能。 def getDiv(a,b):mamax(a,b)mimin(a,b)#判断能被整除if ma%mi0:return mi#递归return getDiv(ma%mi,mi)if __name__ __main__:# print(getDiv(10, 25))print(getDiv(1000, 50))没错&#xff0c;这确实是辗转…

12【PS作图】像素画技巧

【内容背景】本节介绍PS画像素画的小技巧&#xff0c;能够节约绘画时间~ 直线 斜线 画直线&#xff0c;长按 Shift 键&#xff0c;然后用铅笔画就可以画出水平线、垂直线和斜线 &#xff08;1&#xff09;如果按住shift键&#xff0c;一直按住鼠标&#xff0c;就可以得到水平…

“视频号小店”和“抖音小店”新手做电商选择哪个更好?

哈喽~我是电商月月 做电商的老商家和&#xff0c;准备做电商的新手朋友都知道现在最大的电商平台就是“抖音小店” 但抖店小店毕竟发展了四年&#xff0c;流量多&#xff0c;商家也多&#xff0c;最近又崛起了一个新黑马“视频号小店” 那到底去哪个平台发展才有前景呢&…

基于51单片机的智能台灯proteus仿真设计( proteus仿真+程序+原理图+报告+讲解视频)

基于51单片机的红外光敏检测智能台灯控制系统仿真( proteus仿真程序原理图报告讲解视频&#xff09; 1.主要功能&#xff1a; 基于51单片机的红外检测光照检测智能台灯仿真设计 1、检测光照强度并显示在数码管上。 2、具备红外检测人体功能。 3、灯光控制模式分为自动模式…

【强训笔记】day8

NO.3 思路&#xff1a;相乘除以最大公约数等于最小公倍数。最小公倍数等于gcd&#xff08;a&#xff0c;a%b&#xff09;递归直到b等于0。 代码实现&#xff1a; #include <iostream> using namespace std;int gcd(int a,int b) {if(b0) return a;return gcd(b,a%b); }…

关于YOLO8学习(六)安卓部署ncnn模型--图片检测

前文 关于YOLO8学习(一)环境搭建,官方检测模型部署到手机 关于YOLO8学习(二)数据集收集,处理 关于YOLO8学习(三)训练自定义的数据集 关于YOLO8学习(四)模型转换为ncnn 关于YOLO8学习(五)安卓部署ncnn模型–视频检测 简介 前文第五章,讲述了部署自定义模型后,进…

2023第十四届蓝桥杯国赛C/C++ 大学 A 组 圆上的连线

思路&#xff1a;很显然总的方案数等于挑选偶数点的方案数乘以对应偶数点的连线方案数之和&#xff0c;挑选偶数点的方案数靠组合数得出&#xff0c;偶数点的连线方案数就是个卡特兰数。具体为什么是卡特兰数&#xff0c;可以任选一个点&#xff0c;枚举这个点所连边的位置&…

FloodFill-----洪水灌溉算法(DFS例题详解)

目录 一.图像渲染&#xff1a; 代码详解&#xff1a; 二.岛屿数量&#xff1a; 代码详解&#xff1a; 三.岛屿的最大面积&#xff1a; 代码详解&#xff1a; 四.被围绕的区域&#xff1a; 代码详解&#xff1a; 五.太平洋大西洋水流问题&#xff1a; 代码详解&#x…

大语言模型从Scaling Laws到MoE

1、摩尔定律和伸缩法则 摩尔定律&#xff08;Moores law&#xff09;是由英特尔&#xff08;Intel&#xff09;创始人之一戈登摩尔提出的。其内容为&#xff1a;集成电路上可容纳的晶体管数目&#xff0c;约每隔两年便会增加一倍&#xff1b;而经常被引用的“18个月”&#xf…

C++学习第二十二课:STL映射类的深入解析

C学习第二十二课&#xff1a;STL映射类的深入解析 在C标准模板库&#xff08;STL&#xff09;中&#xff0c;映射类&#xff08;std::map和std::multimap&#xff09;是用来存储关联数据的容器。与集合类不同&#xff0c;映射类中的每个元素都是一个键值对&#xff08;key-val…

关于继承~

继承 动物有猫、狗&#xff0c; 猫又分为加菲猫、布偶猫......&#xff1b;狗又有哈士奇、德国牧羊犬...... 我们发现&#xff0c;下一类除了拥有上一类的共性之外&#xff0c;还拥有自己的特性。 于是我们可以利用继承的方式来减少重复的代码 继承的基本语法 class A:p…

buuctf re findKey

参考&#xff1a;http://t.csdnimg.cn/hUKRJ 参考&#xff1a;http://t.csdnimg.cn/kIk4i 32位&#xff0c;ida打开 f5&#xff0c;先不管呢 winmain函数 看看字符串 进到flag那里&#xff0c;没法反编译 寻找 看汇编&#xff0c;发现两个一样的push&#xff08;不理解怎…

【力扣】203、环形链表 II

142. 环形链表 II 要解决这道题&#xff0c;首先需要对问题进行拆解&#xff1a; 确定链表是否存在环确定环的入口点 如何判断是否存在环呢&#xff1f;这个比较容易想到&#xff0c;使用快慢指针即可判断链表是否存在环。我们定义两个指针&#xff1a; ListNode slow head…

CUDA和显卡驱动

1.安装显卡驱动 https://www.nvidia.com/download/index.aspx?langen-us 由于我的显卡是RTX4060&#xff0c;因此先选择RTX40系列&#xff0c;然后选择RTX4060&#xff0c;进行安装 2.查看显卡对应的CUDA CUDA安装地址&#xff1a;https://developer.nvidia.com/cuda-toolk…

buuctf-misc-27.面具下的flag

27.面具下的flag 题目&#xff1a;binwalk分离后&#xff0c;解压vmdk文件,对其中的字符进行翻译 将其放到kali中进行binwalk,可以看到有有隐藏的压缩包文件&#xff0c;我们提取一下 文件放到了主目录下&#xff0c;我们使用对应命令发现有zip文件&#xff0c;然后再使用对应…