FFmpeg 之X264视频编码与FAAC音频编码(四)

params.i_fps_num = fpsnum;//帧率分子

params.i_fps_den = fpsden;//帧率分母

params.i_timebase_num = 1;

params.i_timebase_den = 1000;//ms

params.i_keyint_max = fpsnum/fpsden;

params.i_keyint_min = fpsnum/fpsden;//X264_KEYINT_MIN_AUTO

params.b_repeat_headers = 0;//

params.b_annexb = 0;

params.b_deblocking_filter = 1;

params.rc.f_rf_constant = 33;

params.rc.i_bitrate = bitrate;

初始化编码器:

enc = x264_encoder_open(&params);

获取整个流的pps和SPS:

int s = x264_encoder_headers(enc, &nals, &nal_count);

x264编码:

初始化图片信息:

x264_picture_t picin, picout;

x264_picture_init(&picin);

对图片信息参数设定:

picin.i_pts = ts;

picin.i_type = X264_TYPE_AUTO;

picin.i_qpplus1 = 0;

picin.img.i_csp = (csp == 17) ? X264_CSP_NV12 : csp;//special hack for android

。。。。。。。

。。。。。。。

。。。。。

对帧进行x264编码:

ret = x264_encoder_encode(enc, &nals, &nnal, &picin, &picout);

总结

(1)初始化并设定x264_param_t

(2)初始化并设定 x264_picture_t

(3)x264编码

二、音频编解码·实战篇WAV转至AAC(AAC编码)

==========================

这里利用FAAC来实现AAC编码。另外,WAV的数据段是PCM,代码会出现很多PCM缩写。

1 下载安装 FAAC


这里的安装过程是在 Mac 和 Linux 上实现的,Windows可以类似参考。

wget http://downloads.sourceforge.net/faac/faac-1.28.tar.gz

tar zxvf faac-1.28.tar.gz

cd faac-1.28

./configure

make

sudo make install

如果才用默认的 configure 中的 prefix path,那么安装后的 lib 和 .h 文件分别在/usr/local/lib/usr/local/include,后面编译的时候会用到。

2 FAAC API


2.1 Open FAAC engine

Prototype:

faacEncHandle faacEncOpen

// 返回一个FAAC的handle(

unsigned long nSampleRate, // 采样率,单位是bps

unsigned long nChannels, // 声道,1为单声道,2为双声道

unsigned long &nInputSamples, // 传引用,得到每次调用编码时所应接收的原始数据长度

unsigned long &nMaxOutputBytes // 传引用,得到每次调用编码时生成的AAC数据的最大长度);

2.2 Get/Set encoding configuration

Prototype:

获取编码器的配置:

faacEncConfigurationPtr faacEncGetCurrentConfiguration // 得到指向当前编码器配置的指针

(

faacEncHandle hEncoder // FAAC的handle

);

设定编码器的配置:

int FAACAPI faacEncSetConfiguration

(

faacDecHandle hDecoder, // 此前得到的FAAC的handle

faacEncConfigurationPtr config // FAAC编码器的配置

);

2.3 Encode

Prototype:

int faacEncEncode

(

faacEncHandle hEncoder, // FAAC的handle

short *inputBuffer, // WAV原始数据

unsigned int samplesInput, // 调用faacEncOpen时得到的nInputSamples值

unsigned char *outputBuffer,// 至少具有调用faacEncOpen时得到的nMaxOutputBytes字节长度的缓冲区

unsigned int bufferSize // outputBuffer缓冲区的实际大小

);

2.4 Close FAAC engine

Prototype

void faacEncClose

(

faacEncHandle hEncoder // 此前得到的FAAC handle

);

3 流程


3.1 做什么准备?

采样率,声道数(双声道还是单声道?),还有你的WAV的单个样本是8位的还是16位的?

3.2 开启FAAC编码器,做编码前的准备

  1. 调用faacEncOpen开启FAAC编码器后,得到了单次输入样本数nInputSamples和输出数据最大字节数nMaxOutputBytes

  2. 根据nInputSamplesnMaxOutputBytes,分别为WAV数据和将要得到的AAC数据创建缓冲区;

  3. 调用faacEncGetCurrentConfiguration获取当前配置,修改完配置后,调用faacEncSetConfiguration设置新配置。

3.3 开始编码

调用faacEncEncode,该准备的刚才都准备好了,很简单。

3.4 善后

关闭编码器,另外别忘了释放缓冲区,如果使用了文件流,也别忘记了关闭。

4 测试程序


4.1 完整代码

WAV格式音频文件/home/michael/Development/testspace/in.wav转至AAC格式文件/home/michael/Development/testspace/out.aac

#include <faac.h>

#include <stdio.h>

typedef unsigned long ULONG;

typedef unsigned int UINT;

typedef unsigned char BYTE;

typedef char _TCHAR;

int main(int argc, _TCHAR* argv[])

{

ULONG nSampleRate = 11025; // 采样率

UINT nChannels = 1; // 声道数

UINT nPCMBitSize = 16; // 单样本位数

ULONG nInputSamples = 0;

ULONG nMaxOutputBytes = 0;

int nRet;

faacEncHandle hEncoder;

faacEncConfigurationPtr pConfiguration;

int nBytesRead;

int nPCMBufferSize;

BYTE* pbPCMBuffer;

BYTE* pbAACBuffer;

FILE* fpIn; // WAV file for input

FILE* fpOut; // AAC file for output

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

面试复习笔记:

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

《960页Android开发笔记》

《1307页Android开发面试宝典》

包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

1712614381264)]

《1307页Android开发面试宝典》

包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

[外链图片转存中…(img-nZP1Gvac-1712614381264)]

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 29
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值