当前位置: 首页 > news >正文

做印尼购物网站如何发货企航网络推广

做印尼购物网站如何发货,企航网络推广,钱追得回吗,东莞保安公司在哪里原理#xff1a; 消除冗余信息#xff0c;压缩量最大#xff0c;也叫有损压缩 剔除人耳听觉范围外的音频信号20Hz以下和20000Hz以上#xff1b;去除被掩蔽的音频信号#xff0c;信号的遮蔽可以分为频域遮蔽和时域遮蔽#xff1b;频域遮蔽效应 屏蔽70分贝以下#xff0…原理 消除冗余信息压缩量最大也叫有损压缩 剔除人耳听觉范围外的音频信号20Hz以下和20000Hz以上去除被掩蔽的音频信号信号的遮蔽可以分为频域遮蔽和时域遮蔽频域遮蔽效应 屏蔽70分贝以下20HZ以下20000HZ以上 屏蔽分贝小频率小的声音 两个频率相近发出的声音去除低强度的也就是分贝高的会盖住分贝低的 时域遮蔽效应 根根时间推移相近频率且同时出现的声音声音强度高的遮蔽强度低的声音并且去除同一时间段前后杂音前遮蔽50毫秒后遮蔽200毫秒在这段时间内的声音强度越接近就越会被屏蔽。 去除冗余信息后再进行无损压缩 无损压缩就是压缩后的数据能够解压缩进行还原有损则不能熵编码中有 哈夫曼编码用一个很小的二进制数代替一个长的字符串频率越高编码越小频率越低编码越长 算术编码利用小数进行编码在香农编码的基础改进而来的 香农编码 音频编码过程 数据先同时通过 时域转频域变换器和心理学模型处理数据前者将数据转换成多种频段的数据然后剔除不需要的频段数据后者会去除非人耳听到的范围声音和一些复合声音最后将两者合并经过量化编码无损编码之类的形成比特流数据在此之前还会有一些辅助数据此后数据就会变得非常小 常见的音频编码器 opus、aac、Ogg、Speex、iLBC、AMR、G.711, 最常用的编码器是opus aac。 opus常用于直播尤其是无延迟的直播webrtc默认使用opus; AAC是应用最广泛的编解码 Ogg收费 Speex支持回音消除 G.711一般用于固定电话声音损耗严重通话会失真 本文福利 免费领取C音视频学习资料包学习路线大纲、技术视频/代码内容包括音视频开发面试题FFmpeg webRTC rtmp hls rtsp ffplay 编解码推拉流srs有需要的可以进企鹅裙927239107领取哦~ AAC比较适合有一定延迟的直播AAC-LD属于低延迟编码器 AAC编码器目前应用最广泛,如iOS、安卓和其他嵌入式设备都包含了AAC硬件编解码器主要学习这个编码器 用来取代mp3比mp3更高的压缩比和保真性更强 常用的规格有AAC LC、AAC HE V1 、AAC HE V2三种 AAC HE V1 AAC SBR AAV HE V2 AAC SBR PS 目前AAC HE V1 已经被取代 V2 取代了 V2的码流跟V1的差别不是很大根据声音的数据变化如果两个声道的差别很大码流差别就会越小 AAC 中header有两种格式 就相当于在aac数据前面加了个Headerheader里面就会包含aac数据的一些信息方便进行编解码 ADIFAudio data interchange format 特点是只能从头开始解码可以确定的找到音频数据的开始部分不能从音频数据中间开始这种格式常用于磁盘文件中ADTSAudio Data Transport Format在每一帧的数据里面都会有一个同步字也就是每帧都有一个header所以他可以在任意的位置开始进行解码就像流式数据 ADTS结构 由7-9个字节组成通常情况下是7个字节如果有CRC 就是9个字节字节中的每一位都有独特的含义 1~12bit全部是1也就是0xFFF表示是同步字13编码规范 0 MPEG-4 1 MPEG-214~15总是016是否有保护 1 代表 没有 CRC 0 代表有CRC17~18表示的是MPEG-4的音频类型AAC LC、 AAC HE V1 、AAC HE V219~22表示的是采样率24~26通道数31~33数据长度也包括了header的长度 剩余的之后补上 其中每一十进制数对应的含义 Audio Object Type: 在代码中实际获取类型的时候需要进行1才是下面的类型 1 AAC main 2 AAC LC 5 SBR HE V1 29 ps HE V2 其中的采样率是通过十进制数表示的一个采样率有一个表比如0 96000Hz 1 88200HZ 等 音频采集实战 每个端音频采集的底层和应用层的库是不一样的所以使用ffmpeg中间层能够实现跨平台开发 Android端的底层库是AudioRecorder应用层是MediaRecorderiOS端的底层库是AudioUnit应用层是AVFoundationWindows端的常用的是Directshow OpenAL 还有Windows7之上的AudioCore 使用ffmpeg有两种采集方式 使用命令方式命令详情查看ffmpeg相关指令的那篇使用代码调用api的方式 在mac下的动态库需要对动态库进行签名 获取本地签名证书列表/usr/bin/security find-identity -v -p codesigning 查看动态库是否签名 codesign -d -vv 动态库文件 签名命令codesign -fs iPhone Distribution: 你的签名证书. 动态库文件 xcode环境13.2.1 签名了如果还是报错关掉沙盒并且设置 Enable Hardened Runtime 为NO 在项目中设置user header search path的时候要使用全路径方式我使用$(PROJECT_NAME)方式有的头文件在链接的时候会报错 采集音频的步骤 打开输入输出设备涉及的包是avdevice avformat 注册设备 设置采集方式根据平台选择即设置输入 打开音频设备获取数据包 包avcodec 主要使用av_read_frame方法获取数据 将数据放入packet中 在读取的时候注意缓冲区无未准备好的情况将数据输出到文件 创建文件--- fopen 将数据写入文件-- fwrite 关闭文件 -- fclose 打开设备 · void startRecorder(void) {// 上下文AVFormatContext *av_context NULL;AVDictionary *options NULL;// 1. 注册设备avdevice_register_all();// 2. 设置采集方式//设置采集方式 mac os 下是AVfoundation Windows下是dshow linux 下是alsaAVInputFormat *format av_find_input_format(avfoundation);// 3. 打开设备//里面的识别格式为[[video device]:[audio device]] 这里写0 是获取第1个音频设备char *name :0;// url 是路径 可以是网络路径也可以是本地路径 本地路径mac下的格式是 video audio 这里表示获取第一个音频设备int result avformat_open_input(av_context, name, format, options);if (result ! 0) {char errors[1024];// 根据返回值生成错误信息av_make_error_string(errors, 1024, result);printf(打开设备失败%s\n, errors);return;}printf(打开设备成功\n);get_audio_packet(av_context,packet_callback);// 关闭输入 上下文avformat_close_input(av_context);} 读取数据和存储到文件 void get_audio_packet(AVFormatContext *context, void (*packet_callback)(AVPacket)) {// w 写 b 二进制 没有就创建文件FILE *f fopen(/Users/cunw/Desktop/learning/音视频学习/音视频文件/code_recorder.pcm, wb);AVPacket *packet av_packet_alloc();int result -1;// 循环读取设备信息// result -35 是Resource temporarily unavailable 因为获取太频繁 设备未准备好还正在处理数据 // 因为输入设备准备好需要时间 睡一秒后再读取 sleep(1.0);while ((result av_read_frame(·context, packet)) 0 || result -35) {if (packet-size 0) {packet_callback(*packet);fwrite(packet-data, packet-size, 1, f);// 每读取一次 就清空数据包 不然数据包会一直增大av_packet_unref(packet);}}if (result ! 0) {char errors[1024];av_make_error_string(errors, 1024, result);printf(get packet occured error is \%s\ \n, errors);}// 将缓冲区剩余的数据 强制写入文件fflush(f);fclose(f);// 释放packet空间av_packet_free(packet);} // 回调函数 void packet_callback(AVPacket packet) {printf(packet size is %d\n,packet.size);} 播放ffplay 播放pcm数据 ffplay -ar(采样率) 44100 -ac通道数 2 -f采样大小f32le 文件名 音频编解码实战 音频重采样 就是将音频三元组采样率 采样大小 通道数的值转成另外一组值 1. 应用场景 1、从设备采集的音频数据与编码器要求的不一致; 2、扬声器要求的音频数据与要播放的音频数据不一致 3、方便运算例如回音消除 将多声道变为单声道; 2. 如何判断是否需要重采样 了解音频设备的参数查看ffmpeg源码 3. 重采样的步骤 api需要使用libswresample库 1. 创建重采样上下文 - swr_alloc_set_opts 通过设置采样参数获取上下文 2. 设置参数 - 参数大体分为输出的采样率、采样大小、声道和输入的采样率、采样大小、声道 - out_ch_layout表示声道也可以是布局扬声器的布局AV_CH_LAYOUT_STEREO 立体声 - out_sample_fmt输出的采样格式 16 AV_SAMPLE_FMT_S16 或者 32 AV_SAMPLE_FMT_FLT - av_sample_fmt_s16 in_ch_layout输入的声道布局 - in_sample_fmt 输入的采样格式 - in_sample_rate: 输入的采样率 - 后两位是log相关 0null 3. 初始化重采样 - swr_init 初始化上下文 4. 进行重采样 - swr_convert 开始转换 目的就是将输入缓冲区的数据写入输出缓冲区out输出结果缓冲区 out_count每个通道的采样数 in输入的缓冲区 in_count输入的单个通道的采样数 - 因为重采样的数据需要重新构造所以需要创建输入缓冲区和输出缓冲区 使用av_sample_array_and_samples audio_data创建其中的单通道采样数单位是字节nb_samples pkt.size / (32位 / 8) / 2通道数 linessize缓冲区大小 align:对齐 0 - 在转换前需要将pkt的data按字节拷贝到输入缓冲区调用memcpy需要引用string.h- 将输出数据写入文件将输出缓冲区已经转换的数据写入文件 5. 释放资源 - 还有输入输出缓冲区的释放av_freep - swr_free释放上下文 重采样上下文初始化代码 SwrContext * init_swr_context(void) {SwrContext *context NULL;// 假设已经提前知道输入音频数据的三要素的值 AV_CH_LAYOUT_STEREO, AV_SAMPLE_FMT_FLT, 44100context swr_alloc_set_opts(NULL,AV_CH_LAYOUT_STEREO,AV_SAMPLE_FMT_S16,44100,AV_CH_LAYOUT_STEREO,AV_SAMPLE_FMT_FLT,44100,0, NULL);int result swr_init(context);if (result ! 0) {char error[1024];av_make_error_string(error, 1024, result);printf(初始化重采样上下文失败%s, error);}return context; } 将采集的数据重采样后 写入文件代码 void get_audio_packet(AVFormatContext *context, void (*packet_callback)(AVPacket)) {// w 写 b 二进制 没有就创建文件FILE *f fopen(/Users/cunw/Desktop/learning/音视频学习/音视频文件/resample.pcm, wb);// 初始化重采样上下文SwrContext *swr_context init_swr_context();// 初始化转换的输入输出缓冲区uint8_t **out_buffer NULL;int linesize_out 0;av_samples_alloc_array_and_samples(out_buffer, linesize_out, 2, 512, AV_SAMPLE_FMT_S16, 0);uint8_t **in_buffer NULL;int linesize_in 0;// nb_samples 单通道采样数 4096 / (32 / 8) / 2 1024av_samples_alloc_array_and_samples(in_buffer, linesize_in, 2, 512, AV_SAMPLE_FMT_FLT, 0);AVPacket *packet av_packet_alloc();int result -1;// 循环读取设备信息// result -35 是Resource temporarily unavailable 因为获取太频繁 设备未准备好还正在处理数据sleep(1);while (((result av_read_frame(context, packet)) 0 || result -35) isRecording 1) {if (packet-size 0) {// 开始转换数据// 先将音频数据拷贝到输入缓冲区 只是重采样音频的话 只需要处理数组的第一个memcpy(in_buffer[0], packet-data, packet-size);// 再进行转换swr_convert(swr_context, out_buffer, 512, (const uint8_t **)in_buffer, 512);fwrite(out_buffer[0],linesize_out, 1, f);// 每读取一次 就清空数据包 不然数据包会一直增大av_packet_unref(packet);}}if (result ! 0) {char errors[1024];av_make_error_string(errors, 1024, result);printf(get packet occured error is \%s\ \n, errors);}// 释放重采样资源if (in_buffer) {av_freep(in_buffer[0]);}if (out_buffer) {av_freep(out_buffer[0]);}av_freep(in_buffer);av_freep(out_buffer);swr_free(swr_context);// 将缓冲区剩余的数据 强制写入文件fflush(f);fclose(f);// 释放packet空间av_packet_free(packet);} ffmpeg 音频数据编码 本文福利 免费领取C音视频学习资料包学习路线大纲、技术视频/代码内容包括音视频开发面试题FFmpeg webRTC rtmp hls rtsp ffplay 编解码推拉流srs有需要的可以进企鹅裙927239107领取哦~ 在使用fdk_aac编码器的时候由于默认的ffmpeg有自带的aac所以通过avcodec_find_encoder_by_name(libfdk_aac)就获取不到。在编译的时候加上--enable-libfdk-aac。注意重新编译安装ffmpeg之前最好先删掉之前的ffmpeg然后更新项目中的动态库 如果还不行试试单独下载安装[fdk_aac](https://www.linuxfromscratch.org/blfs/view/svn/multimedia/fdk-aac.html)再重新编译ffmpeg 创建编码器 avcodec avcodec_find_encoder 一种通过名字查找 一种是通过id查找id的查找方式只会找默认的编码器比如aac如果是fdkaac就需要通过名字查找AV_CODEC_ID_AAC | opus 其他编码器libfdk_aac aac默认的规格是AAC LC创建上下文 avcodexcontext 设置音频三要素avcodec_alloc_context3 3表示第三个版本sample_fmt av_sample_FMT_S16 aac编码器不支持flt 32位chnnel_layout AV_CH_LAYOUT_STEREO 或者chanels 2sample_rate 44100bit_rate 64000; KB 码率可选设置profile FF_PROFILE_AAC_HE_V2; 只有bit_rate0 才有用 可选设置设置编码器规格 打开编码器avcodex_opne2 2表示第二个版本 送数据给编码器时编码器内部有一个缓冲区缓冲一部分数据后才进行编码 编码用AVFrame包装未编码的数据相当于是个输入用AVPacket包装已编码的数据相当于是个输出调用avcodec_send_frame 将avframe缓冲区的数据发送给编码器如果返回值大于0就表示数据成功发送到了编码器接着就可以通过循环使用 avcodec_receive_packet读取编码好的数据到AVPacket并写入文件中如果读取的结果是AVERROR(EAGIN)或者是AVERROR_EOF就停止读取如果是其他的负数就停止编码av_frame_alloc 堆区初始化frame设置frame的nb_samples 单通道一个数据帧采样数 512 format 每个采样的大小 av_sample_fmt_s16channel_layout 声道 av_ch_layout_stereoav_frame_get_buffer 分配frame里面buffer的大小还要判断frame的buffer是否分配成功将重采样后的数据memcpy到frame-data中再将frame中的数据塞到编码器上下文中 avcodec_send_frame该函数会返回一个int 当结果0的时候表明有数据已经在编码缓冲区了avcodec_receive_packet 读取编码好的数据 avpacketav_packet_alloc 分配编码后的数据空间因为编码器上下文中有一个缓冲区其中会缓存多个frame因此并不是每塞一个frame就会有一个packet出来所以需要通过一个while循环判断编码器的数据是否0,再通过avcodec_receive_packet获取packet该函数也会返回一个int如果返回值0表明获取成功如果失败直接退出编码这个值返回值还有其他含义需要判断eagain 表明编码器没有数据了或者是有数据但是不够编码 这个eagain需要用AVERROR包装成一个负数表明数据还没准备好 averror_eof 表明一点数据都没有了最后将数据编码后的数据写入到文件pkt-data,数据格式就是aac了在停止录制的时候由于编码的缓存区可能还有数据在最后关闭之前再去取一遍编码数据放入文件 释放资源 在结束的时候释放frameav_frame_free 和packetav_packet_frame 编码实战代码 1. 创建fdk_aac编码器及上下文 AVCodecContext* init_codec_context(void) {// 创建aac编码器AVCodec *codec avcodec_find_encoder_by_name(libfdk_aac);// 初始化上下文AVCodecContext *context NULL;context avcodec_alloc_context3(codec);context-sample_fmt AV_SAMPLE_FMT_S16;context-sample_rate 44100;context-channel_layout AV_CH_LAYOUT_STEREO;context-bit_rate 0;// bitrate 0 才会生效context-profile FF_PROFILE_AAC_HE_V2;int result avcodec_open2(context, codec, NULL);if (result 0) {char error[1024];av_make_error_string(error, 1024, result);av_log(NULL, AV_LOG_DEBUG, 创建AAC编码器失败%s,error);}return context;} 2. 创建输入缓冲区 AVFrame* create_audio_input_frame(void) {AVFrame *codec_frame NULL;codec_frame av_frame_alloc();codec_frame-nb_samples 512;codec_frame-channel_layout AV_CH_LAYOUT_STEREO;codec_frame-format AV_SAMPLE_FMT_S16;int buffer_result av_frame_get_buffer(codec_frame, 0);if (buffer_result 0) {char error[1024];av_make_error_string(error, 1024, buffer_result);printf(frame 缓冲区分配失败%s, error);}return codec_frame; } 3. 开始编码并写入文件 void audio_encode(AVCodecContext *ctx, AVFrame *frame, AVPacket *packet, FILE *fl) {// 将数据送入编码器int codec_result avcodec_send_frame(ctx, frame);while (codec_result 0) {// 从packet中循环读取编码好的数据codec_result avcodec_receive_packet(ctx, packet);if (codec_result AVERROR(EAGAIN) || codec_result AVERROR_EOF) {break;} else if (codec_result 0) {char error[1024];av_make_error_string(error, 1024, codec_result);printf(编码器出错%s 停止编码, error);} else {fwrite(packet-data, 1,packet-size, fl);}}if (codec_result 0) {char error[1024];av_make_error_string(error, 1024, codec_result);printf(将数据送入编码器错误 %s\n,error);} } 4. 调用 先将重采样的数据放入avframe的缓冲区中 memcpy(codec_frame-data[0], out_buffer[0], linesize_out); 再开始编码 audio_encode(codec_context, codec_frame, codec_packet, f);总览 void get_audio_packet(AVFormatContext *context, void (*packet_callback)(AVPacket)) {// w 写 b 二进制 没有就创建文件FILE *f fopen(/Users/cunw/Desktop/learning/音视频学习/音视频文件/encoder.aac, wb);// 创建编码器上下文AVCodecContext *codec_context init_codec_context();// 初始化输入缓冲区 AVframeAVFrame *codec_frame create_audio_input_frame();// 初始化编码输出缓冲区AVPacket *codec_packet av_packet_alloc();// 初始化重采样上下文SwrContext *swr_context init_swr_context();// 初始化重采样的缓冲区uint8_t **out_buffer NULL;int linesize_out 0;uint8_t **in_buffer NULL;int linesize_in 0;init_resammple_buffer(in_buffer, linesize_in, out_buffer, linesize_out);AVPacket *packet av_packet_alloc();int result -1;// 循环读取设备信息while (isRecording 1) {result av_read_frame(context, packet);if (packet-size 0 result 0) {packet_callback(*packet);// 开始转换数据// 先将音频数据拷贝到输入缓冲区 只是重采样音频的话 只需要处理数组的第一个memcpy(in_buffer[0], packet-data, packet-size);// 再进行转换swr_convert(swr_context, out_buffer, 512, (const uint8_t **)in_buffer, 512);// 将重采样好的数据按字节拷贝到frame缓冲区memcpy(codec_frame-data[0], out_buffer[0], linesize_out);audio_encode(codec_context, codec_frame, codec_packet, f);// 每读取一次 就清空数据包 不然数据包会一直增大av_packet_unref(packet);} else if (result -EAGAIN) {// result -35 是Resource temporarily unavailable 因为设备未准备好还正在处理数据av_usleep(1);}}// 把缓冲区剩余的数据拿出来编码audio_encode(codec_context, NULL, codec_packet, f);if (result ! 0) {char errors[1024];av_make_error_string(errors, 1024, result);printf(get packet occured error is \%s\ \n, errors);}// 释放重采样资源if (in_buffer) {av_freep(in_buffer[0]);}if (out_buffer) {av_freep(out_buffer[0]);}av_freep(in_buffer);av_freep(out_buffer);swr_free(swr_context);av_frame_free(codec_frame);av_packet_free(codec_packet);// 将缓冲区剩余的数据 强制写入文件fflush(f);fclose(f);// 释放packet空间av_packet_free(packet);}
http://www.zqtcl.cn/news/458799/

相关文章:

  • 网站建设框架构建正规的app网站开发
  • 离退休工作网站建设方案wordpress在线浏览pdf
  • 昆明免费网站制作wordpress自定义路由
  • html5视频网站开发江西响应式网站制作
  • 网站照片加水印家装公司十大口碑排名
  • 做网站还有用PHP网站开发如何建立vip
  • 东莞广告公司东莞网站建设辽宁城乡建设部网站
  • 公司网站开发详细流程php网站开发优点
  • 广东网站建设多少钱比较大气的网站
  • asp.net怎么做登录网站网站建设服务网络服务
  • 网站备案级别做公司网站要多少钱
  • 湛江网站seo网站定制排名
  • 为什么网站之有首页被收录企业网站发布图片文章
  • 做网站要准备内蒙做网站
  • 邯郸市搞网站服务务的吗网站建设怎么在图片上加字
  • 卡片风格网站我想做跑腿网站怎么做
  • 公司网站建设前期情况说明如何找厂家地址
  • 超值的郑州网站建设wordpress 移除 新闻
  • 长春网络营销网站徐州手机模板建站
  • 微网站开发+在线商城建设局招标网站
  • 网站开发的基本过程关岭做网站
  • 高端网站哪种好WordPress媒体库丢失
  • 澄迈网站新闻建设宣传视频
  • 南昌优化网站排名公司建设网站的步骤
  • 一个人做网站wordpress如何加链接
  • 查网站服务器所在地笔记本电脑安装wordpress
  • 石家庄网站推广专家php网站分类目录源码
  • 盐城市城乡建设局门户网站低代码开发软件
  • 网站建设中的html深圳建设网站需要多少钱
  • 南阳公司网站制作品牌推广工作内容