数据专栏

智能大数据搬运工,你想要的我们都有

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

HDC调试需求开发(15万预算),能者速来!>>>
INTEGER可以用来存储一个有符号的整数,范围从-2147483648 到 2147483647, 或者一个无符号的整数,范围从 0到 4294967295 。
如何指定数据类型为无符号整数呢?
UINTEGER?
技术问答
2015-04-19 19:52:00
HDC调试需求开发(15万预算),能者速来!>>>
如题,一直没有用过消息队列,现在经常需要内部各个系统之间通信。经过一番查找资料,觉得MQ非常合适。但是没有在生产环境的示例,不知道如何下手。。
想请教各位大神,你们的系统中MQ是如何使用的。
是下载activeMQ/rabbitMq 配置好参数,直接使用?
或者经过封装,如果封装,应该怎么封装法呢?
求各位大神给个思路!
技术问答
2018-01-09 11:25:00
HDC调试需求开发(15万预算),能者速来!>>>
遇到的问题:我希望是服务器完全启动完毕后activemq才开始接受消息处理。

但是,用spring配置activemq,spring文件一旦初始化。activemq就开始接收消息处理了
技术问答
2018-01-05 18:13:00
HDC调试需求开发(15万预算),能者速来!>>>
描述:
使用的是spring boot框架。单个系统,假设叫做 系统B (系统内部)使用active mq 生产者、消费者都是正常的已经实现。现在有其他系统的时候,怎么调用。比如A系统是生产者,想要把消息发送给系统B。让B来消费。这种怎么实现?
技术问答
2017-11-14 14:50:00
HDC调试需求开发(15万预算),能者速来!>>> 最近在研究activeMQ,我们项目使用的有MQ消息传递。需要定时清理没有消费者的,但是未消费消息不为0的数据,因为没有消费者消费这些消息,还有可能会往这个队列上发数据,研究几天无果,求大神帮助
技术问答
2015-08-18 16:00:00
HDC调试需求开发(15万预算),能者速来!>>>
现在是在注解中配置队列,如何在配置文件中配置。然后注解中直接引用?
技术问答
2017-10-20 17:14:00
HDC调试需求开发(15万预算),能者速来!>>>
大佬们,请教下ffmpeg是如何做多平台适配的?
技术问答
2020-08-18 09:30:00
HDC调试需求开发(15万预算),能者速来!>>>
命令推拉失败
##ffmpeg -i http://xxxx/1/live.m3u8 -f flv -y rtmp://127.0.0.1:9006/live/xxxx
命令推拉成功
##ffmpeg -i http://xxxx/1/live.m3u8 -c copy -f flv -y rtmp://127.0.0.1:9006/live/xxxx
求助各位大佬,有人知道怎么回事吗?第一个命令刚开始是可以执行的,但是执行过几个之后,就不再推送(上传)数据,变成下面这样
`frame= 0 fps=0.0 q=0.0 Lsize= 0kB time=00:00:00.00 bitrate=N/A dup=0 drop=1020 speed= 0x`
用第二个的确可以成功,但是这样就不能调整分辨率,比特率等等调节画面的属性了。
技术问答
2019-01-14 17:40:00
HDC调试需求开发(15万预算),能者速来!>>>
下面是使用ffmpeg对rtsp流进行录像的代码,程序运行后,内存一直不停的往上涨,网上查过都说是内存泄露造成的,可是具体哪里泄露了,折腾好久了没找到原因。哪位熟悉ffmpeg的仁兄,帮忙看看,谢过! void saveRtsp() { AVFormatContext *pFormatCtx = nullptr; // FFMPEG所有的操作都要通过这个AVFormatContext来进行 AVCodecContext *pCodecCtx = nullptr; AVCodec *pCodec = nullptr; AVFrame *pFrame = nullptr, *pFrameRGB = nullptr; AVPacket *packet = nullptr; uint8_t *out_buffer = nullptr; struct SwsContext *img_convert_ctx = nullptr; AVDictionary *avdic = nullptr; AVDictionary *params = nullptr; int videoStream, numBytes; long start = 0, finish = 0; int frames = 0; // 保存的packet数量 // 初始化 avformat_network_init(); // 初始化FFmpeg网络模块 av_register_all(); // 初始化FFMPEG 调用了这个才能正常适用编码器和解码器 pFormatCtx = avformat_alloc_context(); // 分配一个AVFormatContext,查找用于输入的设备 av_dict_set(&avdic, "rtsp_transport", "tcp", 0); av_dict_set(&avdic, "max_delay", "100", 0); //av_dict_set(&avdic, "probesize", "32000000", 0); av_dict_set(&avdic, "max_analyze_duration", "1000", 0); av_dict_set(&avdic, "buffer_size", "1024000", 0); av_dict_set(&avdic, "stimeout", "2000000", 0); // 如果没有设置stimeout if (avformat_open_input(&pFormatCtx, rtspMain.c_str(), NULL, &avdic) != 0) { cout<<"打不开视频,请检查路径是否正确:"<nb_streams; i++) { if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) { videoStream = i; break; } } if (videoStream == -1) { cout<<"无法播放,找不到视频流:"<streams[videoStream]->codecpar); pCodec = avcodec_find_decoder(pCodecCtx->codec_id); //指向AVCodec的指针.查找解码器 pCodecCtx->bit_rate = 0; // 初始化为0 pCodecCtx->time_base.num = 1; // 下面两行:一秒钟25帧 pCodecCtx->time_base.den = 25; pCodecCtx->frame_number = 1; // 每包一个视频帧 if (pCodec == NULL) { cout<<"无法播放,找不到解码器:"<codec_id == AV_CODEC_ID_H264) { av_dict_set(¶ms, "preset", "superfast", 0); av_dict_set(¶ms, "tune", "zerolatency", 0); } else if(pCodecCtx->codec_id == AV_CODEC_ID_H265) { av_dict_set(¶ms, "x265-params", "qp=20", 0); av_dict_set(¶ms, "preset", "ultrafast", 0); av_dict_set(¶ms, "tune", "zero-latency", 0); } // 打开解码器 if (avcodec_open2(pCodecCtx, pCodec, ¶ms) < 0) { cout<<"无法播放,无法打开解码器:"<width, pCodecCtx->height, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height, AV_PIX_FMT_RGB32, SWS_BICUBIC, NULL, NULL, NULL); numBytes = avpicture_get_size(AV_PIX_FMT_RGB32, pCodecCtx->width, pCodecCtx->height); out_buffer = (uint8_t *) av_malloc(numBytes * sizeof(uint8_t)); avpicture_fill((AVPicture *) pFrameRGB, out_buffer, AV_PIX_FMT_RGB32, pCodecCtx->width, pCodecCtx->height); int y_size = pCodecCtx->width * pCodecCtx->height; packet = (AVPacket *) malloc(sizeof(AVPacket)); // 分配一个packet //av_new_packet(packet, y_size); // 分配packet的数据 av_init_packet(packet); cout<stream_index == videoStream) { frames++; //fwrite(packet->data, 1, packet->size, fpSave); // 写数据到文件中 } av_packet_unref(packet); av_free_packet(packet); } end: if(packet) { av_packet_unref(packet); av_free_packet(packet); } if(avdic) av_free(avdic); if(params) av_free(params); sws_freeContext(img_convert_ctx); av_free(out_buffer); av_frame_free(&pFrameRGB); av_frame_free(&pFrame); avcodec_close(pCodecCtx); avcodec_free_context(&pCodecCtx); avformat_free_context(pFormatCtx); }
技术问答
2019-01-10 11:39:00
HDC调试需求开发(15万预算),能者速来!>>>
@却又让幽兰枯萎 你好,想跟你请教个问题:我是海康的摄像头,地址如下: ffmpeg -i "rtsp://admin:EUEZAD@192.168.2.12:554/h264/ch1/sub/av_stream" -q 0 -f mpegts -codec:v mpeg1video -s 1366x768 http://127.0.0.1:8081/supersecret
现在出现下面的错误,望大神指点,MPEG-1/2 does not support 15/1 fps
Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height
技术问答
2019-06-06 18:32:00
HDC调试需求开发(15万预算),能者速来!>>>
目前有个项目需要实现把海康的摄像头集中起来在网页中,去在网页中去实现海康自己的程序所能实现的功能,对摄像头录像的实时播放,回话,有云台的控制,这些都移植到网页上,摄像头和浏览器都是在一个局域网,暂不考虑远程访问,要求能同时100路访问,我现在是猜想,手里还没拿到硬件,还没办法做实验,
猜想是这样子的,摄像头取流都用rtsp协议取流,直接在网页上进行播放。下面rtsp举例内容来源于网络搜索。。 【海康威视】举例说明: 主码流取流: rtsp://admin:12345@192.0.0.64:554/h264/ch1/main/av_stream 子码流取流: rtsp://admin:12345@192.0.0.64:554/h264/ch1/sub/av_stream 如果摄像机密码是a12345678,IP是192.168.1.64,RTSP端口默认554未做改动,是H.264编码,那么 主码流取流: rtsp://admin:a12345678@192.168.1.64:554/h264/ch1/main/av_stream 子码流取流: rtsp://admin:a12345678@192.168.1.64:554/h264/ch1/sub/av_stream 【如果是H.265编码的,那么将H.264替换成H.265即可】
在网页上用9个播放器,播放rtsp流,用来组成画面墙,

至于控制这块,海康提供的有SDK,网页上提供对应的按钮,后台JAVA程序来调用对应的接口来控制设备。
不知道这样的技术方案,是否能满足?如果不满足,应该用什么技术来实现把海康摄像头移植到网页上去播放,
我看了有好多用ffmpeg去做,取流后再做流服务器,这种方法来做直播,这样如果有100台被访问,是不是需要有100个ffmpeg线程在跑,那服务器需要多大配置才能满足呢?
还有,用户那边开了一个窗口后,后台开启Ffmpeg后,用户看了一会又关了,怎么管理这些后台开启的ffmpeg?
一脸懵,从来没做过类似的东西,现在硬着头再啃这块东西,希望做过的朋友能帮忙给点意见。。。
技术问答
2019-10-13 08:57:00
HDC调试需求开发(15万预算),能者速来!>>>
我使用ffmpeg 切好的视频文件,vlc 播放器加装m3u8 可以播放,但是没法在Safari里面播放,
ffmpeg -i install.mp4 -acodec libvo_aacenc -vcodec libx264 -s 720x480 -hls_time 10 -hls_list_size 10000 playlist.m3u8

切好的m3u8
#EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:17 #EXT-X-MEDIA-SEQUENCE:0 #EXTINF:15.166667, playlist0.ts #EXTINF:8.333333, playlist1.ts #EXTINF:8.333333, playlist2.ts #EXTINF:8.333333, playlist3.ts #EXTINF:16.666667, playlist4.ts #EXTINF:7.733333, playlist5.ts #EXTINF:8.333333, playlist6.ts #EXTINF:8.333333, playlist7.ts #EXTINF:16.666667, playlist8.ts #EXTINF:8.333333, playlist9.ts #EXTINF:8.333333, playlist10.ts #EXTINF:8.333333, playlist11.ts #EXTINF:8.333333, playlist12.ts #EXTINF:16.666667, playlist13.ts #EXTINF:8.333333, playlist14.ts #EXTINF:8.333333, playlist15.ts #EXTINF:8.333333, playlist16.ts #EXTINF:9.466667, playlist17.ts #EXTINF:6.700000, playlist18.ts #EXT-X-ENDLIST

刚接触流媒体 这块 ,还请大家指点一下
技术问答
2014-12-18 10:07:00
HDC调试需求开发(15万预算),能者速来!>>>
本人利用业余时间写了一个简单的播放器, 已开源, 见 https://github.com/Jackarain/avplayer
在release目录下, 可以下载可执行程序, 目前暂时只支持windows平台, 希望有兴趣的朋友一起参与开发.
技术问答
2012-03-28 12:16:00
HDC调试需求开发(15万预算),能者速来!>>> ffmpeg的ffplayer程序使用过了SDL库,有用过的讲讲实际经验吧。
技术问答
2013-08-27 21:52:00
HDC调试需求开发(15万预算),能者速来!>>>
求教:ffmpeg转换视频完成之后,怎么通知调用者视频转码成功与失败呢?
技术问答
2019-03-25 12:44:00
HDC调试需求开发(15万预算),能者速来!>>>
求教:现在我的上游系统传给我m3u8格式文件,我这里需要将该文件转成mp4(通过格式),在转码成多种码率,给下游使用。
请问:java程序,linux环境(docker内)下,怎么样才能将m3u8格式转成mp4格式视频?上游系统提供了ffmepg方式,不知道ffmepg可以转不?
技术问答
2019-03-20 20:10:00
HDC调试需求开发(15万预算),能者速来!>>>
最近需要拉流,流A在国外,需要先拉到国内流B,用户去流B上面观看。
使用ffmpeg -i http://a.m3u8 -c copy b.m3u8命令拉下来后,观看b.m3u8几秒钟就卡顿一次,没办法看,但是直接在国内观看a.m3u8是不卡的,因为是买的一个,所以不能观看A.M3U8,需要类似中专或者换成一下,会的朋友告诉下,是不是参数加错了,感谢了。
技术问答
2019-03-07 23:06:00
HDC调试需求开发(15万预算),能者速来!>>> 最近做的项目需要视频转换器ffmpeg,代码和程序我都有,路径也对,可是奇怪的是我在纯javaProject的环境下运行代码,可以很顺利的将a.avi转换成a.flv,但是我把代码复制到我的web Project中时,程序不异常,运行各方面都正常,路径更是对的没话说,可是就是转换不成flv文件,凌乱了,是不是在web中还需要什么东西?为什么会这么奇怪?这是代码: package org.whhn.utils; import java.io.File; import java.util.ArrayList; import java.util.Calendar; import java.util.List; public class ConvertVideo { public static boolean process(String PATH,String relname,String shortname) { int type = checkContentType(PATH); boolean status = false; if (type == 0) { System.out.println("直接将文件转为flv文件"); status = processFLV(PATH,relname,shortname);// 直接将文件转为flv文件 } else if (type == 1) { //String avifilepath = processAVI(type); //if (avifilepath == null) return false;// avi文件没有得到 // status = processFLV(avifilepath);// 将avi转为flv } return status; } private static int checkContentType(String PATH) { String type = PATH.substring(PATH.lastIndexOf(".") + 1, PATH.length()) .toLowerCase(); // ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等) if (type.equals("avi")) { return 0; } else if (type.equals("mpg")) { return 0; } else if (type.equals("wmv")) { return 0; } else if (type.equals("3gp")) { return 0; } else if (type.equals("mov")) { return 0; } else if (type.equals("mp4")) { return 0; } else if (type.equals("asf")) { return 0; } else if (type.equals("asx")) { return 0; } else if (type.equals("flv")) { return 0; } // 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等), // 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式. else if (type.equals("wmv9")) { return 1; } else if (type.equals("rm")) { return 1; } else if (type.equals("rmvb")) { return 1; } return 9; } private static boolean checkfile(String path) { File file = new File(path); if (!file.isFile()) { return false; } return true; } // 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等), 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式. /* private static String processAVI(int type) { List commend = new ArrayList(); commend.add("d:\\ffmpeg\\mencoder"); commend.add(PATH); commend.add("-oac"); commend.add("lavc"); commend.add("-lavcopts"); commend.add("acodec=mp3:abitrate=64"); commend.add("-ovc"); commend.add("xvid"); commend.add("-xvidencopts"); commend.add("bitrate=600"); commend.add("-of"); commend.add("avi"); commend.add("-o"); commend.add("d:\\ffmpeg\\output\\b.avi"); try { ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); builder.start(); return "d:\\ffmpeg\\output\\b.avi"; } catch (Exception e) { e.printStackTrace(); return null; } } */ // ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等) private static boolean processFLV(String oldfilepath,String relname,String shortname) { System.out.println(oldfilepath); if (!checkfile(oldfilepath)) { System.out.println(oldfilepath + " is not file"); return false; } // 文件命名 Calendar c = Calendar.getInstance(); String savename = String.valueOf(c.getTimeInMillis())+ Math.round(Math.random() * 100000); List commend = new ArrayList(); commend.add("d:\\apache-tomcat-7.0.42\\webapps\\Whhn\\CuPlayer\\ffmpeg"); commend.add("-i"); commend.add(oldfilepath); commend.add("-ab"); commend.add("56"); commend.add("-ar"); commend.add("22050"); commend.add("-qscale"); commend.add("8"); commend.add("-r"); commend.add("15"); commend.add("-s"); commend.add("600x500"); commend.add("d:\\apache-tomcat-7.0.42\\webapps\\Whhn\
技术问答
2014-12-05 11:44:00
HDC调试需求开发(15万预算),能者速来!>>> http://blog.sina.com.cn/s/blog_4a424eca010005l2.html
技术问答
2008-11-30 15:09:00
HDC调试需求开发(15万预算),能者速来!>>>
系统:deepin 15.9
ffmpeg 版本:4.1
vaifo: libva info: VA-API version 1.1.0 libva info: va_getDriverName() returns 0 libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so libva info: Found init function __vaDriverInit_1_0 libva info: va_openDriver() returns 0 vainfo: VA-API version: 1.1 (libva 2.1.0) vainfo: Driver version: Intel i965 driver for Intel(R) Haswell Desktop - 2.0.0 vainfo: Supported profile and entrypoints VAProfileMPEG2Simple : VAEntrypointVLD VAProfileMPEG2Simple : VAEntrypointEncSlice VAProfileMPEG2Main : VAEntrypointVLD VAProfileMPEG2Main : VAEntrypointEncSlice VAProfileH264ConstrainedBaseline: VAEntrypointVLD VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice VAProfileH264Main : VAEntrypointVLD VAProfileH264Main : VAEntrypointEncSlice VAProfileH264High : VAEntrypointVLD VAProfileH264High : VAEntrypointEncSlice VAProfileH264MultiviewHigh : VAEntrypointVLD VAProfileH264MultiviewHigh : VAEntrypointEncSlice VAProfileH264StereoHigh : VAEntrypointVLD VAProfileH264StereoHigh : VAEntrypointEncSlice VAProfileVC1Simple : VAEntrypointVLD VAProfileVC1Main : VAEntrypointVLD VAProfileVC1Advanced : VAEntrypointVLD VAProfileNone : VAEntrypointVideoProc VAProfileJPEGBaseline : VAEntrypointVLD
小弟使用希望使用ffmpeg的vaapi进行硬解。使用sudo ./configure --disable-static --enable-shared --enable-gpl --enable-version3 --enable-vaapi来编译ffmpeg源码,源码编译成功,并成功安装。然后想运行ffmpeg官方的有关硬解的例子进行学习。故编译了官方的例子vaapip_transcode.c hw_decode.c两个例子,也都编译通过.但是在运行两个例子的出现出现如下错误:
转换到源码中查看是由于下面的回调函数出问题。即*p != AV_PIX_FMT_VAAPI static enum AVPixelFormat get_vaapi_format(AVCodecContext *ctx, const enum AVPixelFormat *pix_fmts) { const enum AVPixelFormat *p; for (p = pix_fmts; *p != AV_PIX_FMT_NONE; p++) { if (*p == AV_PIX_FMT_VAAPI) return *p; } fprintf(stderr, "Unable to decode this file using VA-API.\n"); return AV_PIX_FMT_NONE; }
技术问答
2019-02-18 19:30:00
HDC调试需求开发(15万预算),能者速来!>>>
@红薯 你好,想跟你请教个问题:我在您提示的链接: http://ffdshow.faireal.net/mirror/ffmpeg/ ,没办法打开网页下载。
技术问答
2013-10-26 17:41:00
HDC调试需求开发(15万预算),能者速来!>>>
本文来自网易云音乐音视频实验室负责人刘华平在LiveVideoStackCon 2017大会上的分享,并由LiveVideoStack根据演讲内容整理而成(本次演讲PPT文稿,请从文末附件下载)。
1、引言
大家好,我是刘华平,从毕业到现在我一直在从事音视频领域相关工作,也有一些自己的创业项目,曾为早期Google Android SDK多媒体架构的构建作出贡献。
就音频而言,无论是算法多样性,Codec种类还是音频编解码复杂程度都远远比视频要高。视频的Codec目前还主要是以宏块为处理单元,预测加变换的混合编码框架,例如H.264和H.265都是在这一框架下。而音频则相当复杂,且不同的场景必须要选择不同的音频编解码器。以下就是本次为大家分享的主要内容,希望通过此次分享可以使大家对音频编解码有一个整体的认识,并在实际应用中有参考的依据。
本次分享的内容提纲: 1)语音/音频编码总表;
2)数字语音基本要素;
3)为什么要压缩;
4)编码器考虑的因素;
5)语音经典编码模型;
6)ISO;
7)编码模型;
8)USAC;
9)编码;
10)使用选型考虑的因素。
* 本次演讲PPT文稿,请从文末附件下载!
(本文同步发布于: http://www.52im.net/thread-2230-1-1.html )
2、分享者
刘华平:
- 现为网易云音乐音视频实验室负责人,上海大学通信学院在职博士;
- 曾任掌门集团(WIFI万能钥匙)音视频技术研发总监,资深研究员;
- 行者悟空声学技术有限公司首席技术官(联合创始人);
- 阿里巴巴前高级技术专家(P8), 阿里音乐音视频部门总监;
- Visualon音频部门经理、盛大创新院研究员、Freescale 上海研发中心多媒体部门;
- 早期 Google Android SDK多媒体架构的贡献者,开源 AMR_WB 编码器工程开发者。
刘华平拥有5项技术发明专利、二十余篇专业论文和多项软件著作权,参与过浙江省杭州重大专项项目,浙江省金华科委项目,上海市科委项目(球谐域全景音频关键技术研究)。
3、系列文章
本文是系列文章中的第18篇,本系列文章的大纲如下: 《 即时通讯音视频开发(一):视频编解码之理论概述 》
《 即时通讯音视频开发(二):视频编解码之数字视频介绍 》
《 即时通讯音视频开发(三):视频编解码之编码基础 》
《 即时通讯音视频开发(四):视频编解码之预测技术介绍 》
《 即时通讯音视频开发(五):认识主流视频编码技术H.264 》
《 即时通讯音视频开发(六):如何开始音频编解码技术的学习 》
《 即时通讯音视频开发(七):音频基础及编码原理入门 》
《 即时通讯音视频开发(八):常见的实时语音通讯编码标准 》
《 即时通讯音视频开发(九):实时语音通讯的回音及回音消除概述 》
《 即时通讯音视频开发(十):实时语音通讯的回音消除技术详解 》
《 即时通讯音视频开发(十一):实时语音通讯丢包补偿技术详解 》
《 即时通讯音视频开发(十二):多人实时音视频聊天架构探讨 》
《 即时通讯音视频开发(十三):实时视频编码H.264的特点与优势 》
《 即时通讯音视频开发(十四):实时音视频数据传输协议介绍 》
《 即时通讯音视频开发(十五):聊聊P2P与实时音视频的应用情况 》
《 即时通讯音视频开发(十六):移动端实时音视频开发的几个建议 》
《 即时通讯音视频开发(十七):视频编码H.264、V8的前世今生 》
《 即时通讯音视频开发(十八):详解音频编解码的原理、演进和应用选型 》(本文)
4、语言/音频编码总表
▲ 语言/音频编码总表
上图展示的是语言/音频编码总表,可以看到其比视频编码要复杂得多,单纯的算法也远远比视频要更加复杂。
5、数字语言基本要素
数字声音具有三个要素: 1)采样率;
2)通道数;
3)量化位数。

▲ 声音数字化的过程
如上图所示,声音数字化的过程为: 1)采样:在时间轴上对信号数字化;
2)量化:在幅度轴上对信号数字化;
3)编码:按一定格式记录采样和量化后的数字数据。
6、为什么要压缩
压缩音频,主要是为了在降低带宽负担的同时为视频腾出更多带宽空间。存储和带宽二大因素决定了语音压缩的必要性。
我们看看下面的例子。
长度为4分钟,采样频率为44100Hz,采样深度为16bits,双声音Wav文件大小: 44100Hz*16bits*4minutes*2=(44100/1second)*16bits*(4minutes*(60seconds/1minutes)*2=705600bits/second*240seconds=169344000bits=169344000/(8bits/1byte)*2=42336000bytes=42336000/(1048576/1M)bytes=40.37MB
MP3,128kbps压缩后文件大小: 128kbps*4minutes=(128kbits/1second)*(4minutes*(60seconds/1minutes))=(128kbits/1second)*240seconds=30720kbits=30720kbits/(8bits/1byte)=3840kbytes=3840k/(1024k/1M)bytes=3.75Mbytes=3.75MB
正如上面的例子,声音压缩后,存储大小为原大小的十分之一,压缩率十分可观!
7、编码器考虑因素
7.1 基本概念
编码器考虑的因素: 1)最佳压缩比;
2)算法的复杂度;
3)算法延时;
4)针对特殊场景下的特定设计;
5)兼容性。
通过一些特定的压缩算法,可以压缩音频文件至原来的1/10,同时人耳也无法分辨压缩前后的声音质量差异,需要满足多种条件才能实现这种效果;而对于编码器,无论是设计阶段还是使用阶段,我们都需要考虑最佳压缩效果、算法的复杂度与算法的延时,结合特殊场景进行特定的设计;而兼容性也是我们不能不考虑的重点。
7.2 语音经典编码模型:发音模型
▲ 发音模型( 原图点击查看 )
我们的很多编解码器都是基于综合人的发音模型与一些和听觉相关的理论支持研究提出的特定编解码算法。初期我们通过研究人的发音原理来设计音频编解码的算法,包括端到端的滤波或轻浊音等,只有充分理解人的发声原理我们才能在编解码端做出有价值的优化。
【7.2.1】语音编码模型——LPC:
▲ 经典语音编码模型:LPC( 原图点击查看 )

▲ LPC 数学表达
LPC作为经典语音编码模式,其本质是一个线性预测的过程。早期的G.7系列编码模型便是通过此模型对整个语音进行编码,上图展示的过程可与之前的人发声过程进行匹配,每个环节都有一个相应的模块用来支撑人发声的过程。其中使用了AR数学模型进行线性预测,此算法也是现在很多语音编码的重要组成模块。
【7.2.2】语音编码模型——G.729:

▲经典语音编码模型: G.729(CELP)
G.729同样是经典的语音编码模型之一,也是我们学习语音编码的一个入门级Codec。G.729的文档十分完善,包括每个模块的源代码在内都可直接下载。G.729可以说是在早期发声模型基础上的改进,需要关注的性能指标是帧长与算法上的延时,包括语音质量的MOS分。G.729也有很多变种,由于语音需要考虑系统兼容性,不同的系统指定携带的Codec也不同,音频编码的复杂程度要远高于视频编码。
G.729 建议了共轭结构的算术码本激励线性预测(CS-ACELP)编码方案。G.729算法的帧长为10ms, 编码器含5ms 前瞻,算法时延15ms,语音质量MOS分可达4.0。
7.3 语音经典编码模型——听觉模型
▲ ISO编码模型:心理声学模型
除了研究人发声的原理,我们还需要研究人听声的原理,从而更好实现声音的收集与处理。一个声音信号是否能被人耳听见主要取决于声音信号的频率、强度与其他音的干扰。心理声学模型便是用来找出音频信号中存在的冗余信息从而实现在压缩声音信号的同时不影响听觉的目的。心理声学理论的成熟为感知编码系统奠定了理论基础,这里的感知编码主要是ISO编码模型,主要覆盖的声学原理有临界频带、绝对听觉阈值、频域掩蔽、时域掩蔽等。
▲ 听觉模型
无论是MP3还是AAC以至于到后面的杜比音效都是基于听觉模型进行的探索与创新。
【7.3.1】临界频带:
由于声音频率与掩蔽曲线不是线性关系,为从感知上来统一度量声音频率,引入了“临界频带”的概念。通常认为,在20Hz到16kHz范围内有24个监界频带。临界频带的单位叫Bark(巴克)。
▲ 临界频带
临界频带主要用于心理声学模型。由于声音频率与掩蔽曲线并非线性关系,为从感知上来统一度量声音频率,我们引入了“临界频带”的概念。人耳对每段的某个频率的灵敏度不同,二者关系是非线性的。通常我们会将人可以听到的整个频率也就是从20Hz到16KHz分为24个频带,可在其中进行时域或频域类的掩蔽,将一些冗余信息从编码中去除从而有效提升压缩率。
【7.3.2】绝对听觉阈值:

▲ 绝对听觉阈值
绝对听觉阈值也可有效提升压缩率,基于心理声学模型,可去除编码中的冗余部分。
7.4 经典音频编码:ISO
▲ 经典音频编码:ISO
我们可将最早的MP3 Layer1理解为第一代的ISO感知编码,随后的一些纯量化内容更多的是在压缩上进行改进而核心一直未改变。从MP3 Layer1到Layer2与Layer3,主要的改变是心理声学模型的迭代。
▲ MPEG1 LayerI Codec
▲ MPEG1 LayerIII Codec
上图展示的是Encode与Decode的回路。输入的PCM首先会经过多子带分析与频域中的心理声学模型冗余处理,而后进行量化编码;Layer III中的是我们现在常说的MP3的Codec:Encode与Decode之间的整体回路,相比于Layer1多了几个处理环节以及霍夫曼编码。
7.5 AAC协议族
▲ AAC家族
AAC与G.719一样包括很多系列,但AAC的巧妙之处在于向下兼容的特性。开始时我们就强调,所有Codec在设计时都需要考虑兼容性,瑞典的Coding Technology公司曾提出在兼容性上特别优化的方案。AAC Plus V1包括AAC与SBR,AAC Plus V2包括AAC+SBR+PS,现在常见的很多音乐类或直播音频编码都是基于AAC Plus协议族进行的。
德国的霍朗浦学院曾在AAC低延时协议扩展方面做出一些探索并得到了AAC LD协议族,其原理仍基于传统的AAC模块,但在后端会对处理长度进行调整,例如之前是以1024bit为一个处理单位,那改进后则以960bit为一个处理单位。除此之外AAC LD加入了LD-SBR与LD-MPS等,从而形成一个规模较大的AAC-ELD V2模块,可以说是十分巧妙。
【7.5.1】AACPlus核心模块——SBR(Spectral Band Replication):

▲ SBR(Spectral Band Replication)
我们可以看到,AAC可以说充分利用了频域扩展,用很小的代价实现诸多功能优化。AAC的核心之一是SBR,这是一种使用极少位数就可描述高频部分并在解码时进行特殊优化从而实现频域扩展的模块。上图展示的是不同压缩率模块所覆盖的频率取值范围,而使用AAC时需要注意一个被称为“甜点码率”的指标。无论是采样率还是码率都是变化的,在应用时选择何种码率十分关键。例如直播时采用64Kbps即可在覆盖整个频段的同时保持良好音质。
【7.5.2】AACPlus核心模块——PS(Parametric Stereo):

▲ :PS(Parametric Stereo)
PS 描述参数:IID(Inter-channel Intensity Difference),,ICC(Inter-channel Cross-Correlation),IPD(Inter-channel Phase Difference)。

▲ AACPlus v2编码框图

▲ AACPlus v2解码框图
PS模块也是AAC的核心模块之一,主要用于分析左右声道属性并使用非常少的位数表示左右声道相关性,而后在解码端将左右声道分离。这里比较巧妙的是PS的向下兼容特性,整体数据打包是分开进行的。如果获取到AAC、SBR、PS三者的基本数据包后,在解码阶段我们就只需AAC—LC。上图展示的就是AAC的解码框架,如果大家读过3GPP的代码就可发现其每一个模块都相当清楚。我们可根据文档读取代码并对应到每一个环节。
【7.5.3】甜点码率:

▲ AAC 甜点码率
甜点码率是一项很关键的指标。例如在手机直播应用场景中,一般的视频分辨率为640×360,音频码率大约在800K左右。如果音频码率过大则会直接影响视频质量,因而我们需要控制音频码率在一个较为合适的范围内从而实现最佳的音画效果。在很多应用场景中可能需要系统根据不同的网络环境下载不同音质的文件,例如在2G环境中下载较小的文件,这样做主要是为了节省带宽并提高音频文件的播放流畅程度。
7.6 AAC-ELD家族
AAC-ELD家族产生背景: aacplus v2 已经在压缩和音质方面做到了近似于极致,但由于算法实现上的长达100ms左右的延时极大的阻碍aacplus v2在实时通讯领域的应用。Fraunhofer IIS 为了解决这个问题,对AAC进行相关改进,形成了AAC-ELD协议族。
▲ AAC-ELD家族
AAC-ELD家族带来的主要改进是低延迟。如果Codec的延迟太长便无法在一些特定场景中被使用。例如早期AAC Plus V2的整体延迟可达100ms,如此高的延迟肯定无法被应用于语音通话等对实时性要求极高的应用场景。霍朗普学院推出的AAC-ELD可在保持音质的前提下将延迟降低至15ms,相对于MP3最高长达200ms的延迟而言提升巨大。
7.7 应用中端到端的延迟
▲ 端到端的延时
编解码过程也存在延时问题,这也是我们选择编解码器时需要考虑的最主要因素之一,编解码的延时主要由处理延时与算法延时组成,例如G.729的算法延时为15ms,而AAC-LC可达到一百毫秒以上。另外,播放端或采集端的长帧数量太多,播放时缓存太多等也会直接影响延时,我们在选择编解码器时需要考虑延时带来的影响。
编解码器已经历了两个发展方向:
1)一个是以G.7(G.729)为例,根据发声模型设计的一套主要集中于语音方面的编解码算法;
2)另一个是以ISO的MP3和AAC为例,根据心理声学模型设计的一套感知编码。
最近的趋势是编码的统一: 原来在语音场景下我们使用8K或16K进行采样,音乐场景下则需使用覆盖到全频带的44.1K进行采样,每个Codec都有一个频域覆盖的范围。在之前的开发中,如果应用场景仅针对压缩语音那么需要选择语音编码方案,如果应用场景针对压缩音乐则需要选择音乐编码方案,而现在的发展方向是通过一套编码从容应对语音与音乐两个应用场景,这就是接下来将要被提到的USAC。
这里介绍两个比较典型的Codec:
1)一个是Opus,通过其中集成的模块可实现根据传入音频文件的采样率等属性自动选择语音编码或音乐编码;
2)另一个是EVS这也是霍朗普等组织推行的方案,已经尝试用于4G或5G之中。
EVS (Enhanced Voice Services): 主要是VoiceAge, Dolby, Fraunhofer, 华为联合开发的USAC编码器,低速率音乐编码质量很好。

▲ USAC
由框图我们可以了解到USAC向下兼容的特性。
编解码器可总结为经历了三个时代: 1)发声模型;
2)听觉感知;
3)融合方案。
接下来我将展示目前所有的Codec情况并整理为表格以方便大家检索查阅。
8、解码器(Codec)总结
8.1 IETF系列
IETF作为标准协议联盟组织之一推出了以上Codec:Opus包括采样率为8kHz、甜点码率为11kbps的窄带单声语音(SILK),采样率为16kHz、甜点码率为20kbps的宽带单声语音与采样率为48kHz、甜点码率为32kbps的全带单声语音(CELT),采用甜点码率意味着将压缩率和音质保持在一个良好的平衡状态。在一些窄带单声语音应用场景例如常见的微信语音聊天,其压缩率可达到原来的8.5%。Opus没有技术专利和源代码的门槛,使得其受到现在很多流媒体厂商的欢迎,Opus支持更广的码率范围,具备丰富采样率选择,可实现极低延迟与可变帧大小,也具备以往一些Codec的许多特性如CBR、VBR、动态调整等,支持的通道数量也更多。除此之外,Opus同样具备许多从SILK移植而来的特性或功能。如在VUIB传输上集成了扛丢包模式等。
iLBC早在SILK未出现时就被提出同样具备抗丢包。的特性,高达15.2kbps的甜点码率与4.14的Mos使其音质较为良好,超过G.729的相关指标;GSM就是最早手机网络仍停留在2G时代时流行的编码形式,主要用于蜂窝电话的编码任务。
8.2 AMR系列
AMR早在3G时期就被广泛应用,AMR-NB是最流行的语音编码器,具有压缩效果好,支持多种码率形式的特点;与此同时,这也是GSM与3G时期Android平台最早支持的窄带语音编码方案。AMR-WB作为AMR-NB向宽带的扩展版,主要用于3G和4G通话标准协议中,其甜点码率为12.65kbps。在实践中我们将码率参数调整为此值即可实现压缩率与质量的平衡。AMR-WB+则是上述两者的融合,三者共同构成AMR系列。
8.3 ITU-T G系列
ITU-T G系列包括最早的波形编码G711到现在大家熟悉的G.729这里我想强调的是G722.1 Siren7、G722.1c Siren14与G719 Siren22,例如G.719可覆盖整个前频带且支持立体声。即使都属于老协议,但由于其优秀的兼容性,不应被我们忽略。

将Opus与其他一些Codec进行对比我们可以看到,无论是质量还是延时控制,Opus的优势十分明显;加之Opus作为开源的免费方案,不存在专利限制,受到业界追捧也不足为奇。
8.4 ISO系列
ISO里我想强调的是MP3与AAC,二者同样支持很多码率。MP3的甜点码率为128kbps,MP3 Pro的码率可达到MP3的一半;AAC支持8~96khz的采样率,AAC-LC的甜点码率为96kbps,HE-AAC的甜点码率为32kbps,AAC-LD与ELD做到了AAC的低延时,实现了延时与压缩比的最佳平衡。
8.5 3GPP系列:EVRC
EVRC 是CDMA 中使用的语音编解码器,由高通公司1995年提出目标是取代QCELP。
高通公司主推的3GPP是CDMA中使用的语音编解码器,在未来选择编解码器类型时我们需要特别考虑延时与帧长。由于语音编码种类很多,帧长也是复杂多变的,其背后的算法复杂程度,RAM、ROM占用等都是在实践当中需要着重考虑的。
8.6 极低码率
极低码率主要的应用场景是对讲机、卫星通讯、军工等。
上图图表中的MELP最早由美国军方开发,现在绝大多数的对讲机都基于此模型进行扩展开发,压缩后的码率可达到2.4kbps而目前最极端的极低码率可实现300bps,相当于压缩为原数据的0.2%,此时的音频文件仅能被用于传达语音内容而丢失了很多声色。
8.7 全频带
全频带中的组合也是多种多样。
9、编解码使用注意
9.1 License
▲ 开源项目常用的Lisence
国内大部分企业在开发时容易忽视包括专利安全性在内的与License相关的内容。如果企业计划得比较长远,需要长期使用某项技术或企业规模不断扩大时则不能不考虑专利问题。专利费用包括Open Source与算法专利,二者完全独立互不干涉,如果我们从某家专利公司购买了AAC的专利算法,并不能获得此AAC专利的源代码,仅能获得与此技术相关的专利使用授权。专利公司会给予需要下载的文件列表,通过这种方式实现技术的授权使用。
▲ 一张图看懂Lisence(来自: 阮一峰的博客 )
上面的二叉树图比较清晰地展示了代码授权的具体流程,随着企业的规模化发展日趋成熟,企业应当规范自身的技术使用行为,尽可能避免专利纠纷带来的不利影响。
9.2 专利
▲ 2个著名的多媒体技术专利池
主流语音编解码技术拥有两个专利池: 1)MPEG-LA;
2)Via Licensing。
很多非常复杂的Codec涉及高达上千个专利,与之相关的企业或组织多达几十个,为专利授权而与每一个企业或组织进行洽谈显然是不现实的,因而专利池的出现使得技术授权更加规范清晰,方便企业统一处理技术授权问题。
9.3 常见Codec Patent License

希望大家在使用技术的同时尊重知识产权,助力技术创新可持续发展。
10、讲稿PPT下载
(因无法上传附件,请从原文附件下载: http://www.52im.net/thread-2230-1-1.html )
附录:更多音视频技术资料 [1] 实时音视频开发的其它精华资料:
《 实时语音聊天中的音频处理与编码压缩技术简述 》
《 网易视频云技术分享:音频处理与压缩技术快速入门 》
《 学习RFC3550:RTP/RTCP实时传输协议基础知识 》
《 基于RTMP数据传输协议的实时流媒体技术研究(论文全文) 》
《 声网架构师谈实时音视频云的实现难点(视频采访) 》
《 浅谈开发实时视频直播平台的技术要点 》
《 还在靠“喂喂喂”测试实时语音通话质量?本文教你科学的评测方法! 》
《 实现延迟低于500毫秒的1080P实时音视频直播的实践分享 》
《 移动端实时视频直播技术实践:如何做到实时秒开、流畅不卡 》
《 如何用最简单的方法测试你的实时音视频方案 》
《 技术揭秘:支持百万级粉丝互动的Facebook实时视频直播 》
《 简述实时音视频聊天中端到端加密(E2EE)的工作原理 》
《 移动端实时音视频直播技术详解(一):开篇 》
《 移动端实时音视频直播技术详解(二):采集 》
《 移动端实时音视频直播技术详解(三):处理 》
《 移动端实时音视频直播技术详解(四):编码和封装 》
《 移动端实时音视频直播技术详解(五):推流和传输 》
《 移动端实时音视频直播技术详解(六):延迟优化 》
《 理论联系实际:实现一个简单地基于HTML5的实时视频直播 》
《 IM实时音视频聊天时的回声消除技术详解 》
《 浅谈实时音视频直播中直接影响用户体验的几项关键技术指标 》
《 如何优化传输机制来实现实时音视频的超低延迟? 》
《 首次披露:快手是如何做到百万观众同场看直播仍能秒开且不卡顿的? 》
《 Android直播入门实践:动手搭建一套简单的直播系统 》
《 网易云信实时视频直播在TCP数据传输层的一些优化思路 》
《 实时音视频聊天技术分享:面向不可靠网络的抗丢包编解码器 》
《 P2P技术如何将实时视频直播带宽降低75%? 》
《 专访微信视频技术负责人:微信实时视频聊天技术的演进 》
《 腾讯音视频实验室:使用AI黑科技实现超低码率的高清实时视频聊天 》
《 微信团队分享:微信每日亿次实时音视频聊天背后的技术解密 》
《 近期大热的实时直播答题系统的实现思路与技术难点分享 》
《 福利贴:最全实时音视频开发要用到的开源工程汇总 》
《 七牛云技术分享:使用QUIC协议实现实时视频直播0卡顿! 》
《 实时音视频聊天中超低延迟架构的思考与技术实践 》
《 理解实时音视频聊天中的延时问题一篇就够 》
《 实时视频直播客户端技术盘点:Native、HTML5、WebRTC、微信小程序 》
《 写给小白的实时音视频技术入门提纲 》
《 微信多媒体团队访谈:音视频开发的学习、微信的音视频技术和挑战等 》
《 腾讯技术分享:微信小程序音视频技术背后的故事 》
《 微信多媒体团队梁俊斌访谈:聊一聊我所了解的音视频技术 》
《 新浪微博技术分享:微博短视频服务的优化实践之路 》
《 实时音频的混音在视频直播应用中的技术原理和实践总结 》
《 以网游服务端的网络接入层设计为例,理解实时通信的技术挑战 》
《 腾讯技术分享:微信小程序音视频与WebRTC互通的技术思路和实践 》
《 新浪微博技术分享:微博实时直播答题的百万高并发架构实践 》
《 技术干货:实时视频直播首屏耗时400ms内的优化实践 》
>> 更多同类文章 ……
[2] 开源实时音视频技术WebRTC的文章:
《 开源实时音视频技术WebRTC的现状 》
《 简述开源实时音视频技术WebRTC的优缺点 》
《 访谈WebRTC标准之父:WebRTC的过去、现在和未来 》
《 良心分享:WebRTC 零基础开发者教程(中文)[附件下载] 》
《 WebRTC实时音视频技术的整体架构介绍 》
《 新手入门:到底什么是WebRTC服务器,以及它是如何联接通话的? 》
《 WebRTC实时音视频技术基础:基本架构和协议栈 》
《 浅谈开发实时视频直播平台的技术要点 》
《 [观点] WebRTC应该选择H.264视频编码的四大理由 》
《 基于开源WebRTC开发实时音视频靠谱吗?第3方SDK有哪些? 》
《 开源实时音视频技术WebRTC中RTP/RTCP数据传输协议的应用 》
《 简述实时音视频聊天中端到端加密(E2EE)的工作原理 》
《 实时通信RTC技术栈之:视频编解码 》
《 开源实时音视频技术WebRTC在Windows下的简明编译教程 》
《 网页端实时音视频技术WebRTC:看起来很美,但离生产应用还有多少坑要填? 》
《 了不起的WebRTC:生态日趋完善,或将实时音视频技术白菜化 》
《 腾讯技术分享:微信小程序音视频与WebRTC互通的技术思路和实践 》
>> 更多同类文章 ……
(本文同步发布于: http://www.52im.net/thread-2230-1-1.html )
技术问答
2019-01-18 22:03:00
HDC调试需求开发(15万预算),能者速来!>>>
环境:Windows64 + Nginx的-RTMP静态+ ffmpeg的静态+ Java1.8
我想使用Ffmpeg将视频流从HLS流转换成RTMP。刚开始几个流是正常的,但是当我打开更多的流时,它正常看似运行,但没有视频数据拉动和推送。 本来以为是流量上限的问题结果,即使我重新启动rtmp服务器也没用。
命令 ffmpeg -i xxx/live.m3u8 -vcodec h264-s 720*480 -an -f flv -y rtmp://xxx
控制台:
技术问答
2019-01-08 11:22:00
HDC调试需求开发(15万预算),能者速来!>>>
由于场景问题,暂时无法使用注解@JSONField, fastjson中还有什么方式可以根据自己定义的注解个性化定义字段格式? 看了源代码,序列化时可以通过NameFilter实现,反序列化时ExtraProcessor需要处理各种类型的反射。不知道Fastjson是否提供类似于gson的FieldNameStrategy接口 ,可以方便自定义字段格式的。
技术问答
2020-03-11 12:46:09
HDC调试需求开发(15万预算),能者速来!>>>
前台输入框输入多个?,后台实体类取出来的数据变成???jQuery224007647298358178567_1573798292433?
技术问答
2019-11-15 14:21:00
HDC调试需求开发(15万预算),能者速来!>>>
fastjson反序列化一个json字符串(比较大),json字符串带中文乱,导致cpu飙升,有人遇到过吗?
技术问答
2019-10-31 17:14:00
HDC调试需求开发(15万预算),能者速来!>>>
@温少
fastJson 对于 Map的 features 指定是无效的吧?
比如,我在 features 指定了,WriteNullStringAsEmpty,经测试无效,fastjson使用的是最新版本。
Map jsonMap = new HashMap();
jsonMap.put("a", 1);
jsonMap.put("b", "");
jsonMap.put("c", null);
jsonMap.put("d", "wuzhuti.cn");

String str = JSONObject.toJSONString(jsonMap, features);
System.out.println(str);

private static final SerializerFeature[] features = { SerializerFeature.SortField,//排序字段
SerializerFeature.WriteMapNullValue, // 输出空置字段
SerializerFeature.WriteNullListAsEmpty, // list字段如果为null,输出为[],而不是null
SerializerFeature.WriteNullNumberAsZero, // 数值字段如果为null,输出为0,而不是null
SerializerFeature.WriteNullBooleanAsFalse, // Boolean字段如果为null,输出为false,而不是null
SerializerFeature.WriteNullStringAsEmpty // 字符类型字段如果为null,输出为"",而不是null
};
技术问答
2016-08-24 22:20:00
HDC调试需求开发(15万预算),能者速来!>>>
@wenshao 你好,向你请教一个问题:
我有一个List,里面的元素都引用了同一个对象实例,在toJsonString后,拿到的数据里除了第一个的引用是完整的数据外,其他的都是 $.data[0].xxx 这样的,有没有什么feature是可以让这个 引用 变成完整的数据?比如做成这样:
JSON.toJSONString(list, Features.cloneAndReplaceRef)
即,把这些引用的地方都替换成引用源的JSON拷贝。
技术问答
2013-10-30 11:05:00
HDC调试需求开发(15万预算),能者速来!>>>
com.alibaba.fastjson.JSONException: syntax error, pos 6, json :

代码写了 ,但是报错了
JSONObject querySql = JSON.parseArray(ccont).getJSONObject(0).getJSONObject("reader")
.getJSONObject("parameter").getJSONObject("querySql");;


要解析的json是 [{"reader":{"parameter":{"querySql":"SELECT * FROM `t_rsd_model_history` t WHERE t.`status` = '正在执行' ;","readsource":""},"name":"mysqlreader"},"writer":{"parameter":{"writersource":"","column":["model_name"],"writeMode":"insert","batchSize":["22"],"table":["t_rsd_model_history"],"preSql":["SELECT * FROM `t_rsd_model_history` t WHERE t.`status` = '正在执行' ;"]},"name":"mysqlwriter"}}]
技术问答
2019-07-04 09:40:00
HDC调试需求开发(15万预算),能者速来!>>>
@wenshao 你好,想跟你请教个问题:
fastjson在处理特殊字符上,因为要在输出时保存字符串的原始模式,如\"的格式,要输出时,要输出为\ + "的形式,而不能直接输出为\",后者在输出时就直接输出为",而省略了\,这在js端是会报错的。 请问该如何处理啊?
我的情况是这样的:数据库中的content内容中含有双引号(你好"中国"),在使用fastjson转换toJSONString()后是: {"id":1, "content":"你好\"中国\""} ,但是我在jsp页面中将转换后的json字符串交给js解析:
var res = JSON.parse('${res_content}'); --> var res = JSON.parse('{"id":1, "content":"你好\"中国\""}');
这样是报错的,应该是这样的: var res = JSON.parse('{"id":1, "content":"你好\\"中国\\""}');
请问该如何处理啊?
技术问答
2015-06-19 17:01:00
HDC调试需求开发(15万预算),能者速来!>>>
整个项目都是,有碰到过的朋友嘛?
列表和编辑页 都有加
<%@ page contentType="text/html;charset=UTF-8"%>

技术问答
2016-07-28 16:46:09
HDC调试需求开发(15万预算),能者速来!>>>
大家好,我用DWZ提示的方式进行文件上传,可是我的后台已经报错了,而且也返回报错字符串了,可还是提示成功,有人知道怎么回事吗? onUploadError 这个方法总是不执行
onUploadSuccess 这个方法执行 onUploadComplete 这个方法执行
下面是后台返回的值
这是我后台返回值 的问题还是我少指定什么参数了
技术问答
2016-07-20 14:26:02
HDC调试需求开发(15万预算),能者速来!>>>
使用chorme调试页面,可是在source里面没有找到页面信息,只能看到index.jsp的信息,如何调试页面?
技术问答
2016-06-16 12:07:00
HDC调试需求开发(15万预算),能者速来!>>>
希望点击保存按钮后,后台进行添加操作,添加成功后提示添加成功。
jsp页面





后台controller
@RequestMapping("/addProduct") public ModelAndView addProduct(HttpServletRequest request, HttpServletResponse response) throws IOException { String newProductName = request.getParameter("newProductName"); System.out.println("新产品添加成功!"); System.out.println(newProductName); JSONObject dwzServerJson = new JSONObject(); dwzServerJson.put("statusCode", "200"); dwzServerJson.put("message", "111"); dwzServerJson.put("navTabId", "productView"); dwzServerJson.put("rel", ""); dwzServerJson.put("callbackType", "closeCurrent"); dwzServerJson.put("forwardUrl", ""); request.setAttribute("json", dwzServerJson); return null; }


技术问答
2016-06-03 16:12:00
HDC调试需求开发(15万预算),能者速来!>>>
dwz中有几种table方式 那些支持td换行的
技术问答
2012-02-24 11:39:00
HDC调试需求开发(15万预算),能者速来!>>>


网上考的,上传是有传成功,但在富文本里怎么展示啊?
技术问答
2016-04-08 15:23:00
HDC调试需求开发(15万预算),能者速来!>>>
我用搜狗浏览器点上一页下一页 每页显示数目 都可以
用IE点击后还是原来的数据 并且 我点击10后 还是5 而且还不能上一页 下一些 用搜狗却可以 求解 为什么
技术问答
2013-10-12 20:46:00
HDC调试需求开发(15万预算),能者速来!>>> 今天在给树遍历的时候想选中复选框,用jquery操作,设置了,但是界面上没有显示打勾,实际上checkbox已经选中,看了一下dom结构,原来显示打勾的是上层的一个DIV css,源码里面在手动选择的时候已经有,但是不知道怎么在遍历的时候怎么写..有朋友知道吗?@张慧华
技术问答
2013-02-17 23:49:00
HDC调试需求开发(15万预算),能者速来!>>>
很多同学接触Linux不多,对Linux平台的开发更是一无所知。 而现在的趋势越来越表明,作为一个优秀的软件开发人员,或计算机IT行业从业人员, 掌握Linux是一种很重要的谋生资源与手段。
下来我将会结合自己的几年的个人开发经验,及对 Linux,更是类UNIX系统,及开源软件文化, 谈谈Linux的学习方法与学习中应该注意的一些事。
就如同刚才说的,很多同学以前可能连Linux是什么都不知道,对UNIX更是一无所知。 所以我们从最基础的讲起,对于Linux及UNIX的历史我们不做多谈,直接进入入门的学习。
Linux入门是很简单的,问题是你是否有耐心,是否爱折腾,是否不排斥重装一类的大修。 没折腾可以说是学不好Linux的,鸟哥说过,要真正了解Linux的分区机制,对LVM使用相当熟练, 没有20次以上的Linux装机经验是积累不起来的,所以一定不要怕折腾。
由于大家之前都使用Windows,所以我也尽可能照顾这些“菜鸟”。 我的推荐,如果你第一次接触Linux,那么首先在虚拟机中尝试它。 虚拟机我推荐Virtual Box,我并不主张使用VM,原因是VM是闭源的,并且是收费的,我不希望推动盗版。 当然如果你的Money足够多,可以尝试VM,但我要说的是即使是VM,不一定就一定好。
付费的软件不一定好。
首先,Virtual Box很小巧,Windows平台下安装包在80MB左右,而VM动辄600MB,虽然功能强大,但资源消耗也多,何况你的需求Virtual Box完全能够满足。 所以,还是自己选。
如何使用虚拟机,是你的事,这个我不教你,因为很简单,不会的话Google或Baidu都可以, 英文好的可以直接看官方文档。 现在介绍Linux发行版的知识。
正如你所见,Linux发行版并非Linux,Linux仅是指操作系统的内核,作为科班出生的你不要让我解释, 我也没时间。
我推荐的发行版如下: UBUNTU 适合纯菜鸟,追求稳定的官方支持,对系统稳定性要求较弱,喜欢最新应用,相对来说不太喜欢折腾的开发者。 Debian,相对UBUNTU难很多的发行版,突出特点是稳定与容易使用的包管理系统,缺点是企业支持不足,为社区开发驱动。 Arch,追逐时尚的开发者的首选,优点是包更新相当快,无缝升级,一次安装基本可以一直运作下去,没有如UBUNTU那样的版本概念,说的专业点叫滚动升级,保持你的系统一定是最新的。缺点显然易见,不稳定。同时安装配置相对Debian再麻烦点。 Gentoo,相对Arch再难点,考验使用者的综合水平,从系统安装到微调,内核编译都亲历亲为,是高手及黑客显示自己技术手段,按需配置符合自己要求的系统的首选。 Slackware与Gentoo类似。 CentOS,社区维护的RedHat的复刻版本,完全使用RedHat的源码重新编译生成,与RedHat的兼容性在理论上来说是最好的。如果你专注于Linux服务器,如网络管理,架站,那么CentOS是你的选择。 LFS,终极黑客显摆工具,完全从源代码安装,编译系统。安装前你得到的只有一份文档,你要做的就是照文档你的说明,一步步,一条条命令,一个个软件包的去构建你的Linux,完全由你自己控制,想要什么就是什么。如果你做出了LFS,证明你的Linux功底已经相当不错,如果你能拿LFS文档活学活用,再将Linux从源代码开始移植到嵌入式系统,我敢说中国的企业你可以混的很好。
1、Linux基础
你得挑一个适合你的系统,然后在虚拟机安装它,开始使用它。 如果你想快速学会Linux,我有一个建议就是忘记图形界面,不要想图形界面能不能提供你问题的答案, 而是满世界的去找,去问,如何用命令行解决你的问题。
在这个过程中,你最好能将Linux的命令掌握的不错,起码常用的命令得知道,同时建立了自己的知识库, 里面是你积累的各项知识。
2、Linux平台的C/C++开发,同时还有Bash脚本编程[JAVA]
再下个阶段,你需要学习的是Linux平台的C/C++开发,同时还有Bash脚本编程,如果你对Java兴趣很深还有Java。 同样,建议你抛弃掉图形界面的IDE,从VIM开始,为什么是VIM,而不是Emacs, 我无意挑起编辑器大战,但我觉得VIM适合初学者,适合手比较笨,脑袋比较慢的开发者。 Emacs的键位太多,太复杂,我很畏惧。然后是GCC,Make,Eclipse(Java,C++或者)。
虽然将C++列在了Eclipse中,但我并不推荐用IDE开发C++,因为这不是Linux的文化, 容易让你忽略一些你应该注意的问题。 IDE让你变懒,懒得跟猪一样。如果你对程序调试,测试工作很感兴趣,GDB也得学的很好, 如果不是GDB也是必修课。这是开发的第一步,注意我并没有提过一句Linux系统API的内容, 这个阶段也不要关心这个。你要做的就是积累经验,在Linux平台的开发经验。
我推荐的书如下: C语言程序设计 。 C语言,白皮书当然更好。 C++推荐 C++ Primer Plus , Java我不喜欢,就不推荐了,附一个别人的书单: java 入门书籍 。 工具方面推荐VIM的官方手册,GCC中文文档,GDB中文文档,GNU开源软件开发指导(电子书), 汇编语言程序设计(让你对库,链接,内嵌汇编,编译器优化选项有初步了解,不必深度)。
如果你这个阶段过不了就不必往下做了,这是底线,最基础的基础,否则离开,不要霍霍Linux开发。 不专业的Linux开发者作出的程序是与Linux文化或UNIX文化相背的,程序是走不远的, 不可能像Bash,VIM这些神品一样。 所以做不好干脆离开。
3、UNIX环境高级编程(作者英年早逝,第3版即将出版,稍等)
UNIX环境高级编程 堪称神作,经典中的经典。
接下来进入Linux系统编程,不二选择, APUE ,UNIX环境高级编程,一遍一遍的看, 看10遍都嫌少,如果你可以在大学将这本书翻烂,里面的内容都实践过,有作品,你口头表达能力够强, 你可以在面试时说服所有的考官。
(可能有点夸张,但APUE绝对是圣经一般的读物,即使是Windows程序员也从其中汲取养分, Google创始人的案头书籍,扎尔伯克的床头读物。)
这本书看完后你会对Linux系统编程有相当的了解,知道Linux与Windows平台间开发的差异在哪? 它们的优缺点在哪?我的总结如下:做Windows平台开发,很苦,微软的系统API总在扩容, 想使用最新潮,最高效的功能,最适合当前流行系统的功能你必须时刻学习。 Linux不是,Linux系统的核心API就100来个,记忆力好完全可以背下来。 而且经久不变,为什么不变,因为要同UNIX兼容,符合POSIX标准。 所以Linux平台的开发大多是专注于底层的或服务器编程。
这是其优点,当然图形是Linux的软肋,但我站在一个开发者的角度,我无所谓,因为命令行我也可以适应, 如果有更好的图形界面我就当作恩赐吧。另外,Windows闭源,系统做了什么你更本不知道, 永远被微软牵着鼻子跑,想想如果微软说Win8不支持QQ,那腾讯不得哭死。 而Linux完全开源,你不喜欢,可以自己改,只要你技术够。
另外,Windows虽然使用的人多,但使用场合单一,专注与桌面。 而Linux在各个方面都有发展,尤其在云计算,服务器软件,嵌入式领域, 企业级应用上有广大前景,而且兼容性一流,由于支持POSIX可以无缝的运行在UNIX系统之上, 不管是苹果的Mac还是IBM的AS400系列,都是完全支持的。 另外,Linux的开发环境支持也绝对是一流的,不管是C/C++,Java,Bash,Python,PHP,Javascript,。。。。。。就连C#也支持。而微软除Visual Stdio套件以外,都不怎么友好,不是吗?
如果你看完APUE的感触有很多,希望验证你的某些想法或经验,推荐 UNIX程序设计艺术 , 世界顶级黑客将同你分享他的看法。
4、选择方向:网络,图形,嵌入式,设备驱动
网络方向:服务器软件编写及高性能的并发程序编写
现在是时候做分流了。 大体上我分为四个方向:网络,图形,嵌入式,设备驱动。
如果选择网络,再细分,我对其他的不是他熟悉,只说服务器软件编写及高性能的并发程序编写吧。 相对来说这是网络编程中技术含量最高的,也是底层的。 需要很多的经验,看很多的书,做很多的项目。
我的看法是以下面的顺序来看书: APUE再深读 – 尤其是进程,线程,IPC,套接字 多核程序设计 - Pthread一定得吃透了,你很NB UNIX网络编程 – 卷一,卷二 TCP/IP网络详解 – 卷一 再看上面两本书时就该看了 5.TCP/IP 网络详解 – 卷二 我觉得看到卷二就差不多了,当然卷三看了更好,努力,争取看了 6.Lighttpd源代码 - 这个服务器也很有名了 7.Nginx源代码 – 相较于Apache,Nginx的源码较少,如果能看个大致,很NB。看源代码主要是要学习里面的套接字编程及并发控制,想想都激动。如果你有这些本事,可以试着往暴雪投简历,为他们写服务器后台,想一想全球的魔兽都运行在你的服务器软件上。 Linux内核 TCP/IP协议栈 – 深入了解TCP/IP的实现
如果你还喜欢驱动程序设计,可以看看更底层的协议,如链路层的,写什么路由器,网卡, 网络设备的驱动及嵌入式系统软件应该也不成问题了。
当然一般的网络公司,就算百度级别的也该毫不犹豫的雇用你。 只是看后面这些书需要时间与经验,所以35岁以前办到吧!跳槽到给你未来的地方!
图形方向,我觉得图形方向也是很有前途的,以下几个方面。 Opengl的工业及游戏开发,国外较成熟。 影视动画特效,如皮克斯,也是国外较成熟。 GPU计算技术,可以应用在浏览器网页渲染上,GPU计算资源利用上,由于开源的原因,有很多的文档程序可以参考。如果能进火狐开发,或google做浏览器开发,应该会很好 。
嵌入式方向:嵌入式方向没说的,Linux很重要。
掌握多个架构,不仅X86的,ARM的,单片机什么的也必须得懂。 硬件不懂我预见你会死在半路上,我也想走嵌入式方向,但我觉得就学校教授嵌入式的方法, 我连学电子的那帮学生都竞争不过。 奉劝大家,一定得懂硬件再去做,如果走到嵌入式应用开发,只能祝你好运, 不要碰上像Nokia,Hp这样的公司,否则你会很惨的。
驱动程序设计:软件开发周期是很长的,硬件不同,很快。 每个月诞生那么多的新硬件,如何让他们在Linux上工作起来,这是你的工作。 由于Linux的兼容性很好,如果不是太低层的驱动,基本C语言就可以搞定,系统架构的影响不大, 因为有系统支持,你可能做些许更改就可以在ARM上使用PC的硬件了, 所以做硬件驱动开发不像嵌入式,对硬件知识的要求很高。
可以从事的方向也很多,如家电啊,特别是如索尼,日立,希捷,富士康这样的厂子,很稀缺的。
技术问答
2014-05-22 08:30:00
HDC调试需求开发(15万预算),能者速来!>>>
生产环境用jinkens构建maven项目时出现如图异常,已经处理了2天了还是没有定位到问题~~,如图:

急急急急~~~
技术问答
2018-09-11 15:40:00