FFmpeg 之X264视频编码与FAAC音频编码(四)(1),互联网大厂100道Android面试题助你冲关金三银四

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

fpIn = fopen(“/home/michael/Development/testspace/in.wav”, “rb”);

fpOut = fopen(“/home/michael/Development/testspace/out.aac”, “wb”);

// (1) Open FAAC engine

hEncoder = faacEncOpen(nSampleRate, nChannels, &nInputSamples, &nMaxOutputBytes);

if(hEncoder == NULL)

{

printf(“[ERROR] Failed to call faacEncOpen()\n”);

return -1;

}

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

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

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

img

img

img

img

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

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

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

尾声

以薪资待遇为基础,以发展为最终目标,要在高薪资的地方,谋求最好的发展!

下面是有几位Android行业大佬对应上方技术点整理的一些进阶资料。

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

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

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

尾声

以薪资待遇为基础,以发展为最终目标,要在高薪资的地方,谋求最好的发展!

下面是有几位Android行业大佬对应上方技术点整理的一些进阶资料。

[外链图片转存中…(img-moCTJhR7-1712491595309)]

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

  • 21
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值