ffmpeg源碼分析及mp4文件解析

?

一.mp4文件的組織


1. mp4文件的box(ffmpeg中叫atom)


mp4是由一系列的box組成的,每個box的header是8個字節(4字節的長度,4字節的type)
第一個box比較特殊,其type類型為ftyp,還包含一個sub-type

0000000:?0000 0020 6674 7970 6973 6f6d 0000 0200?...?ftypisom....
0000010:?6973 6f6d 6973 6f32 6176 6331 6d70 3431 isomiso2avc1mp41
0000020:?0000 0008 6672 6565?0609 6f8e 6d64 6174?....free..o.mdat
0000030:?0000 028c 0605 ffff 88dc 45e9 bde6 d948?..........E....H
0000040:?b796 2cd8 20d9 23ee ef78 3236 3420 2d20?..,.?.#..x264?-?
0000050:?636f 7265 2031 3030 202d 2048 2e32 3634 core 100?-?H.264?
0000060:?2f4d 5045 472d 3420 4156 4320 636f 6465?/MPEG-4 AVC code

0000 0020 6674 7970??--> 第1個box的長度為0x20, type=ftyp
6973 6f6d ?-->其sub-type=isom
0000 0008 6672 6565??--> 第2個box的長度為0x08, type=free
0609 6f8e 6d64 6174 ? --> 第3個box的長度為0x06096F8E, type=mdat
由此可以看出第4個box:
0x06096F8E+0x08+0x20=0x06096FB6處是第4個box
000c ca81 6d6f 6f76 ? ?--> 第4個box的長度是0x0cca81, type=moov

?

1.2 計算文件的大小


所以整個文件的大小為?0x20+0x08+0x0x06096F8E+0x0cca81=0x6163A37=102119991
cong@msi:/work/ffmpeg/ffmpeg-3.0.1$ ls -l ../san.mp4
-rw-rw-r-- 1 cong cong 102119991 Sep 10 ?2015 ../san.mp4
1.3?關于box-type:

box-type可以是如下一個:

"ftyp",?"mdat",?"moov",?"pnot",?"udta",?"uuid",?"moof",?"free",?"skip",?"jP2 ",?"wide",?"load",?"ctab",?"imap",?"matt",?"kmat",?"clip",?"crgn",?"sync",?"chap",?"tmcd",?"scpt",?"ssrc",?"PICT".

sub-type可以取如下一個:

sub-type which must be one of values:?"avc1",?"iso2",?"isom",?"mmp4",?"mp41",?"mp42",?"mp71",?"msnv",?"ndas",?"ndsc",?"ndsh",?"ndsm",?"ndsp",?"ndss",?"ndxc","ndxh",?"ndxm",?"ndxp",?"ndxs".

?

1.4總結


一個mov文件就是由ftyp free mdat moov這四個部分組成
ftyp --> 格式
free --> 不關心
mdat --> 音視頻數據
moov --> 包含一系列次級box:一個mvhd及多個trak

?

1.5 如下圖所示:



清楚了

?

二. BOX的具體解析


2.1FileTypeBox--> ftype解析

0000000:?0000 0020 6674 7970 6973 6f6d 0000 0200?...?ftypisom....
0000010:?6973 6f6d 6973 6f32 6176 6331 6d70 3431 isomiso2avc1mp41

0000 0020 6674 7970??--> 第1個box的長度為0x20, type=ftyp
6973 6f6d ? ? ? ? ? ? ? ? ? ? --> major_brand: isom
0000 0200 ? ? ? ? ? ? ? ? ? ?--> minor_verion: isom的版本號
6973 6f6d 6973 6f32 6176 6331 6d70 3431--> 兼容isom iso2 avc1 mp41這四個協議

ISO14496-12 的 4.3.2 Syntax?
aligned(8)?class?FileTypeBox?extends Box(‘ftyp’)?{?unsigned?int(32)?major_brand;?unsigned?int(32)?minor_version;?unsigned?int(32)?compatible_brands[];?//?to?end?of the box?
}

沒有ftyp后面就不知道用什么去解析這個媒體文件


2.2?Free Space Box -->free解析


沒啥作用

ISO14496-12 的8.24.2 Syntax?
aligned(8)?class?FreeSpaceBox extends Box(free_type)?{?unsigned?int(8)?data[];?
}

2.3?Media Data Box -->mdat解析


這個box里面全部都是數據

ISO14496-12 的8.2.2 Syntax?
aligned(8)?class?MediaDataBox extends Box(‘mdat’)?{?bit(8)?data[];?
}

2.4?Movie Box ?-->moov解析 (很復雜)

6096fb0:?9002 1900 2380?000c ca81 6d6f 6f76?0000?....#.....moov..
6096fc0:?006c 6d76 6864 0000 0000 7c25 b080 7c25?.lmvhd....|%..|%
6096fd0:?b080 0000 03e8 0014 6995 0001 0000 0100?........i.......
6096fe0:?0000 0000 0000 0000 0000 0001 0000 0000?................
6096ff0:?0000 0000 0000 0000 0000 0001 0000 0000?................
6097000:?0000 0000 0000 0000 0000 4000 0000 0000?..........@.....
6097010:?0000 0000 0000 0000 0000 0000 0000 0000?................
6097020:?0000 0000 0000 0000 0003?0005 bf9d 7472?..............tr
6097030:?616b?0000 005c 746b 6864 0000 000f 7c25 ak...\tkhd....|%
6097040:?b080 7c25 b080 0000 0001 0000 0000 0014?..|%............
6097050:?6595 0000 0000 0000 0000 0000 0000 0000?e...............
6097060: 0000 0001 0000 0000 0000 0000 0000 0000 ?................
6097070: 0000 0001 0000 0000 0000 0000 0000 0000 ?................
6097080: 0000 4000 0000 01d6 0000 0160 0000?0000??..@........`....
6097090: 0024?6564 7473 0000 001c 656c 7374 0000 ?.$edts....elst..
60970a0: 0000?0000?0001 0014 6595 0000 03e9 0001 ?........e.......
60970b0: 0000?0005 bf15 6d64 6961 0000 0020 6d64 ?......mdia... md

000c ca81 6d6f 6f76 ? ?--> moov的長度是0x0cca81, type=moov
0000?006c 6d76 6864 ?-->?mvhd的長度是0x6c ? ?,type=mvhd
0000 0000 ? ? ? ? ? ? ? ? ? ?--> version=0x0
7c25 b080?7c25 b080 ?--> create_time=modify_time=0x7c25b080
0000 03e8????????????????? ? --> timescale=0x3e8=1000 ?
0014 6995 ?????????????? ? ? --> duration=0x146995(單位是time_units)
0001 0000 ? ? ? ? ? ? ? ? ? ?--> rate=0x00010000
0100 ? ? ? ? ? ? ? ? ? ? ? ? ? ? --> volume=0x0100
0005 bf9d 7472 616b? ?--> track的長度是0x5bf9d,type=trak
0000 005c 746b?6864 ?--> tkhd的長度是0x5c, type=tkhd
0000 ? ? ? ? ? ? ? ? ? ? ? ? ? ? -->version
000F ? ? ? ? ? ? ? ? ? ? ? ? ? ? --> flag
7c25 b080 7c25 b080 ?-->create_time=modify_time=0x7c25b080
0000 0001?????????????? ? ? ?--> trackID=1
0000 0000 ? ? ? ? ? ? ? ? ? ?--> reserve
0014 6595 ? ? ? ? ? ? ? ? ? ?--> duration=0x146595
0000 0000 ?????????????? ? ? -->?reserved
0000 0000 ?????????????? ? ??-->?reserved
0000 0000 ?????????????? ? ??-->?layer+group
0000?0000 ?????????????? ? ??-->?volum+resever
0001 0000 0000 0000 0000 0000 ? matrix
0000?0000 0001 0000 0000 0000?
0000 0000 0000 ?0000 4000 0000?
01d6 0000 0160 0000 ? -->??width=0x1d6?height=0x160(這兒都需要向右移16位)
0000?0024 6564 7473 ? -->edts的長度是0x24,type=edts

注意:?
a.媒體文件在播放過程中用的時間單位,是由timescale計算出來的
一個time units=1s/timescale=1ms,這兒1 time_unts=1ms
b.通過duration可計算媒體的播放時間 0x146995*1ms=1337749ms=1337.749s,對上了


附1.mvhd

ISO14496-12 的8.3.2 Syntax?
aligned(8)?class?MovieHeaderBox extends FullBox(‘mvhd’,?version,?0)?{?
if?(version==1)?{?unsigned?int(64)?creation_time;?unsigned?int(64)?modification_time;?unsigned?int(32)?timescale;?unsigned?int(64)?duration;?
}?else?{?//?version==0?unsigned?int(32)?creation_time;?unsigned?int(32)?modification_time;?unsigned?int(32)?timescale;?unsigned?int(32)?duration;?
}?
template?int(32)?rate?=?0x00010000;?//?typically 1.0?
template?int(16)?volume?=?0x0100;?//?typically,?full volume?
const?bit(16)?reserved?=?0;?
const?unsigned?int(32)[2]?reserved?=?0;?
template?int(32)[9]?matrix?=?{?0x00010000,0,0,0,0x00010000,0,0,0,0x40000000?};?
//?Unity matrix?
bit(32)[6]?pre_defined?=?0;?
unsigned?int(32)?next_track_ID;?
}

附2.trak

?

8.5.2 Syntax aligned(8)?class?TrackHeaderBox?
extends FullBox(‘tkhd’,?version,?flags){?if?(version==1)?{?unsigned?int(64)?creation_time;?unsigned?int(64)?modification_time;?unsigned?int(32)?track_ID;?const?unsigned?int(32)?reserved?=?0;?unsigned?int(64)?duration;?}?else?{?//?version==0?unsigned?int(32)?creation_time;?unsigned?int(32)?modification_time;?unsigned?int(32)?track_ID;?const?unsigned?int(32)?reserved?=?0;?unsigned?int(32)?duration;?}?const?unsigned?int(32)[2]?reserved?=?0;?template?int(16)?layer?=?0;?template?int(16)?alternate_group?=?0;?template?int(16)?volume?=?{if?track_is_audio 0x0100?else?0};?const?unsigned?int(16)?reserved?=?0;?template?int(32)[9]?matrix=?{?0x00010000,0,0,0,0x00010000,0,0,0,0x40000000?};?//?unity matrix?unsigned?int(32)?width;?unsigned?int(32)?height;?
}

?


三.ffmpeg中對mp4的處理


3.1 對mp4文件的probe -->?在libavformat/mov.c中


有兩個宏需要關注一下:

#define MKTAG(a,b,c,d)?((a)?|?((b)?<<?8)?|?((c)?<<?16)?|?((unsigned)(d)?<<?24))# define AV_RL32(x)?\(((uint32_t)((const?uint8_t*)(x))[3]?<<?24)?|?\(((const?uint8_t*)(x))[2]?<<?16)?|?\(((const?uint8_t*)(x))[1]?<<?8)?|?\((const?uint8_t*)(x))[0])

這兩個宏都是把4個char組成一個int

3.2 mov_probe

static?int?mov_probe(AVProbeData?*p)
{int64_t offset;uint32_t tag;int?score?=?0;int?moov_offset?=?-1;dbmsg();/*?check file header?*/offset?=?0;for?(;;)?{tag?=?AV_RL32(p->buf?+?offset?+?4); ? ?//將p->buf+4即‘f’ ‘t’ 'y' 'p'組成一個intswitch(tag)?{ ? ? ? ? ? ? ? ? ? ? ? ? ?//判斷這個int是不是ftypcase?MKTAG('f','t','y','p'):score?=?AVPROBE_SCORE_MAX; ? ??//如果是的話score=100,說明就是mov格式的文件break;}}return score;
}

精簡一下mov_probe,其實就是判斷第一個box是不是ftyp,若是則就是mov格式的了。


3.3.1 對ftype的讀取

static?int?mov_read_ftyp(MOVContext?*c,?AVIOContext?*pb,?MOVAtom atom)
{//讀4個字節的major_brand,并存到dict中ffio_read_size(pb,?type,?4);av_dict_set(&c->fc->metadata,?"major_brand",?type,?0);//讀4個字節的minor_ver,并存到dict中minor_ver?=?avio_rb32(pb);av_dict_set_int(&c->fc->metadata,?"minor_version",?minor_ver,?0);//讀剩余的字節,即comp_brands_str,并存到dict中comp_brand_size?=?atom.size?-?8;? ??//atom.size己經是去除8字節頭,余下的sizeffio_read_size(pb,?comp_brands_str,?comp_brand_size);comp_brands_str[comp_brand_size]?=?0;av_dict_set(&c->fc->metadata,?"compatible_brands",?comp_brands_str,?0);return 0;
}

3.3.2 對free的讀取

static?int?mov_read_free(MOVContext?*c,?AVIOContext?*pb,?MOVAtom atom)
{//沒什么作用,只是讀取出來,把文件指針指向下一下box而己avio_read(pb,?content,?FFMIN(sizeof(content),?atom.size));return 0;
}

3.3.3對mdat的讀取

static?int?mov_read_mdat(MOVContext?*c,?AVIOContext?*pb,?MOVAtom atom)
{//mdat更簡單,只把標志設置了一下c->found_mdat=1;return 0;?/*?now?go?for?moov?*/
}

3.3.4對moov的讀取

?


三.附錄: ISO/IEC 14496 MPEG的協議標準


轉自:?http://blog.csdn.net/yu_yuan_1314/article/details/9406587

  1. ISO/IEC 14496是MPEG專家組制定的MPEG-4標準于1998年10月公布第1版,1999年1月成為國際標準,1999年12月公布了第2版,2000年初成為國際標準。
  2. 全文分為27個部分:
  3. (1)ISO/IEC 14496-1系統部分,描述視頻和音頻數據流的控制、同步以及混合方式(即混流 Multiplexing,簡寫為MUX)。
  4. (2)ISO/IEC 14496-2視頻部分,定義了一個對各種視覺信息(包括自然視頻、靜止紋理、計算機合成圖形等等)的編解碼器。(例如XviD編碼就屬于MPEG-4 Part 2)。
  5. (3)ISO/IEC 14496-3音頻部分,定義了一個對各種音頻信號進行編碼的編解碼器的集合。包括高級音頻編碼(Advanced Audio Coding,縮寫為AAC)的若干變形和其他一些音頻/語音編碼工具。
  6. (4)ISO/IEC 14496-4一致性部分,定義了比特流和設備的一致性條件,用來測試MPEG-4的實現。
  7. (5)ISO/IEC 14496-5參考軟件,提供了用于演示功能和說明本標準其他部分功能的軟件。
  8. (6)ISO/IEC 14496-6多媒體傳送整體框架DMIF,這是MPEG-4應用層與傳輸網絡的接口,定義了通信協議,使MPEG-4系統的數據流能進入各種傳輸網絡。還包含一個存儲格式MP4,用于存儲編碼的場景。
  9. (7)?ISO/IEC 14496-7優化的參考軟件,提供了對實現進行優化的例子(這里的實現指的是第五部分)。
  10. (8)ISO/IEC 14496-8在IP網絡上傳輸,定義了在IP網絡上傳輸MPEG-4內容的方式。
  11. (9)ISO/IEC 14496-9參考硬件描述,提供了用于演示怎樣在硬件上實現本標準其他部分功能的硬件設計方案
  12. (10)ISO/IEC 14496-10高級視頻編碼AVC,定義了一個視頻編解碼器(codec)。AVC和XviD都屬于MPEG-4編碼,但由于AVC屬于MPEG-4 Part 10,在技術特性上比屬于MPEG-4 Part2的XviD要先進。另外,它和ITU-T H.264標準是一致的,故又稱為H.264。
  13. (11)ISO/IEC 14496-11場景描述和應用引擎。
  14. (12)ISO/IEC 14496-12ISO媒體文件格式,定義了一個存儲媒體內容的文件格式。
  15. (13)ISO/IEC 14496-13知識產權管理和保護(IPMP:Intellectual?Property?Management?and?Protection)擴展。
  16. (14)ISO/IEC 14496-14MP4文件格式,定義了基于第十二部分的用于存儲MPEG-4內容的容器文件格式。
  17. (15)ISO/IEC 14496-15AVC文件格式,定義了基于第十二部分的用于存儲第十部分的視頻內容的文件格式。
  18. (16)ISO/IEC 14496-16動畫框架擴展AFX(Animation Framework eXtension)。
  19. (17)ISO/IEC 14496-17同步文本字幕格式。
  20. (18)ISO/IEC 14496-18字體壓縮和流式傳輸(針對公開字體格式)。
  21. (19)ISO/IEC 14496-19合成材質流(Synthesized Texture Stream)。
  22. (20)ISO/IEC 14496-20簡單場景表示(LASeR?for?Lightweight Scene Representation)。
  23. (21)ISO/IEC 14496-21用于描繪(Rendering)的MPEG-J拓展。
  24. (22)ISO/IEC 14496-22開放字體格式(Open Font Format)。
  25. (23)ISO/IEC 14496-2符號化音樂表示(Symbolic Music Representation)。
  26. (24)ISO/IEC 14496-24音頻與系統交互作用(Audio?and?systems interaction)。
  27. (25)ISO/IEC 14496-253D圖形壓縮模型(3D Graphics Compression Model)。
  28. (26)ISO/IEC 14496-26音頻一致性檢查:定義了測試音頻數據與ISO/IEC 14496-3是否一致的方法(Audio conformance)。
  29. (27)ISO/IEC 14496-273D圖形一致性檢查:定義了測試3D圖形數據與ISO/IEC 14496-11:2005,?ISO/IEC 14496-16:2006,?ISO/IEC 14496-21:2006,?和 ISO/IEC 14496-25:2009是否一致的方法(3D Graphics conformance)。

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

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

相關文章

【數據庫原理及應用】經典題庫附答案(14章全)——第七章:數據庫恢復技術

【數據庫原理及應用】經典題庫附答案(14章全)——第一章:數據庫基礎知識 【數據庫原理及應用】經典題庫附答案(14章全)——第二章:關系數據庫知識 【數據庫原理及應用】經典題庫附答案(14章全)——第三章:結構化查詢語言SQL 【數據庫原理及應用】經典題庫附答案(14章…

C++庫(Google Breakpad)

Google Breakpad是什么&#xff1f; 一個開源的多平臺崩潰報告系統。 Google breakpad是一個非常實用的跨平臺的崩潰轉儲和分析模塊&#xff0c;它支持Windows&#xff0c;Linux和Mac和Solaris。由于他本身跨平臺&#xff0c;所以很大程度上減少了我們在平臺移植時的工作&#…

java eleven進度條

2019獨角獸企業重金招聘Python工程師標準>>> 一個矩形組件 MethodDescribleJProgrssBar()不帶進度字符&#xff0c;最小值0最大值100的水平進度條JProgressBar(int orient)VERTICAL/HORIZONTALJProgressBar(int in,int max)指定最大最小的水平進度條JProgressBar(in…

Docker:多階段構建 ASP.NET Core 應用鏡像

本文選自『.NET大牛之路』知識星球&#xff0c;發布于2022年05月25日。今天我們一起來寫 Dockerfile 構建一個 ASP.NET Core 應用鏡像&#xff0c;同時還會將鏡像發布到 Docker Hub 倉庫。1創建示例 Web 應用程序為了演示&#xff0c;我們先創建一個 ASP.NET Core 應用程序&…

[轉]【JAVA各版本特性】JAVA 1.0

閑來想了解下各版本之間的特性&#xff0c;搜索沒有最新的特性說明&#xff0c;故想寫一份。廢話不多說。 JDK Version 1.0 1996-01-23 Oak(橡樹) 初代版本&#xff0c;偉大的一個里程碑&#xff0c;但是是純解釋運行&#xff0c;使用外掛JIT&#xff0c;性能比較差&#xff0…

【數據庫原理及應用】經典題庫附答案(14章全)——第八章:數據庫并發控制

【數據庫原理及應用】經典題庫附答案(14章全)——第一章:數據庫基礎知識 【數據庫原理及應用】經典題庫附答案(14章全)——第二章:關系數據庫知識 【數據庫原理及應用】經典題庫附答案(14章全)——第三章:結構化查詢語言SQL 【數據庫原理及應用】經典題庫附答案(14章…

Tomcat(Windows)

百度云&#xff1a;鏈接&#xff1a;http://pan.baidu.com/s/1pKYrf79 密碼&#xff1a;56t0官網下載網址&#xff1a;http://archive.apache.org/dist/tomcat/tomcat-9/v9.0.0.M13/bin/ 轉載于:https://www.cnblogs.com/haxianhe/p/9271103.html

北京Uber優步司機獎勵政策(3月11日)

滴快車單單2.5倍&#xff0c;注冊地址&#xff1a;http://www.udache.com/ 如何注冊Uber司機(全國版最新最詳細注冊流程)/月入2萬/不用搶單&#xff1a;http://www.cnblogs.com/mfryf/p/4612609.html 優步獎勵低/不掙錢/怎么辦?看這里&#xff1a;http://www.cnblogs.com/mfry…

【招聘(廣州)】成功易(廣州).Net Core中高級開發工程師

成功易&#xff08;廣州&#xff09;信息技術有限公司簡介成功易是一家集團性公司&#xff0c;創立于2002年&#xff0c;總部位于北京&#xff0c;旗下擁有7家子公司。廣州成功易成立于2019年&#xff0c;人員逐漸增長150人&#xff0c;組織架構完善&#xff0c; 我們是騰訊廣告…

【數據庫原理及應用】經典題庫附答案(14章全)——第九章:數據庫安全性

【數據庫原理及應用】經典題庫附答案(14章全)——第一章:數據庫基礎知識 【數據庫原理及應用】經典題庫附答案(14章全)——第二章:關系數據庫知識 【數據庫原理及應用】經典題庫附答案(14章全)——第三章:結構化查詢語言SQL 【數據庫原理及應用】經典題庫附答案(14章…

webstrom使用方法

一、設置file-settings- -color&fonts設置&#xff0c;字體 主體 -file and code templates模板ctrlr 查找&#xff0c;替換1 雙擊shift 快速查找2 file -new project 新建文件夾3 file-new 新建html css js等4 右鍵-local history 查看歷史5 雙擊選擇某個元素&#xff0c;…

ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' 解決Mysql錯誤

1、停止 服務 PS C:\WINDOWS\system32> net stop mysql mysql 服務正在停止. mysql 服務已成功停止。2、執行 mysqld --shared-memory --skip-grant-tables PS C:\WINDOWS\system32> mysqld --shared-memory --skip-grant-tables ------以下操作 另外打開一個 終端--…

xcode 設置快捷鍵 整行上下移動

2019獨角獸企業重金招聘Python工程師標準>>> 設置整行代碼上下移動&#xff1a;找到Xcode中的自帶的配置文件&#xff1a;/Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/IDETextKeyBindingSet.plist用文本編輯IDETextKeyBind…

【數據庫原理及應用】經典題庫附答案(14章全)——第十章:數據庫完整性

【數據庫原理及應用】經典題庫附答案(14章全)——第一章:數據庫基礎知識 【數據庫原理及應用】經典題庫附答案(14章全)——第二章:關系數據庫知識 【數據庫原理及應用】經典題庫附答案(14章全)——第三章:結構化查詢語言SQL 【數據庫原理及應用】經典題庫附答案(14章…

用.Net Core接入微信公眾號開發

Part1前言最近想寫一點基于.Net Core微信公眾號開發的文章Part2測試公眾號申請測試公眾號申請地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?tsandbox/login微信公眾號開發文檔:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html通過微…

騰訊、百度、小米等7家互聯網各大廠的中臺建設怎么樣了?

中臺是真正為前臺而生的平臺&#xff08;可以是技術平臺&#xff0c;業務能力甚至是組織機構&#xff09;&#xff0c;它存在的唯一目的就是更好的服務前臺規模化創新&#xff0c;進而更好的響應服務引領用戶&#xff0c;使企業真正做到自身能力與用戶需求的持續對接。 以下轉載…

JAVA基礎知識之網絡編程——-基于AIO的異步Socket通信

異步IO 下面摘子李剛的《瘋狂JAVA講義》 按照POSIX標準來劃分IO&#xff0c;分為同步IO和異步IO。對于IO操作分為兩步&#xff0c;1&#xff09;程序發出IO請求。 2&#xff09;完成實際的IO操作。 阻塞IO和非阻塞IO都是針對第一步來劃分的&#xff0c;如果發出IO請求會阻塞線程…

基于.NetCore開發博客項目 StarBlog - (13) 加入友情鏈接功能

系列文章基于.NetCore開發博客項目 StarBlog - (1) 為什么需要自己寫一個博客&#xff1f;基于.NetCore開發博客項目 StarBlog - (2) 環境準備和創建項目基于.NetCore開發博客項目 StarBlog - (3) 模型設計基于.NetCore開發博客項目 StarBlog - (4) markdown博客批量導入基于.N…

【數據庫原理及應用】經典題庫附答案(14章全)——第十二章:數據庫技術新發展

【數據庫原理及應用】經典題庫附答案(14章全)——第一章:數據庫基礎知識 【數據庫原理及應用】經典題庫附答案(14章全)——第二章:關系數據庫知識 【數據庫原理及應用】經典題庫附答案(14章全)——第三章:結構化查詢語言SQL 【數據庫原理及應用】經典題庫附答案(14章…

EditPlus 文件查找功能:在指定文件夾,用正則查尋包含指定內容的文件,指定文件類型,并排除特殊文件名文件

單擊菜單欄上的【Search】&#xff08;查找&#xff09;&#xff0c;選擇【Find in Files】&#xff08;在文件中查找&#xff09;命令&#xff1a; 查找項&#xff1a;正則查找video標簽&#xff0c;src為不包含http的mp4 <video src"([^http].*\.mp4)" width&q…