音视频编码文档

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

音视频编码说明

1音视频编码参数

1.1音频编码参数

音频编码格式采用AAC格式,其参数设置比较简单,主要设置参数如下:

(1)音频样本格式的设置

c->sample_fmt = AV_SAMPLE_FMT_S16;

sample_fmt是一个enum类型,包含了多种样本格式,样本格式的设置应保持与Android应用层音频采样格式一致。此处,我们设置为AV_SAMPLE_FMT_S16,Android应用层采样格式也是16位的

ENCODING_PCM_16BIT格式。

(2)音频码率设置

c->bit_rate = 64000;

此参数为应用层提供参数接口,由应用层根据编码效果来设定。此处参考值为64000。

(3)音频采样率设置

c->sample_rate = 44100;

此参数为应用层提供参数接口,由应用层获取实际机型可用的采样率来决定。采样率越低,音频效果越差,反之,越好。音频采样率一般有8000,44100, 47250, 48000, 47250,32000, 11025, 16000,

22050等值,此处参考值为44100HZ,现在基本所有机器都支持44100采样,而且音频效果也很好。

(4)音频通道设置

c->channels = 2;

此参数为应用层提供参数接口,根据应用层需求来设置。当设置1时为单声道模式,设置2时为立体声道模式。此处参考值为2.

1.2视频编码参数

视频编码参数相对音频编码参数复杂,其中一些参数关系到视频编码的质量和编码速度,为此需要设置一套最优的参数以确保质量和速度达到一个平衡点。

(1)视频编码基本参数设置

<1> DEC_ID_H264;

视频编码格式采用H264格式。

<2> c->width = 480;

c->height = 480;

width和height两个参数为应用层提供参数接口,根据具体需求来设置编码后视频的大小,即最终视频的width和height。应用层也可以考虑通过调节width和height的大小来改变视频编码的速度,例如480*320的大小比480*480的大小编码速度快很多。此处默认是

480*480大小。

<3> c->time_base.den = 15;

c->time_base.num = 1;

这两个参数决定视频播放帧率,即每秒播放多少帧的视频,

time_base.num固定为1, time_base.den为应用层提供参数接口。一般应用层录取视频帧率和播放视频帧率一致。此参数的设置需要考虑到编码速度的问题,经过反复测试,15帧/s是一个比较合适的值。

<4> c->pix_fmt = AV_PIX_FMT_YUV420P;

视频像素格式,采用AV_PIX_FMT_YUV420P格式。

(2)重要参数设置

以上视频参数是必须设置的基本参数,以下介绍的参数将会直接影响到视频的质量和编码速度。详细如下:

<1> c->thread_count

编码线程数,将帧分块,由不同的线程去完成。此参数为应用层提供参数接口,大小需要根据设备CPU核心数来动态设定。经过反复测试,此处大小设置为 thread_count=CPU核心数*1.5时编码速度达到比较好的水平。

<2> opt_set_funcs系列函数的利用

opt_set_funcs系列函数有以下10个:

int av_opt_set (void *obj, const char *name, const char *val, int search_flags);

int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags);

int av_opt_set_double(void *obj, const char *name,double val,int search_flags);

int av_opt_set_q(void *obj, const char *name, AVRational val, int search_flags);

int av_opt_set_bin (void *obj, const char *name, const uint8_t *val, int size, int search_flags);

int av_opt_set_image_size(void*obj, const char*name, int w, int h, int search_flags); int av_opt_set_pixel_fmt (void *obj, const char *name, enum AVPixelFormat fmt, int search_flags);

int av_opt_set_sample_fmt(void *obj, const char *name, enum AVSampleFormat fmt, int

search_flags);

int av_opt_set_video_rate(void *obj, const char *name, AVRational val, int

search_flags);

int av_opt_set_channel_layout(void *obj, const char *name, int64_t ch_layout, int search_flags);

我们可以在ffmpeg源码库libavutil\opt.h查看函数的声明,目前只用到前两个av_opt_set、av_opt_set_int来设置x264里的一些编码参数。

av_opt_set(c->priv_data, "preset", "ultrafast", 0);

通过preset参数可以设置编码速度的等级,preset的级别有

ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo,从快到慢。其实,这里的每个参数都是由一组x264参数设置组合而成。例如ultrafast参数是由以下参数设置组合的:

- ultrafast:\n"

" --no-8x8dct --aq-mode 0 --b-adapt 0\n"

" --bframes 0 --no-cabac --no-deblock\n"

" --no-mbtree --me dia --no-mixed-refs\n"

" --partitions none --rc-lookahead 0 --ref 1\n"

" --scenecut 0 --subme 0 --trellis 0\n"

"--no-weightb --weightp 0\n"

这些参数可以在x264源码库里x264.c文件中查看到。大部分参数的含义可以参看或者.

preset参数为应用层也提供了参数接口,应用层根据编码速度和质量的进行选取合适的等级。经过反复测试,设置为ultrafast

相关文档
最新文档