音视频编码文档
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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