音视频开发35 FFmpeg 编码- 将YUV 和 pcm合成一个mp4文件

news/2024/9/24 21:20:30/

一 程序的目的

/***
 *该程序的目的是:
 * 将 一个pcm文件 和 一个 yuv文件,合成为一个 0804_out.mp4文件
 * pcm文件和yuv文件是从哪里来的呢?是从 sound_in_sync_test.mp4 文件中,使用ffmpeg命令 抽取出来的。
 * 这样做的目的是为了对比前后两个mp4(sound_in_sync_test.mp4  和 0804_out.mp4 ) 文件。
 *
 * 1. 从sound_in_sync_test.mp4 文件 中抽取 pcm命令如下:
 * ffmpeg -i sound_in_sync_test.mp4 -vn -ar 44100 -ac 2 -f s16le 44100_2_s16le.pcm
 * -vn 表示不处理视频
 *
 * 2. 从sound_in_sync_test.mp4 文件 中抽取 yuv命令如下:
 *
 * ffmpeg -i sound_in_sync_test.mp4 -pix_fmt yuv420p 720x576_yuv420p.yuv
 *
 * 3.播放测试
 *  对于 pcm 数据
 ffplay -ac 2 -ar 44100 -f s16le 44100_2_s16le.pcm
 *  对于 YUV 数据
 ffplay -pixel_format yuv420p -video_size 720x576 -framerate 25  720x576_yuv420p.yuv
 ***/

原始 sound_in_sync_test.mp4 的信息

二 流程 

1.将pcm 编码成aac

1.1  音频重采样 -- AudioResample

pcm文件中读取文件后,有一个问题,我们本地的pcm文件可能是 s16le的,  44.1kz, 2声道的。

但是 我们使用的 音频编码器( encoder是 的ffmpeg 自带的aac,而ffmpeg自带的aac仅支持 AV_SAMPLE_FMT_FLTP 采样率的编码器,因此需要重采样,也就是说要将s16le的变成f32p的。

1.2 aac 设置参数问题

需要设定的参数

aac

采样率,声道数,采样格式,比特率,pts

aac 和 h264 在编码的时候,编码器上下文的很多参数都是可以设定好的,但是有些参数是不好设置的,其中比较不容易理解的就是pts(显示时间),

aac在编码的时候,要设置好pts,pts是显示时间,

我们这样思考,pcm 一秒钟有44100个样本,那么一秒钟处理的样本数量为 1/44100秒,

那么当一个aac帧有1024 个采样点的时候,对于pcm来说,所谓的显示时间就是播放时间,因此每次处理一帧(包括播放时间和编码时间)(也就是1024个采样点的时间),

1024*1/44100秒 = 0.0232199546485261秒 = 23.2199546485261毫秒= 23219.9546485261微妙

我们在使用pts单位的时候,会以微妙为单位。

注意的是,这里需要设置到AAC encoder Context 里面。

2.将yuv编码成h264

2.1 将yuv编码成h264时需要设定的参数

分辨率,像素格式,帧率,比特率,b帧有多少个,pts

同理,h264在编码的时候,要设置好pts,pts是显示时间,

我们设置的25图片/秒,也就是40毫秒一张图片,40000微妙一张图片

当我们显示一张图片的时候,pts就应该以 40000微妙为一个单位,注意这里需要设置到 H264 encoder context 里面

3.将aac 和 h264 打包成 mp4

3.0 设计

初始化,销毁,avio_open,

3.1 使用 newstream

在将aac文件和 h264文件打包的时候,首先要先有 AVStream 才好打包。

因此要使用到 new stream,第二个参数没有用,

AVStream *avformat_new_stream(AVFormatContext *s, const struct AVCodec *c);
 

3.2 时间同步问题 time_base问题

3.3 合成mp4文件,还有一个点,帧率问题,sps 和 pps  问题(这个好像是 mp4文件的)

4. 


http://www.ppmy.cn/news/1474101.html

相关文章

【2024年世界人工智能大会】AI新航向:从“卷模型”到“卷应用”的深度探索

在2024年世界人工智能大会的璀璨舞台上,李彦宏的一席话犹如明灯,照亮了AI技术发展的新路径——“不要卷模型,要卷应用”。这不仅仅是对当前AI领域热潮的冷静反思,更是对未来发展方向的深刻洞察。 AI技术应用场景:从理…

C++继承(一文说懂)

目录 一: 🔥继承的概念及定义1.1 继承的概念1.2 继承定义1.2.1 定义格式1.2.2 继承关系和访问限定符1.2.3 继承基类成员访问方式的变化 二:🔥基类和派生类对象赋值转换三:🔥继承中的作用域四:&a…

4.动态SQL(if,choose,where,set,trim,foreach遍历)的使用+$和#的区别

文章目录 动态sql一、动态sql1.if条件判断2、choose、when、otherwise3、where标签4、set标签5、trim标签1)替代where标签效果2) 生成set标签效果 6、foreach迭代遍历1)属性 7.SQL标签-提取重用的SQL代码片段8、bind标签9.MyBatis中${}和#{}的区别: 动态sql 一、动态sql 常见…

昇思25天学习打卡营第17天|linchenfengxue

RNN实现情感分类 概述 情感分类是自然语言处理中的经典任务,是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型,实现如下的效果: 输入: This film is terrible 正确标签: Negative 预测标签: Negative输入: This fil…

网络安全筑基篇——反序列化漏洞

目录 序列化是什么? 反序列化又是什么? 反序列化漏洞的危害 代码样例 常见的魔术方法 修复方式有哪些? 常见的反序列化漏洞 Shiro反序列化漏洞 Fastjson反序列化漏洞 序列化是什么? 将实例化对象转换成字节流的过程 反序…

Pinia在vue项目中的使用

Pinia是Vue 3官方推荐的状态管理模式,由尤雨溪创建并集成到了 Vue.js 中,它是一个轻量级、纯粹基于函数的思想实现的应用状态管理库。Pinia的设计理念类似于Redux,但它更简单易用,更适合于小型到中型的单文件组件应用。 在Vue 3项…

数据库(表)

要求如下: 一:数据库 1,登录数据库 mysql -uroot -p123123 2,创建数据库zoo create database zoo; Query OK, 1 row affected (0.01 sec) 3,修改字符集 mysql> use zoo;---先进入数据库zoo Database changed …

设计模式7-装饰模式

设计模式7-装饰模式 写在前面动机模式定义结构代码推导原始代码解决问题分析 选择装饰模式的理由1. 职责分离(Single Responsibility Principle)2. 动态扩展功能3. 避免类爆炸4. 开闭原则(Open/Closed Principle)5. 更好的组合复用…