音視頻開發13 FFmpeg 音頻 相關格式分析 -- AAC ADTS格式分析

這一節,我們學習常用的音頻的格式 AAC,重點是掌握 AAC的傳輸格式 ADTS 頭部的信息,目的是 : 當音頻數據有問題的時候,如果是AAC的編碼,在分析 頭部信息的時候能夠根據頭部信息 判斷問題是否出現在 頭部。

AAC ADTS格式分析

AAC?頻格式:Advanced Audio Coding(?級?頻解碼),是?種由MPEG-4標準定義的有損?頻壓縮格式,由Fraunhofer發展,Dolby, Sony和AT&T是主要的貢獻者。

AAC 的封裝格式有兩種 ADIF 和 ADTS

ADIF:已經基本棄用-ADIF只有?個統?的頭,所以必須得到所有的數據后解碼。

Audio Data Interchange Format ?頻數據交換格式。這種格式的特征是可以確定的找到這個?頻數據的開始,不需進?在?頻數據流中間開始的解碼,即它的解碼必須在明確定義的開始處進?。故這種格式常?在磁盤?件中。

ADTS ADTS可以在任意幀解碼,也就是說它每?幀都有頭信息,這個是重點

Audio Data Transport Stream。是AAC?頻的傳輸流格式。AAC?頻格式在MPEG-2(ISO-13318-7 2003)中有定義。AAC后來?被采?到MPEG-4標準中。這種格式的特征是它是?個有同步字的?特流,解碼可以在這個流中任何位置開始。它的特征類似于mp3數據流格式。

可能遇見的問題1:

有的時候當你編碼AAC裸流的時候,會遇到寫出來的AAC?件并不能在PC和?機上播放,很?的可能就是AAC?件的每?幀?缺少了ADTS頭信息?件的包裝拼接。

只需要加?頭?件ADTS即可。?個AAC原始數據塊?度是可變的,對原始幀加:上ADTS頭進?ADTS的封裝,就形成了ADTS幀。

ADTS 格式下 AAC?頻?件格式

每?幀由ADTS Header和AAC Audio Data(在圖中,是 AAC ES)組成。結構體如下:

也就是說,,一個AAC 幀,包含了一個ADTS header 和 一堆具體的數據。另外AAC的一幀一般包含了1024個采樣點。

頭文件 ADTS Header 的組成

是由 固定頭信息? +? 可變頭信息 。組成
固定頭信息中的數據每?幀都相同,?可變頭信息則在幀與幀之間可變

每?幀的ADTS的頭?件都包含了?頻的采樣率,聲道,幀?度等信息,這樣解碼器才能解析讀取。

?般情況下ADTS的頭信息都是7個字節,分為2部分:

adts_fixed_header();

adts_variable_header();

其?為固定頭信息,緊接著是可變頭信息。固定頭信息中的數據每?幀都相同,?可變頭信息則在幀與幀之間可變。

頭文件固定部分:adts_fixed_header()

syncword :同步頭 總是0xFFF, all bits must be 1,代表著?個ADTS幀的開始 12bits

ID: MPEG標識符,0標識MPEG-4,1標識MPEG-2 1bits

Layer: always: '00' 2 bits

protection_absent:表示是否誤碼校驗。1代表 header 有 7個字節,0代表 header有9個字節,一般情況下都是7個字節。Warning, set to 1 if there is no CRC and 0 if there is CRC 1bits

profile:表示使?哪個級別的AAC,如01 Low Complexity(LC)--- AAC LC。有些芯?只?持AAC LC 。 2bits。。 通過前面的ID,我們可以設置是?MPEG-4, 還是?MPEG-2

在MPEG-2 中,有明確的指出?profile這個值是多少。且只有三種 參見下表

在MPEG-4中,profile的計算要通過? MPEG-4 Audio Object Type - 1

profile = MPEG-4 Audio Object Type - 1

如下的MPEG-4中關于 aac audio Object Type的說明

對應的profile的值

sampling_frequency_index:表示使?的采樣率下標,通過這個下標在 Sampling Frequencies[ ]數組中查找得知采樣率的值。4bits

channel_configuration: 表示聲道數,?如2表示?體聲雙聲道 3bits,

MPEG-4 中規定的值如下:

0: Defined in AOT Specifc Config

1: 1 channel: front-center

2: 2 channels: front-left, front-right

3: 3 channels: front-center, front-left, front-right

4: 4 channels: front-center, front-left, front-right, back-center

5: 5 channels: front-center, front-left, front-right, back-left, back-right

6: 6 channels: front-center, front-left, front-right, back-left, back-right, LFE-channel

7: 8 channels: front-center, front-left, front-right, side-left, side-right,back-left, back-right, LFE-channel

8-15: Reserved

還有3個沒有介紹:都占1bite,

private_bits:

original:

home:

頭文件adts_variable_header()

copyright_identification_bits: 未知, 占1bits

copyright_identification_start: 未知,占1bits

aac_frame_length : ?個ADTS幀的?度 包括ADTS頭和AAC原始流. 單位是bytes

aac_frame_length = (protection_absent == 1 ? 7 : 9) + size(AACFrame) 13 bits

protection_absent=0時, header length=9bytes

protection_absent=1時, header length=7bytes

adts_buffer_fullness:0x7FF 說明是碼率可變的碼流。一般都是寫的0x7FF這個值 11bits

number_of_raw_data_blocks_in_frame
表示ADTS幀中有number_of_raw_data_blocks_in_frame + 1個AAC原始幀。
如果number_of_raw_data_blocks_in_frame 的值是0,?表示說ADTS幀中有?個AAC原始幀。
如果 number_of_raw_data_blocks_in_frame 的值是1,表明ADTS幀中有2個原始幀。
例子:

下?是ADTS的AAC?件部分:?字節開始算

第?幀的幀頭7個字節為:0xFF 0xF1 0x4C 0x40 0x20 0xFF 0xFC

我們將這7個字節拿出來,轉化成2進制

0xFF? ? ? ? ?0xF1? ? ? ? ? 0x4C? ? ? ? ? 0x40? ? ? ? ? ? ?0x20? ? ? ? ? ? 0xFF? ? ? ? ? 0xFC

11111111? ?11110001? ?01001100? ?0100 0000? ?0010 0000? ?1111 1111? ?1111 1100

分析各個關鍵數值:

0xFF 0xF1 表示如下的部分

111111111111 syncword :同步頭 總是0xFFF, all bits must be 1,代表著?個ADTS幀的開始 12bits

0 ID: MPEG標識符,0標識MPEG-4,1標識MPEG-2 1bits

00 Layer: always: '00' 2 bits

1 protection_absent:表示是否誤碼校驗。1代表 header 有 7個字節,0代表 header有9個字節,一般情況下都是7個字節。Warning, set to 1 if there is no CRC and 0 if there is CRC 1bits


0x4C 全部, 0x40中的4 表示部分如下

01 profile:表示使?哪個級別的AAC,如01 Low Complexity(LC)--- AAC LC。有些芯片只支持AAC LC 。 2bits

0011 ,sampling_frequency_index : 通過這個下標在 Sampling Frequencies[ ]數組中找采樣率的值 4bits

0 private_bits: 1 bits

001 channel_configuration: 表示聲道數,比如2表示立體聲雙聲道 3bits

0 original: 1bits

0 home: 1bits


0x40中的4 ,,, 0x20 0xFF 0xFC 全部表示如下

0 copyright_identification_bits: 未知, 占1bits

0 copyright_identification_start: 未知,占1bits

0000100000111(幀?度) aac_frame_length 占 13 bits

11111111111 adts_buffer_fullness:0x7FF 說明是碼率可變的碼流。 11bits

00 number_of_raw_data_blocks_in_frame

表示ADTS幀中有number_of_raw_data_blocks_in_frame + 1個AAC原始幀。 占2bits

一般一個

計算幀?度:將?進制 0000100000111 轉換成?進制為263。觀察第?幀的?度確實為263個字節。紅色部分的為幀頭部的固定部分?0xFF 0xF1 0x4C 0x40 0x20 0xFF 0xFC , 該幀長度所屬位置為藍色部分,其中 第一個0的后兩個0, 0000

得到幀長度的計算?法:(幀?度為13位,使?unsigned int來存儲幀?數值)

unsigned int getFrameLength(unsigned char* str)
{if ( !str ){return 0;}unsigned int len = 0;int f_bit = str[3];int m_bit = str[4];int b_bit = str[5];len += (b_bit>>5);len += (m_bit<<3);len += ((f_bit&3)<<11);return len;
}

核心編碼:注意的在生成 ADTS Header 的代碼
 
    // 讀取媒體文件,并把aac數據幀寫入到本地文件,注意,從mp4文件中讀取到的aac就只有 aac data 的部分,沒有頭的部分,頭的部分我們需要自己添加,使用的方法為自定義的adts_header方法
//    av_read_frame方法的一些說明
//    對于音頻,如果每個幀具有已知的固定大小(例如PCM或ADPCM數據),則它包含整數個幀。// 如果音頻幀具有可變大小(例如MPEG音頻),則它包含一個幀。//當前走到這里,讀取的一定是AAC數據,那么av_read_frame讀取到pkt中的一定是一幀的大小,因此adts_header方法中,傳遞的第二個參數就是一幀的大小。int ret1 =0;while((ret1 = av_read_frame(ifmt_ctx, &pkt)) >=0 ){if(pkt.stream_index == audio_index){char adts_header_buf[7] = {0};//這里我們自己寫的時候,頭部占7bytes,意味著 校驗位的值是1,表示不用校驗adts_header(adts_header_buf, pkt.size,ifmt_ctx->streams[audio_index]->codecpar->profile,ifmt_ctx->streams[audio_index]->codecpar->sample_rate,ifmt_ctx->streams[audio_index]->codecpar->channels);fwrite(adts_header_buf, 1, 7, aac_fd);  // 寫adts header , ts流不適用,ts流分離出來的packet帶了adts headerlen = fwrite( pkt.data, 1, pkt.size, aac_fd);   // 寫adts dataif(len != pkt.size){av_log(NULL, AV_LOG_DEBUG, "warning, length of writed data isn't equal pkt.size(%d, %d)\n",len,pkt.size);}}av_packet_unref(&pkt);}

int adts_header(char * const p_adts_header, const int data_length,const int profile, const int samplerate,const int channels)
{int sampling_frequency_index = 3; // 默認使用48000hzint adtsLen = data_length + 7;int frequencies_size = sizeof(sampling_frequencies) / sizeof(sampling_frequencies[0]);int i = 0;for(i = 0; i < frequencies_size; i++){if(sampling_frequencies[i] == samplerate){sampling_frequency_index = i;break;}}if(i >= frequencies_size){printf("unsupport samplerate:%d\n", samplerate);return -1;}p_adts_header[0] = 0xff;         //syncword:0xfff                          高8bitsp_adts_header[1] = 0xf0;         //syncword:0xfff                          低4bitsp_adts_header[1] |= (0 << 3);    //MPEG Version:0 for MPEG-4,1 for MPEG-2  1bitp_adts_header[1] |= (0 << 1);    //Layer:0                                 2bitsp_adts_header[1] |= 1;           //protection absent:1                     1bitp_adts_header[2] = (profile)<<6;            //profile:profile               2bitsp_adts_header[2] |= (sampling_frequency_index & 0x0f)<<2; //sampling frequency index:sampling_frequency_index  4bitsp_adts_header[2] |= (0 << 1);             //private bit:0                   1bitp_adts_header[2] |= (channels & 0x04)>>2; //channel configuration:channels  高1bitp_adts_header[3] = (channels & 0x03)<<6; //channel configuration:channels 低2bitsp_adts_header[3] |= (0 << 5);               //original:0                1bitp_adts_header[3] |= (0 << 4);               //home:0                    1bitp_adts_header[3] |= (0 << 3);               //copyright id bit:0        1bitp_adts_header[3] |= (0 << 2);               //copyright id start:0      1bitp_adts_header[3] |= ((adtsLen & 0x1800) >> 11);           //frame length:value   高2bitsp_adts_header[4] = (uint8_t)((adtsLen & 0x7f8) >> 3);     //frame length:value    中間8bitsp_adts_header[5] = (uint8_t)((adtsLen & 0x7) << 5);       //frame length:value    低3bitsp_adts_header[5] |= 0x1f;                                 //buffer fullness:0x7ff 高5bitsp_adts_header[6] = 0xfc;      //?11111100?       //buffer fullness:0x7ff 低6bits// number_of_raw_data_blocks_in_frame://    表示ADTS幀中有number_of_raw_data_blocks_in_frame + 1個AAC原始幀。return 0;
}

全部代碼:

#include <stdio.h>
#include <libavutil/log.h>
#include <libavformat/avio.h>
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>#define ADTS_HEADER_LEN  7;const int sampling_frequencies[] = {96000,  // 0x088200,  // 0x164000,  // 0x248000,  // 0x344100,  // 0x432000,  // 0x524000,  // 0x622050,  // 0x716000,  // 0x812000,  // 0x911025,  // 0xa8000   // 0xb// 0xc d e f是保留的
};int adts_header(char * const p_adts_header, const int data_length,const int profile, const int samplerate,const int channels)
{int sampling_frequency_index = 3; // 默認使用48000hzint adtsLen = data_length + 7;int frequencies_size = sizeof(sampling_frequencies) / sizeof(sampling_frequencies[0]);int i = 0;for(i = 0; i < frequencies_size; i++){if(sampling_frequencies[i] == samplerate){sampling_frequency_index = i;break;}}if(i >= frequencies_size){printf("unsupport samplerate:%d\n", samplerate);return -1;}p_adts_header[0] = 0xff;         //syncword:0xfff                          高8bitsp_adts_header[1] = 0xf0;         //syncword:0xfff                          低4bitsp_adts_header[1] |= (0 << 3);    //MPEG Version:0 for MPEG-4,1 for MPEG-2  1bitp_adts_header[1] |= (0 << 1);    //Layer:0                                 2bitsp_adts_header[1] |= 1;           //protection absent:1                     1bitp_adts_header[2] = (profile)<<6;            //profile:profile               2bitsp_adts_header[2] |= (sampling_frequency_index & 0x0f)<<2; //sampling frequency index:sampling_frequency_index  4bitsp_adts_header[2] |= (0 << 1);             //private bit:0                   1bitp_adts_header[2] |= (channels & 0x04)>>2; //channel configuration:channels  高1bitp_adts_header[3] = (channels & 0x03)<<6; //channel configuration:channels 低2bitsp_adts_header[3] |= (0 << 5);               //original:0                1bitp_adts_header[3] |= (0 << 4);               //home:0                    1bitp_adts_header[3] |= (0 << 3);               //copyright id bit:0        1bitp_adts_header[3] |= (0 << 2);               //copyright id start:0      1bitp_adts_header[3] |= ((adtsLen & 0x1800) >> 11);           //frame length:value   高2bitsp_adts_header[4] = (uint8_t)((adtsLen & 0x7f8) >> 3);     //frame length:value    中間8bitsp_adts_header[5] = (uint8_t)((adtsLen & 0x7) << 5);       //frame length:value    低3bitsp_adts_header[5] |= 0x1f;                                 //buffer fullness:0x7ff 高5bitsp_adts_header[6] = 0xfc;      //?11111100?       //buffer fullness:0x7ff 低6bits// number_of_raw_data_blocks_in_frame://    表示ADTS幀中有number_of_raw_data_blocks_in_frame + 1個AAC原始幀。return 0;
}int main(int argc, char *argv[])
{int ret = -1;char errors[1024];char *in_filename = NULL;char *aac_filename = NULL;FILE *aac_fd = NULL;int audio_index = -1;int len = 0;AVFormatContext *ifmt_ctx = NULL;AVPacket pkt;// 設置打印級別av_log_set_level(AV_LOG_DEBUG);if(argc < 3){av_log(NULL, AV_LOG_DEBUG, "the count of parameters should be more than three!\n");return -1;}in_filename = argv[1];      // 輸入文件aac_filename = argv[2];     // 輸出文件if(in_filename == NULL || aac_filename == NULL){av_log(NULL, AV_LOG_DEBUG, "src or dts file is null, plz check them!\n");return -1;}aac_fd = fopen(aac_filename, "wb");if (!aac_fd){av_log(NULL, AV_LOG_DEBUG, "Could not open destination file %s\n", aac_filename);return -1;}// 打開輸入文件if((ret = avformat_open_input(&ifmt_ctx, in_filename, NULL, NULL)) < 0){av_strerror(ret, errors, 1024);av_log(NULL, AV_LOG_DEBUG, "Could not open source file: %s, %d(%s)\n",in_filename,ret,errors);return -1;}// 獲取解碼器信息if((ret = avformat_find_stream_info(ifmt_ctx, NULL)) < 0){av_strerror(ret, errors, 1024);av_log(NULL, AV_LOG_DEBUG, "failed to find stream information: %s, %d(%s)\n",in_filename,ret,errors);return -1;}// dump媒體信息
//    av_dump_format(ifmt_ctx, 0, in_filename, 0);// 初始化packetav_init_packet(&pkt);// 查找audio對應的steam indexaudio_index = av_find_best_stream(ifmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);if(audio_index < 0){av_log(NULL, AV_LOG_DEBUG, "Could not find %s stream in input file %s\n",av_get_media_type_string(AVMEDIA_TYPE_AUDIO),in_filename);return AVERROR(EINVAL);}// 打印AAC級別printf("audio profile:%d, FF_PROFILE_AAC_LOW:%d\n",ifmt_ctx->streams[audio_index]->codecpar->profile,FF_PROFILE_AAC_LOW);if(ifmt_ctx->streams[audio_index]->codecpar->codec_id != AV_CODEC_ID_AAC){printf("the media file no contain AAC stream, it's codec_id is %d\n",ifmt_ctx->streams[audio_index]->codecpar->codec_id);goto failed;}// 讀取媒體文件,并把aac數據幀寫入到本地文件while(av_read_frame(ifmt_ctx, &pkt) >=0 ){if(pkt.stream_index == audio_index){char adts_header_buf[7] = {0};adts_header(adts_header_buf, pkt.size,ifmt_ctx->streams[audio_index]->codecpar->profile,ifmt_ctx->streams[audio_index]->codecpar->sample_rate,ifmt_ctx->streams[audio_index]->codecpar->ch_layout.nb_channels);fwrite(adts_header_buf, 1, 7, aac_fd);  // 寫adts header , ts流不適用,ts流分離出來的packet帶了adts headerlen = fwrite( pkt.data, 1, pkt.size, aac_fd);   // 寫adts dataif(len != pkt.size){av_log(NULL, AV_LOG_DEBUG, "warning, length of writed data isn't equal pkt.size(%d, %d)\n",len,pkt.size);}}av_packet_unref(&pkt);}failed:// 關閉輸入文件if(ifmt_ctx){avformat_close_input(&ifmt_ctx);}if(aac_fd){fclose(aac_fd);}return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19534.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19534.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19534.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

今天來講講,抖音小店商品的上架流程以及優化細節~

大家好&#xff0c;我是噴火龍。 做抖音小店選品選好之后&#xff0c;優化上架商品也是很重要的&#xff0c;也有很多需要注意的細節&#xff0c;今天就來給大家講講。 首先&#xff0c;軟件采集&#xff0c;大致分為七步。 1. 以抖精靈為例&#xff0c;注冊賬號登錄&#x…

到無窮大和更遠,用分形更好

文章目錄 一、說明二、分形到底是什么&#xff1f;三、更多更深刻的四、引進無窮小會產生什么樣的怪事&#xff1f;五、希爾伯特曲線六、還有什么有趣的要補充的嗎&#xff1f; 一、說明 ???????數學領域有太多有趣的領域&#xff0c;領域我特別感興趣。這是一個奇妙的…

orm 查詢

問題 rayon,city 地區和市 地區不會空 市可能會空 job_name 工作名稱 可能會空 envalid_date 有效期間 一天 一個星期 一個月 不限 四種 offset 分頁的每次獲取20條數據 在ORM&#xff08;對象關系映射&#xff09;查詢中&#xff0c;您需要根據提…

代碼隨想錄算法訓練營day41 | 509. 斐波那契數、70. 爬樓梯、746. 使用最小花費爬樓梯

理論基礎 動態規劃中每一個狀態一定是由上一個狀態推導出來的&#xff0c;這一點就區分于貪心&#xff0c;貪心沒有狀態推導&#xff0c;而是從局部直接選最優的 動態規劃的解題步驟 確定dp數組&#xff08;dp table&#xff09;以及下標的含義確定遞推公式dp數組如何初始化確定…

怎么看自己電腦的配置?提升電腦的使用效率

了解自己電腦的配置是非常重要的&#xff0c;它可以幫助您了解電腦的性能水平&#xff0c;從而更好地選擇適合的軟件和游戲&#xff0c;或者進行系統升級和維護。然而&#xff0c;許多用戶可能不知道怎么看自己電腦的配置信息。本文將介紹三種簡單的方法&#xff0c;幫助您輕松…

android studio修改字體大小

android studio修改菜單欄、工具欄字體大小 android studio修改編輯框字體大小

常見制氮機的規格的及其特點介紹

制氮機根據其產氣量、應用領域和設計特點&#xff0c;可以分為多種規格&#xff0c;滿足不同行業的具體需求。以下是一些常見制氮機的規格的及其特點介紹&#xff1a; 制氮機的規格通常以其每小時制氮量進行分類。常見的規格有10L制氮機、50L制氮機、100L制氮機、500L制氮機以及…

復習leetcode第二題:兩數相加

本文會給出筆者自己的解答&#xff08;代碼較為冗余&#xff0c;其實就是屎山代碼&#xff09;以及優秀代碼的解析 下圖是題目 解法1&#xff08;筆者所使用的辦法&#xff09;&#xff1a; 解題思路&#xff1a; 以下思路是基于示例1&#xff08;上圖&#xff09;思考的 步驟…

2024年終端安全管理系統最新排名(2024終端安全管理軟件TOP5)

在2024年&#xff0c;隨著企業數字化轉型的加速和網絡安全威脅的日益嚴峻&#xff0c;終端安全管理系統的重要性愈發凸顯。終端作為企業數據交互的關鍵節點&#xff0c;其安全性直接關系到企業的運營和數據的完整性。因此&#xff0c;各大終端安全管理系統廠商紛紛推出新的產品…

基于Vue+Node.js的購物網站設計與實現-計算機畢業設計源碼28500

摘 要 近年來&#xff0c;隨著移動互聯網的快速發展&#xff0c;電子商務越來越受到網民們的歡迎&#xff0c;電子商務對國家經濟的發展也起著越來越重要的作用。簡單的流程、便捷可靠的支付方式、快捷暢通的物流快遞、安全的信息保護都使得電子商務越來越贏得網民們的青睞。現…

數據庫系統概念(第七周 第一堂)(E-R模型)

目錄 前言 基本概念 觀點與模型 作用與要求 E-R模型元素 實體&#xff08;entity&#xff09; 實體集&#xff08;entity set&#xff09; 屬性&#xff08;attribute&#xff09; 域&#xff08;domain&#xff09; 碼 &#xff08;key&#xff09; 聯系 &#x…

虛擬現實環境下的遠程教育和智能評估系統(五)

查閱相關VR眼動注意力聯合教育學相關論文 1.Exploring Eye Gaze Visualization Techniques for Identifying Distracted Students in Educational VR&#xff08;IEEE VR 2020&#xff09; 摘要&#xff1a;我們提出了一種架構&#xff0c;使VR教學代理能夠響應眼動追蹤監控…

Android HIDL接口添加

一.HIDL介紹 HIDL的全稱是HAL interface definition language&#xff08;硬件抽象層接口定義語言&#xff09;&#xff0c;是Android Framework 與Android HAL之間的接口。HIDL 旨在用于進程間通信 (IPC)&#xff0c;進程之間的通信 采用 Binder 機制。 二.HIDL 與AIDL 的對…

JVM之【運行時數據區1】

JVM簡圖 運行時數據區簡圖 一、程序計數器&#xff08;Program Counter Register&#xff09; 1.程序計數器是什么&#xff1f; 程序計數器是JVM內存模型中的一部分&#xff0c;它可以看作是一個指針&#xff0c;指向當前線程所執行的字節碼指令的地址。每個線程在執行過程中…

Python魔法之旅-魔法方法(04)

目錄 一、概述 1、定義 2、作用 二、主要應用場景 1、構造和析構 2、操作符重載 3、字符串和表示 4、容器管理 5、可調用對象 6、上下文管理 7、屬性訪問和描述符 8、迭代器和生成器 9、數值類型 10、復制和序列化 11、自定義元類行為 12、自定義類行為 13、類…

Tensorflow入門實戰 P02-彩色圖片分類

目錄 1、序言 2、主要代碼 3、運行結果展示 &#xff08;1&#xff09;展示cifar10里面的20張圖片 &#xff08;2&#xff09;預測的圖片 &#xff08;3&#xff09;模型評估 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K…

postgressql——ReadBuffer_common函數(7)

PostgreSQL中ReadBuffer_common函數 數據結構 BufferDesc 共享緩沖區的共享描述符(狀態)數據 typedef struct BufferDesc {//buffer tagBufferTag tag; /* ID of page contained in buffer *///buffer索引編號(0開始)int buf_id; /* buffers i…

大語言模型(一)OLMo

一、簡介 OLMo 是由AI2 發布的大語言模型以及構建框架,與大多數之前的嘗試只發布模型權重和推理代碼不同,OLMo 開源了整個框架,包括訓練數據、訓練代碼以及模型評估代碼。 OLMo框架包括構建和研究語言模型所需的工具和資源。對于訓練和建模,它包括完整的模型權重、訓練代…

SZJG-離線環境成功安裝Python和pip

在離線環境下安裝Python和pip&#xff0c;可以按照以下步驟進行。假設你已經下載了Python的安裝包 (Python-3.10.13.tgz)。 步驟 1&#xff1a;準備安裝包 將 Python-3.10.13.tgz 拷貝到目標機器上的一個目錄中&#xff0c;例如 /home/user/。 步驟 2&#xff1a;解壓安裝包…

4萬字長文讓人看懂ElementUI面試題及參考答案

ElementUI是什么?請簡述其主要特點。 ElementUI是一個基于Vue.js的桌面端組件庫,由餓了么團隊開發并維護。它旨在為開發人員提供一套用于構建網頁應用程序的高質量UI組件。ElementUI遵循Vue.js的設計思想,使得開發者可以快速地構建出風格統一、功能豐富的界面。 主要特點:…