使用ffmpeg編碼和解碼aac音訊
一、aac音訊編碼例項
二、aac音訊解碼例項#include <stdio.h> #define __STDC_CONSTANT_MACROS #ifdef _WIN32 //Windows extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" }; #else //Linux... #ifdef __cplusplus extern "C" { #endif #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #ifdef __cplusplus }; #endif #endif int flush_encoder(AVFormatContext *fmt_ctx,unsigned int stream_index) { int ret; int got_frame; AVPacket enc_pkt; if (!(fmt_ctx->streams[stream_index]->codec->codec->capabilities & CODEC_CAP_DELAY)) return 0; while (1) { enc_pkt.data = NULL; enc_pkt.size = 0; av_init_packet(&enc_pkt); ret = avcodec_encode_audio2 (fmt_ctx->streams[stream_index]->codec, &enc_pkt, NULL, &got_frame); av_frame_free(NULL); if (ret < 0) break; if (!got_frame) { ret=0; break; } printf("Flush Encoder: Succeed to encode 1 frame!\tsize:%5d\n",enc_pkt.size); /* mux encoded frame */ ret = av_write_frame(fmt_ctx, &enc_pkt); if (ret < 0) break; } return ret; } int main(int argc, char* argv[]) { AVFormatContext* pFormatCtx; AVOutputFormat* fmt; AVStream* audio_st; AVCodecContext* pCodecCtx; AVCodec* pCodec; uint8_t* frame_buf; AVFrame* pFrame; AVPacket pkt; int got_frame=0; int ret=0; int size=0; FILE *in_file=NULL; //Raw PCM data int framenum=1000; //Audio frame number const char* out_file = "tdjm.aac"; //Output URL int i = 0; in_file= fopen("tdjm.pcm", "rb"); av_register_all(); //申請avformat上下文 pFormatCtx = avformat_alloc_context(); fmt = av_guess_format(NULL, out_file, NULL); pFormatCtx->oformat = fmt; //avformat_alloc_output_context2(&pFormatCtx, NULL, NULL, out_file); //fmt = pFormatCtx->oformat; //Open output URL if (avio_open(&pFormatCtx->pb,out_file, AVIO_FLAG_READ_WRITE) < 0) { printf("Failed to open output file!\n"); return -1; } audio_st = avformat_new_stream(pFormatCtx, 0); if (audio_st==NULL) { return -1; } pCodecCtx = audio_st->codec; pCodecCtx->codec_id = fmt->audio_codec;//音訊編碼id pCodecCtx->codec_type = AVMEDIA_TYPE_AUDIO;//編碼型別為音訊 pCodecCtx->sample_fmt = AV_SAMPLE_FMT_S16;//取樣資料的寬度 pCodecCtx->sample_rate= 44100; //音訊取樣率 pCodecCtx->channel_layout=AV_CH_LAYOUT_STEREO;//聲道格式(單聲道、雙聲道) pCodecCtx->channels = av_get_channel_layout_nb_channels(pCodecCtx->channel_layout);//聲道數 pCodecCtx->bit_rate = 64000; //平均位元速率 //除錯資訊輸出 av_dump_format(pFormatCtx, 0, out_file, 1); //查詢編碼器 pCodec = avcodec_find_encoder(pCodecCtx->codec_id); if (!pCodec) { printf("Can not find encoder!\n"); return -1; } //開啟編碼器 if (avcodec_open2(pCodecCtx, pCodec,NULL) < 0) { printf("Failed to open encoder!\n"); return -1; } //申請frame pFrame = av_frame_alloc(); pFrame->nb_samples= pCodecCtx->frame_size; pFrame->format= pCodecCtx->sample_fmt; //計算編碼器編碼能力一幀的資料大小 size = av_samples_get_buffer_size(NULL, pCodecCtx->channels,pCodecCtx->frame_size,pCodecCtx->sample_fmt, 1); frame_buf = (uint8_t *)av_malloc(size); avcodec_fill_audio_frame(pFrame, pCodecCtx->channels, pCodecCtx->sample_fmt,(const uint8_t*)frame_buf, size, 1); //Write Header avformat_write_header(pFormatCtx,NULL); av_new_packet(&pkt,size); i = 0; while(true) { //Read PCM if(feof(in_file)) { break; } else if (fread(frame_buf, 1, size, in_file) < size) { printf("Failed to read raw data! \n"); break; } pFrame->data[0] = frame_buf; //PCM Data pFrame->pts=i* (pCodecCtx->frame_size * 1000 / pCodecCtx->sample_rate); //播放時間戳需要不一樣,否則後面音訊幀插入失敗 got_frame=0; //Encode ret = avcodec_encode_audio2(pCodecCtx, &pkt,pFrame, &got_frame); if(ret < 0) { printf("Failed to encode!\n"); return -1; } if (got_frame==1) { printf("Succeed to encode 1 frame! \tsize:%5d\n",pkt.size); pkt.stream_index = audio_st->index; ret = av_write_frame(pFormatCtx, &pkt); av_free_packet(&pkt); } i++; } //Flush Encoder ret = flush_encoder(pFormatCtx,0); if (ret < 0) { printf("Flushing encoder failed\n"); return -1; } //Write Trailer av_write_trailer(pFormatCtx); //Clean if (audio_st) { avcodec_close(audio_st->codec); av_free(pFrame); av_free(frame_buf); } avio_close(pFormatCtx->pb); avformat_free_context(pFormatCtx); fclose(in_file); return 0; }
AAC編碼只會輸出float planar型別的取樣,那要怎樣在不支援float planar的音訊輸出裝置(比如Windows的WaveOut)上輸出呢?
對音訊進行重取樣。ffmepg提供swr_convert重取樣。
#include <stdlib.h> #include <stdio.h> #ifdef _WIN32 //Windows extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libswscale/swscale.h" #include "libswresample/swresample.h" #include "libavutil/avutil.h" #include "libavutil/opt.h" }; #else //Linux... #ifdef __cplusplus extern "C" { #endif #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include "libswscale/swscale.h" #include "libswresample/swresample.h" #include "libavutil/avutil.h" #include "libavutil/opt.h" #ifdef __cplusplus }; #endif #endif int m_is_first_audio_pts = 0; int main (void) { //1.註冊元件 av_register_all(); //封裝格式上下文 AVFormatContext *pFormatCtx = avformat_alloc_context(); //2.開啟輸入音訊檔案 if (avformat_open_input(&pFormatCtx, "tdjm.aac", NULL, NULL) != 0) { printf("%s", "開啟輸入音訊檔案失敗"); return -1; } //3.獲取音訊資訊 if (avformat_find_stream_info(pFormatCtx, NULL) < 0) { printf("%s", "獲取音訊資訊失敗"); return -1; } //音訊解碼,需要找到對應的AVStream所在的pFormatCtx->streams的索引位置 int audio_stream_idx = -1; int i = 0; for (i=0; i < pFormatCtx->nb_streams; i++) { //根據型別判斷是否是音訊流 if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) { audio_stream_idx = i; break; } } //4.獲取解碼器 //根據索引拿到對應的流,根據流拿到解碼器上下文 AVCodecContext *pCodeCtx = pFormatCtx->streams[audio_stream_idx]->codec; //再根據上下文拿到編解碼id,通過該id拿到解碼器 AVCodec *pCodec = avcodec_find_decoder(pCodeCtx->codec_id); if (pCodec == NULL) { printf("%s", "無法解碼"); return -1; } //5.開啟解碼器 if (avcodec_open2(pCodeCtx, pCodec, NULL) < 0) { printf("%s", "編碼器無法開啟"); return -1; } //編碼資料 AVPacket *packet = (AVPacket *)av_malloc(sizeof(AVPacket)); //解壓縮資料 AVFrame *frame = av_frame_alloc(); //frame->16bit 44100 PCM 統一音訊取樣格式與取樣率 SwrContext *swrCtx = swr_alloc(); //重取樣設定選項 //輸入的取樣格式 enum AVSampleFormat in_sample_fmt = pCodeCtx->sample_fmt; //輸出的取樣格式 16bit PCM enum AVSampleFormat out_sample_fmt = AV_SAMPLE_FMT_S16; //輸入的取樣率 int in_sample_rate = pCodeCtx->sample_rate; //輸出的取樣率 int out_sample_rate = pCodeCtx->sample_rate;//如果指定輸出的取樣率與pCodeCtx->sample_rate相差很大時,swr_convert輸出的pcm有噪音,需要使用AVAudioFifo做分包處理。 //輸入的聲道佈局 uint64_t in_ch_layout = pCodeCtx->channel_layout; //輸出的聲道佈局 uint64_t out_ch_layout = AV_CH_LAYOUT_MONO;//AV_CH_LAYOUT_MONO,單通道;AV_CH_LAYOUT_STEREO,雙聲道 /* swr_alloc_set_opts(swrCtx, out_ch_layout, out_sample_fmt, out_sample_rate, in_ch_layout, in_sample_fmt, in_sample_rate, 0, NULL); */ #if LIBSWRESAMPLE_VERSION_MINOR >= 17 // 根據版本不同,選用適當函式 /* set options */ av_opt_set_int(swrCtx, "in_channel_layout", in_ch_layout, 0); av_opt_set_int(swrCtx, "in_sample_rate", in_sample_rate, 0); av_opt_set_sample_fmt(swrCtx, "in_sample_fmt",in_sample_fmt, 0); av_opt_set_int(swrCtx, "out_channel_layout",out_ch_layout, 0); av_opt_set_int(swrCtx, "out_sample_rate", out_sample_rate, 0); av_opt_set_sample_fmt(swrCtx, "out_sample_fmt",out_sample_fmt, 0); #else swr_alloc_set_opts(swrCtx, out_ch_layout, out_sample_fmt, out_sample_rate, in_ch_layout, in_sample_fmt, in_sample_rate, 0, NULL); #endif swr_init(swrCtx); //獲取輸出的聲道個數 int out_channel_nb = av_get_channel_layout_nb_channels(out_ch_layout); //儲存pcm資料 int out_size = (out_channel_nb*out_sample_rate*16)/8.0; //1秒的資料大小 uint8_t *out_buffer = (uint8_t *) av_malloc(out_size/2); FILE *fp_pcm = fopen("out.pcm", "wb"); int ret, got_frame, framecount = 0; //6.一幀一幀讀取壓縮的音訊資料AVPacket while (av_read_frame(pFormatCtx, packet) >= 0) { if (packet->stream_index == audio_stream_idx) { while(packet->size > 0) { ret = avcodec_decode_audio4(pCodeCtx, frame, &got_frame, packet); if (ret < 0) { printf("%s", "解碼出現錯誤"); break; } //解碼成功 if (got_frame) { printf("解碼%d幀\n", framecount++); int dst_nb_samples = av_rescale_rnd(swr_get_delay(swrCtx, pCodeCtx->sample_rate) + frame->nb_samples, out_sample_rate, pCodeCtx->sample_rate, AV_ROUND_UP); //av_samples_alloc(&out_buffer, NULL, out_channel_nb, dst_nb_samples, out_sample_fmt, 0); swr_convert(swrCtx, &out_buffer, dst_nb_samples,(const uint8_t **)frame->data, frame->nb_samples); //swr_convert(swrCtx, &out_buffer, out_channel_nb * out_sample_rate,(const uint8_t **)frame->data, frame->nb_samples); //獲取sample的size int out_buffer_size = av_samples_get_buffer_size(NULL, out_channel_nb, frame->nb_samples, out_sample_fmt, 1); //寫入檔案 fwrite(out_buffer, 1, out_buffer_size, fp_pcm); //av_freep(&out_buffer); } // 更新解碼包的資訊 packet->data += ret; packet->size -= ret; } } av_free_packet(packet); } fclose(fp_pcm); av_frame_free(&frame); av_free(out_buffer); swr_free(&swrCtx); avcodec_close(pCodeCtx); avformat_close_input(&pFormatCtx); return 0; }
使用swr_convert重取樣過程中,轉碼如果不改變取樣率,只改變格式(fmt)和通道數,PCM音訊正常,但是隻要改變,出來的PCM就會有雜音。
解決方法:使用AVAudioFifo做分包處理。
三、aac音訊解碼例項(重取樣+AVAudioFifo分包)
swr_convert重取樣+AVAudioFifo做分包處理,消除上面不同取樣率之間轉換的噪音。
#include <stdlib.h> #include <stdio.h> #ifdef _WIN32 //Windows extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libswscale/swscale.h" #include "libswresample/swresample.h" #include "libavutil/avutil.h" #include "libavutil/opt.h" #include "libavutil/audio_fifo.h" }; #else //Linux... #ifdef __cplusplus extern "C" { #endif #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include "libswscale/swscale.h" #include "libswresample/swresample.h" #include "libavutil/avutil.h" #include "libavutil/opt.h" #include "libavutil/audio_fifo.h" #ifdef __cplusplus }; #endif #endif int m_is_first_audio_pts = 0; int main (void) { //1.註冊元件 av_register_all(); //封裝格式上下文 AVFormatContext *pFormatCtx = avformat_alloc_context(); //2.開啟輸入音訊檔案 if (avformat_open_input(&pFormatCtx, "tdjm.aac", NULL, NULL) != 0) { printf("%s", "開啟輸入音訊檔案失敗"); return -1; } //3.獲取音訊資訊 if (avformat_find_stream_info(pFormatCtx, NULL) < 0) { printf("%s", "獲取音訊資訊失敗"); return -1; } //音訊解碼,需要找到對應的AVStream所在的pFormatCtx->streams的索引位置 int audio_stream_idx = -1; int i = 0; for (i=0; i < pFormatCtx->nb_streams; i++) { //根據型別判斷是否是音訊流 if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) { audio_stream_idx = i; break; } } //4.獲取解碼器 //根據索引拿到對應的流,根據流拿到解碼器上下文 AVCodecContext *pCodeCtx = pFormatCtx->streams[audio_stream_idx]->codec; //再根據上下文拿到編解碼id,通過該id拿到解碼器 AVCodec *pCodec = avcodec_find_decoder(pCodeCtx->codec_id); if (pCodec == NULL) { printf("%s", "無法解碼"); return -1; } //5.開啟解碼器 if (avcodec_open2(pCodeCtx, pCodec, NULL) < 0) { printf("%s", "編碼器無法開啟"); return -1; } //編碼資料 AVPacket *packet = (AVPacket *)av_malloc(sizeof(AVPacket)); //解壓縮資料 AVFrame *frame = av_frame_alloc(); //frame->16bit 44100 PCM 統一音訊取樣格式與取樣率 SwrContext *swrCtx = swr_alloc(); //重取樣設定選項 //輸入的取樣格式 enum AVSampleFormat in_sample_fmt = pCodeCtx->sample_fmt; //輸出的取樣格式 16bit PCM enum AVSampleFormat out_sample_fmt = AV_SAMPLE_FMT_S16; //輸入的取樣率 int in_sample_rate = pCodeCtx->sample_rate; //輸出的取樣率 int out_sample_rate = 8000;//pCodeCtx->sample_rate; //輸入的聲道佈局 uint64_t in_ch_layout = pCodeCtx->channel_layout; //輸出的聲道佈局 uint64_t out_ch_layout = AV_CH_LAYOUT_MONO;//AV_CH_LAYOUT_MONO,單通道;AV_CH_LAYOUT_STEREO,雙聲道 #if LIBSWRESAMPLE_VERSION_MINOR >= 17 // 根據版本不同,選用適當函式 /* set options */ av_opt_set_int(swrCtx, "in_channel_layout", in_ch_layout, 0); av_opt_set_int(swrCtx, "in_sample_rate", in_sample_rate, 0); av_opt_set_sample_fmt(swrCtx, "in_sample_fmt",in_sample_fmt, 0); av_opt_set_int(swrCtx, "out_channel_layout",out_ch_layout, 0); av_opt_set_int(swrCtx, "out_sample_rate", out_sample_rate, 0); av_opt_set_sample_fmt(swrCtx, "out_sample_fmt",out_sample_fmt, 0); #else swr_alloc_set_opts(swrCtx, out_ch_layout, out_sample_fmt, out_sample_rate, in_ch_layout, in_sample_fmt, in_sample_rate, 0, NULL); #endif swr_init(swrCtx); //獲取輸出的聲道個數 int out_channel_nb = av_get_channel_layout_nb_channels(out_ch_layout); int out_framesize = 1024;//參考ffmpeg中音訊格式的frame_size /* 各種音訊格式nb_samples和frame_size其他如下: case AV_CODEC_ID_ADPCM_ADX: return 32; case AV_CODEC_ID_ADPCM_IMA_QT: return 64; case AV_CODEC_ID_ADPCM_EA_XAS: return 128; case AV_CODEC_ID_ATRAC3: return 1024 * framecount; case AV_CODEC_ID_ATRAC3P: return 2048; case AV_CODEC_ID_MUSEPACK7: return 1152; //mp3 */ //儲存pcm資料 int out_size = (out_channel_nb*out_sample_rate*16)/8.0; //1秒的資料大小 uint8_t *out_buffer = (uint8_t *) av_malloc(out_size/2); FILE *fp_pcm = fopen("out.pcm", "wb"); int ret, got_frame, framecount = 0; bool bAllocAudioFifo = false; int readFinished = 0; int nb_samplesByAllocAudioFifo = 0; AVAudioFifo * audiofifo = av_audio_fifo_alloc(out_sample_fmt, out_channel_nb, 1); //6.一幀一幀讀取壓縮的音訊資料AVPacket while (av_read_frame(pFormatCtx, packet) >= 0) { if (packet->stream_index == audio_stream_idx) { while(packet->size > 0) { ret = avcodec_decode_audio4(pCodeCtx, frame, &got_frame, packet); if (ret < 0) { printf("%s", "解碼出現錯誤"); break; } //解碼成功 if (got_frame) { //printf("解碼%d幀\n", framecount++); int dst_nb_samples = av_rescale_rnd(swr_get_delay(swrCtx, pCodeCtx->sample_rate) + frame->nb_samples, out_sample_rate, pCodeCtx->sample_rate, AV_ROUND_UP); int convert_nb_samples = swr_convert(swrCtx, &out_buffer, dst_nb_samples, (const uint8_t**)frame->data, frame->nb_samples); if(!bAllocAudioFifo) { av_audio_fifo_realloc(audiofifo, av_audio_fifo_size(audiofifo) + frame->nb_samples); nb_samplesByAllocAudioFifo = frame->nb_samples; } else { if(frame->nb_samples > nb_samplesByAllocAudioFifo) { av_audio_fifo_free(audiofifo); audiofifo = av_audio_fifo_alloc(out_sample_fmt, out_channel_nb, frame->nb_samples); nb_samplesByAllocAudioFifo = frame->nb_samples; } } av_audio_fifo_write(audiofifo, (void **)&out_buffer, convert_nb_samples); } // 更新解碼包的資訊 packet->data += ret; packet->size -= ret; } //read from audio_fifo while (av_audio_fifo_size(audiofifo) >= out_framesize){ int frame_size = FFMIN(av_audio_fifo_size(audiofifo), out_framesize); AVFrame* output_frame = NULL; output_frame = av_frame_alloc(); output_frame->nb_samples = frame_size; output_frame->channel_layout = out_ch_layout; output_frame->format = out_sample_fmt; output_frame->sample_rate = 20000; av_frame_get_buffer(output_frame, 0); av_audio_fifo_read(audiofifo, (void **)output_frame->data, frame_size); //寫入檔案 fwrite(output_frame->data[0], 1, output_frame->linesize[0], fp_pcm); } } av_free_packet(packet); } //read from audio_fifo while (av_audio_fifo_size(audiofifo) > 0 ){ int frame_size = FFMIN(av_audio_fifo_size(audiofifo), out_framesize); AVFrame* output_frame = NULL; output_frame = av_frame_alloc(); output_frame->nb_samples = frame_size; output_frame->channel_layout = out_ch_layout; output_frame->format = out_sample_fmt; output_frame->sample_rate = 20000; av_frame_get_buffer(output_frame, 0); av_audio_fifo_read(audiofifo, (void **)output_frame->data, frame_size); //寫入檔案 fwrite(output_frame->data[0], 1, output_frame->linesize[0], fp_pcm); } fclose(fp_pcm); av_frame_free(&frame); av_free(out_buffer); swr_free(&swrCtx); avcodec_close(pCodeCtx); avformat_close_input(&pFormatCtx); return 0; }
相關推薦
使用ffmpeg編碼和解碼aac音訊
一、aac音訊編碼例項#include <stdio.h> #define __STDC_CONSTANT_MACROS #ifdef _WIN32 //Windows extern "C" { #include "libavcodec/avcodec.h"
java-base64編碼和解碼
exc util 分享 .org 數據 base64 [] 解碼 ble 一、反射/*** * encode by Base64 */ public static String encodeBase64(byte[]input)
URL地址編碼和解碼
解碼 pen nsis query n) function 關於 written per 0. 參考 【整理】關於http(GET或POST)請求中的url地址的編碼(encode)和解碼(decode) python3中的urlopen對於中文url是如何處理的? 中文U
python中編碼和解碼decode和encode的使用
python encode decode python 在處理字符串時經常遇到編碼錯誤,導致亂碼,且python 2.x和 python 3.x之間有很大的不同,先在這裏記錄一下,以後整理;轉載 文章一篇:http://www.cnblogs.com/evening/archive/2012/04
字符的編碼和解碼
utf-8 Coding decode encoding log gb2312 code logs unicode 字符的編碼和解碼 # Author:nadech import sys print(sys.getdefaultencoding()) #這裏的s的編碼方
編碼和解碼(字符串與byte[]之間的轉換)
sys 美國 程序 是我 col urn 密碼 url 簡單的 資源來自互聯網http://www.cnblogs.com/dabaopku/archive/2012/02/27/2370446.html 非常蛋疼的事情, google 和 baidu 在編碼是分別采用
python第三天學習復習,集合set,文件操作,函數(普通函數,遞歸,高階函數),字符編碼和解碼
下層 utf-8 只讀 sub pytho bsp for sca move 三元運算 age = 23 #就是if else的簡單寫法 a = age if age < 20 else 25 集合 set #集合是無序切不重復的, #當對列表去重復的時候,
[LeetCode] 535. Encode and Decode TinyURL 編碼和解碼短URL
blog ack decode nco his algorithm highlight return 解碼 Note: This is a companion problem to the System Design problem: Design TinyURL.Tiny
在 Java 中如何進行 BASE64 編碼和解碼
解碼 clas nal upd getch 根據 數組 格式 並且 BASE64 編碼是一種常用的字符編碼,在很多地方都會用到。JDK 中提供了非常方便的 BASE64Encoder 和 BASE64Decoder,用它們可以非常方便的完成基於 BASE64 的編碼和解碼。
WebUtility(提供在處理 Web 請求時用於編碼和解碼 URL 的方法。)
html second rep eth asp entity utility -s 文本 public static string UrlEncode( string str ) UrlEncode(String) 方法可用來編碼整個 URL,包括查詢字符串值。
python學習(二十八)URL編碼和解碼&簽名規則需求練習
ufw utf rem n) obj split color sea 輸入 1、url編碼和url解碼 打開瀏覽器,輸入"python基礎教程",點擊搜索後,地址欄會有一長串的類似於 %DFBGN這種 就是url編碼對應的搜索內容,具體如下: https://www.so.
python0.11-----文件/編碼和解碼/pickle模塊
enc 讀寫 obj utf-8 ros microsoft 網絡數 報錯 ror 文件:python中的文件讀寫和c兼容,磁盤上的讀寫由操作系統完成,一般的程序無法操作磁盤。文件讀寫是通過操作系統對象完成,該對象稱為文件描述符。 文件的操作分兩種: 1.打開文件open(
python的 == 和 is,編碼和解碼
傳輸 bsp 成對 pri 列表 內存地址 進制 back 默認 is和 == == 比較兩邊的值 a = ‘alex‘ b = ‘alex‘ print(a == b) True n = 10 n1 = 10 print(n == n1) True li1 = [
is 和“==” 的區別,編碼和解碼
數字 們的 密文 進制 -- + - 列表 的區別 == is 是指比較兩者的內存地址是否相等 “==" 是指比較兩者的值是否相等。 小數據池 數字小數據池的範圍 -5---256 字符串:字符串*20內內存地址一樣,單個*21以上,內存地址就不一樣 字符串中如果
路徑的編碼和解碼
tps clas component www .site console com 編碼 bsp console.log(encodeURI("%")) //%25 console.log(encodeURIComponent("%")) // %25 console.l
對於PrintStream 和PrintWriter的理解 以及各種編碼格式 以及編碼和解碼的解釋
PrintStream: 是一個位元組列印流,System.out對應的型別就是PrintStream。 它的建構函式函式可以接收三種資料型別的值。 1,字串路徑。 2,File物件。 3,OutputStream。 PrintWriter: 是一
js對base64編碼的字串進行 編碼和 解碼
//1.加密解密方法使用: //1.加密 var str = '124中文內容'; var base = new Base64(); var result = base.encode(str); //document.write(result); //2.解密 var result2
哈夫曼樹及哈夫曼編碼和解碼
哈夫曼樹,又稱最優樹,是帶權路徑最小的樹。 基本概念: 節點間的路徑長度:兩個節點間所包含的邊的數目。 樹的路徑長度:從根到樹中任意節點的路徑長度之和。 權:將節點賦予一定的量值,該量值成為權。 樹的帶權路徑長度:樹中所有葉子結點的帶權路徑長度。 哈夫曼演算法:給定一個儲存權值的陣列,求
Python的編碼和解碼
Python的編碼和解碼 在不同的國家,存在不同的文字,由於現在的軟體都要做到國際化通用,所以必須要有一種語言或編碼方式,來實現各種編碼的解碼,然後重新編碼。 在西方國家,沒有漢字,只有英文,所以最開始使用的是ASCII編碼,只有96個元素,所以用8位(1位元組)就能完全表示,但是無法解析中文。 中國有
vue傳值的編碼和解碼
第一步:傳值 編碼 encodeURIComponent() skip(){ this.$router.push({ path:'./channelPromotion?channelName='+'我是字 段'+'&&channelUrl='+e