[{"data":1,"prerenderedAt":1022},["ShallowReactive",2],{"navigation":3,"posts-undefined-音视频处理-0-999":20},[4,8,12,16],{"title":5,"path":6,"stem":7},"首页","\u002F","00.index",{"title":9,"path":10,"stem":11},"文章","\u002Fposts","01.posts",{"title":13,"path":14,"stem":15},"动态","\u002Fmoments","02.moments",{"title":17,"path":18,"stem":19},"关于","\u002Fabout","09.about",[21],{"id":22,"title":23,"body":24,"class":1002,"cover":1003,"coverSize":1002,"date":1004,"description":119,"draft":1005,"extension":1006,"hideComments":1005,"location":1002,"meta":1007,"navigation":324,"path":1008,"readingTime":1009,"seo":1014,"sitemap":1015,"stem":1016,"tags":1017,"time":1002,"weather":1002,"__hash__":1021},"posts\u002Fposts\u002F2024\u002F20240522.get-video-rotation-by-mp4box-js.md","MP4Box.js 获取视频旋转信息",{"type":25,"value":26,"toc":995},"minimark",[27,34,38,49,53,62,80,84,95,105,110,113,195,212,215,970,973,982,991],[28,29,30],"blockquote",{},[31,32,33],"p",{},"声明：本文部分内容使用 ChatGPT 生成",[35,36,37],"h2",{"id":37},"序言",[31,39,40,41,45,46,48],{},"公司的一个项目中用到 ",[42,43,44],"code",{},"MP4Box.js"," 在上传视频前去解析视频的宽高，并且根据宽高的比例做一些拦截，只允许 16:9 横屏的素材。后来发现一个问题，部分竖屏的素材也被提交上来了。经过研究，发现这类视频可能是由手机拍摄的，带了旋转信息，因此 ",[42,47,44],{}," 中的原始宽高有问题。",[35,50,52],{"id":51},"什么是-mp4boxjs","什么是 MP4Box.js",[31,54,55,61],{},[56,57,44],"a",{"href":58,"rel":59},"https:\u002F\u002Fgithub.com\u002Fgpac\u002Fmp4box.js",[60],"nofollow"," 是一个支持在浏览器中处理 MP4 文件的 JS 库，可以实现获取 MP4 文件的元数据信息、分割文件、提取媒体样本等高级处理能力。",[31,63,64,65,67,68,71,72,75,76,79],{},"通过 ",[42,66,44],{}," 可以从 ",[42,69,70],{},"videoTrack"," 中的 ",[42,73,74],{},"width"," 和 ",[42,77,78],{},"height"," 中获取视频的宽高，对于一般的视频都是 OK 的，但是带了旋转信息，通过 MP4Box 读出的宽高仍是旋转前的宽高，导致在一些场景下的判断会有问题。那么，如何获取到视频的旋转信息呢？",[35,81,83],{"id":82},"mp4boxjs-如何获取旋转信息","MP4Box.js 如何获取旋转信息",[31,85,86,87,90,91,94],{},"在 MP4 和 MOV 文件中，旋转信息通常存储在 ",[42,88,89],{},"tkhd"," (Track Header Box) 或 ",[42,92,93],{},"mvhd"," (Movie Header Box) 中。这个信息会影响视频轨道的显示方式。",[31,96,97,98,100,101,104],{},"Track Header Box (",[42,99,89],{},")：包含一个 ",[42,102,103],{},"matrix"," 的矩阵，描述视频帧的旋转。",[31,106,107,109],{},[42,108,103],{}," 字段中的旋转信息是通过一个 3x3 矩阵来表示的，具体可以参考 ISO\u002FIEC 14496-12 标准。",[31,111,112],{},"具体实现代码：",[114,115,120],"pre",{"className":116,"code":117,"language":118,"meta":119,"style":119},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","Math.atan2(videoTrack.matrix[1], videoTrack.matrix[0]) * (180 \u002F Math.PI)\n","ts","",[42,121,122],{"__ignoreMap":119},[123,124,127,131,135,139,142,144,147,151,154,157,160,162,164,167,170,174,177,180,183,186,188,192],"span",{"class":125,"line":126},"line",1,[123,128,130],{"class":129},"su5hD","Math",[123,132,134],{"class":133},"sP7_E",".",[123,136,138],{"class":137},"sGLFI","atan2",[123,140,141],{"class":129},"(videoTrack",[123,143,134],{"class":133},[123,145,146],{"class":129},"matrix[",[123,148,150],{"class":149},"srdBf","1",[123,152,153],{"class":129},"]",[123,155,156],{"class":133},",",[123,158,159],{"class":129}," videoTrack",[123,161,134],{"class":133},[123,163,146],{"class":129},[123,165,166],{"class":149},"0",[123,168,169],{"class":129},"]) ",[123,171,173],{"class":172},"smGrS","*",[123,175,176],{"class":129}," (",[123,178,179],{"class":149},"180",[123,181,182],{"class":172}," \u002F",[123,184,185],{"class":129}," Math",[123,187,134],{"class":133},[123,189,191],{"class":190},"s_hVV","PI",[123,193,194],{"class":129},")\n",[31,196,197,198,201,202,204,205,208,209,211],{},"其中，",[42,199,200],{},"Math.atan2"," 是 JS 中的一个数学函数，用于计算从点 (0, 0) 到点 (x, y) 之间的直线与 x 轴正方向之间的角度，角度的单位为弧度。这个函数能够处理所有的象限，因此可以返回从 -π 到 π 之间的值。",[42,203,200],{}," 函数在计算几何、游戏开发、图形编程以及需要处理极坐标转换等场景中非常有用。与 ",[42,206,207],{},"Math.atan"," 不同，",[42,210,200],{}," 可以处理 (x, y) 都为零的情况，并根据 x 和 y 的符号确定正确的象限。",[35,213,214],{"id":214},"完整实现代码",[114,216,218],{"className":116,"code":217,"language":118,"meta":119,"style":119},"function getVideoMetaInfo(file: File): Promise\u003Cany> {\n  return new Promise((resolve, reject) => {\n    const mp4boxFile = MP4Box.createFile()\n\n    mp4boxFile.onReady = function (info: any) {\n      if (info && info.videoTracks?.length) {\n        const videoTrack = info.videoTracks[0]\n        const result = {\n          duration: videoTrack.duration \u002F videoTrack.timescale,\n          codec: videoTrack.codec,\n          fps: videoTrack.nb_samples \u002F (videoTrack.duration \u002F videoTrack.timescale),\n          width: videoTrack.video.width,\n          height: videoTrack.video.height,\n          rotation: Math.atan2(videoTrack.matrix[1], videoTrack.matrix[0]) * (180 \u002F Math.PI),\n        }\n\n        resolve(result)\n      }\n    }\n\n    mp4boxFile.onError = function (info: any) {\n      console.error('mp4box.js error', info)\n      reject(info)\n    }\n\n    const reader = file.stream().getReader()\n    let offset = 0\n    reader.read().then(function getNextChunk({ done, value }: any) {\n      if (done) {\n        mp4boxFile.flush()\n        return\n      }\n\n      const copy = value.buffer\n      copy.fileStart = offset\n      offset += value.length\n      mp4boxFile.appendBuffer(copy)\n      reader.read().then(getNextChunk)\n    })\n  })\n}\n",[42,219,220,264,296,319,326,356,389,413,425,452,469,506,527,547,607,613,618,631,637,643,648,674,703,715,720,725,753,767,814,828,841,847,852,857,875,891,907,925,948,956,964],{"__ignoreMap":119},[123,221,222,226,229,232,236,239,243,246,248,251,254,258,261],{"class":125,"line":126},[123,223,225],{"class":224},"sbsja","function",[123,227,228],{"class":137}," getVideoMetaInfo",[123,230,231],{"class":133},"(",[123,233,235],{"class":234},"s99_P","file",[123,237,238],{"class":172},":",[123,240,242],{"class":241},"sbgvK"," File",[123,244,245],{"class":133},")",[123,247,238],{"class":172},[123,249,250],{"class":241}," Promise",[123,252,253],{"class":133},"\u003C",[123,255,257],{"class":256},"sZMiF","any",[123,259,260],{"class":133},">",[123,262,263],{"class":133}," {\n",[123,265,267,271,274,276,279,281,284,286,289,291,294],{"class":125,"line":266},2,[123,268,270],{"class":269},"sVHd0","  return",[123,272,273],{"class":172}," new",[123,275,250],{"class":256},[123,277,231],{"class":278},"skxfh",[123,280,231],{"class":133},[123,282,283],{"class":234},"resolve",[123,285,156],{"class":133},[123,287,288],{"class":234}," reject",[123,290,245],{"class":133},[123,292,293],{"class":224}," =>",[123,295,263],{"class":133},[123,297,299,302,305,308,311,313,316],{"class":125,"line":298},3,[123,300,301],{"class":224},"    const",[123,303,304],{"class":190}," mp4boxFile",[123,306,307],{"class":172}," =",[123,309,310],{"class":129}," MP4Box",[123,312,134],{"class":133},[123,314,315],{"class":137},"createFile",[123,317,318],{"class":278},"()\n",[123,320,322],{"class":125,"line":321},4,[123,323,325],{"emptyLinePlaceholder":324},true,"\n",[123,327,329,332,334,337,339,342,344,347,349,352,354],{"class":125,"line":328},5,[123,330,331],{"class":129},"    mp4boxFile",[123,333,134],{"class":133},[123,335,336],{"class":137},"onReady",[123,338,307],{"class":172},[123,340,341],{"class":224}," function",[123,343,176],{"class":133},[123,345,346],{"class":234},"info",[123,348,238],{"class":172},[123,350,351],{"class":256}," any",[123,353,245],{"class":133},[123,355,263],{"class":133},[123,357,359,362,364,366,369,372,374,377,380,383,386],{"class":125,"line":358},6,[123,360,361],{"class":269},"      if",[123,363,176],{"class":278},[123,365,346],{"class":129},[123,367,368],{"class":172}," &&",[123,370,371],{"class":129}," info",[123,373,134],{"class":133},[123,375,376],{"class":129},"videoTracks",[123,378,379],{"class":133},"?.",[123,381,382],{"class":190},"length",[123,384,385],{"class":278},") ",[123,387,388],{"class":133},"{\n",[123,390,392,395,397,399,401,403,405,408,410],{"class":125,"line":391},7,[123,393,394],{"class":224},"        const",[123,396,159],{"class":190},[123,398,307],{"class":172},[123,400,371],{"class":129},[123,402,134],{"class":133},[123,404,376],{"class":129},[123,406,407],{"class":278},"[",[123,409,166],{"class":149},[123,411,412],{"class":278},"]\n",[123,414,416,418,421,423],{"class":125,"line":415},8,[123,417,394],{"class":224},[123,419,420],{"class":190}," result",[123,422,307],{"class":172},[123,424,263],{"class":133},[123,426,428,431,433,435,437,440,442,444,446,449],{"class":125,"line":427},9,[123,429,430],{"class":278},"          duration",[123,432,238],{"class":133},[123,434,159],{"class":129},[123,436,134],{"class":133},[123,438,439],{"class":129},"duration",[123,441,182],{"class":172},[123,443,159],{"class":129},[123,445,134],{"class":133},[123,447,448],{"class":129},"timescale",[123,450,451],{"class":133},",\n",[123,453,455,458,460,462,464,467],{"class":125,"line":454},10,[123,456,457],{"class":278},"          codec",[123,459,238],{"class":133},[123,461,159],{"class":129},[123,463,134],{"class":133},[123,465,466],{"class":129},"codec",[123,468,451],{"class":133},[123,470,472,475,477,479,481,484,486,488,490,492,494,496,498,500,502,504],{"class":125,"line":471},11,[123,473,474],{"class":278},"          fps",[123,476,238],{"class":133},[123,478,159],{"class":129},[123,480,134],{"class":133},[123,482,483],{"class":129},"nb_samples",[123,485,182],{"class":172},[123,487,176],{"class":278},[123,489,70],{"class":129},[123,491,134],{"class":133},[123,493,439],{"class":129},[123,495,182],{"class":172},[123,497,159],{"class":129},[123,499,134],{"class":133},[123,501,448],{"class":129},[123,503,245],{"class":278},[123,505,451],{"class":133},[123,507,509,512,514,516,518,521,523,525],{"class":125,"line":508},12,[123,510,511],{"class":278},"          width",[123,513,238],{"class":133},[123,515,159],{"class":129},[123,517,134],{"class":133},[123,519,520],{"class":129},"video",[123,522,134],{"class":133},[123,524,74],{"class":129},[123,526,451],{"class":133},[123,528,530,533,535,537,539,541,543,545],{"class":125,"line":529},13,[123,531,532],{"class":278},"          height",[123,534,238],{"class":133},[123,536,159],{"class":129},[123,538,134],{"class":133},[123,540,520],{"class":129},[123,542,134],{"class":133},[123,544,78],{"class":129},[123,546,451],{"class":133},[123,548,550,553,555,557,559,561,563,565,567,569,571,573,575,577,579,581,583,585,587,589,591,593,595,597,599,601,603,605],{"class":125,"line":549},14,[123,551,552],{"class":278},"          rotation",[123,554,238],{"class":133},[123,556,185],{"class":129},[123,558,134],{"class":133},[123,560,138],{"class":137},[123,562,231],{"class":278},[123,564,70],{"class":129},[123,566,134],{"class":133},[123,568,103],{"class":129},[123,570,407],{"class":278},[123,572,150],{"class":149},[123,574,153],{"class":278},[123,576,156],{"class":133},[123,578,159],{"class":129},[123,580,134],{"class":133},[123,582,103],{"class":129},[123,584,407],{"class":278},[123,586,166],{"class":149},[123,588,169],{"class":278},[123,590,173],{"class":172},[123,592,176],{"class":278},[123,594,179],{"class":149},[123,596,182],{"class":172},[123,598,185],{"class":129},[123,600,134],{"class":133},[123,602,191],{"class":190},[123,604,245],{"class":278},[123,606,451],{"class":133},[123,608,610],{"class":125,"line":609},15,[123,611,612],{"class":133},"        }\n",[123,614,616],{"class":125,"line":615},16,[123,617,325],{"emptyLinePlaceholder":324},[123,619,621,624,626,629],{"class":125,"line":620},17,[123,622,623],{"class":137},"        resolve",[123,625,231],{"class":278},[123,627,628],{"class":129},"result",[123,630,194],{"class":278},[123,632,634],{"class":125,"line":633},18,[123,635,636],{"class":133},"      }\n",[123,638,640],{"class":125,"line":639},19,[123,641,642],{"class":133},"    }\n",[123,644,646],{"class":125,"line":645},20,[123,647,325],{"emptyLinePlaceholder":324},[123,649,651,653,655,658,660,662,664,666,668,670,672],{"class":125,"line":650},21,[123,652,331],{"class":129},[123,654,134],{"class":133},[123,656,657],{"class":137},"onError",[123,659,307],{"class":172},[123,661,341],{"class":224},[123,663,176],{"class":133},[123,665,346],{"class":234},[123,667,238],{"class":172},[123,669,351],{"class":256},[123,671,245],{"class":133},[123,673,263],{"class":133},[123,675,677,680,682,685,687,691,695,697,699,701],{"class":125,"line":676},22,[123,678,679],{"class":129},"      console",[123,681,134],{"class":133},[123,683,684],{"class":137},"error",[123,686,231],{"class":278},[123,688,690],{"class":689},"sjJ54","'",[123,692,694],{"class":693},"s_sjI","mp4box.js error",[123,696,690],{"class":689},[123,698,156],{"class":133},[123,700,371],{"class":129},[123,702,194],{"class":278},[123,704,706,709,711,713],{"class":125,"line":705},23,[123,707,708],{"class":137},"      reject",[123,710,231],{"class":278},[123,712,346],{"class":129},[123,714,194],{"class":278},[123,716,718],{"class":125,"line":717},24,[123,719,642],{"class":133},[123,721,723],{"class":125,"line":722},25,[123,724,325],{"emptyLinePlaceholder":324},[123,726,728,730,733,735,738,740,743,746,748,751],{"class":125,"line":727},26,[123,729,301],{"class":224},[123,731,732],{"class":190}," reader",[123,734,307],{"class":172},[123,736,737],{"class":129}," file",[123,739,134],{"class":133},[123,741,742],{"class":137},"stream",[123,744,745],{"class":278},"()",[123,747,134],{"class":133},[123,749,750],{"class":137},"getReader",[123,752,318],{"class":278},[123,754,756,759,762,764],{"class":125,"line":755},27,[123,757,758],{"class":224},"    let",[123,760,761],{"class":129}," offset",[123,763,307],{"class":172},[123,765,766],{"class":149}," 0\n",[123,768,770,773,775,778,780,782,785,787,789,792,795,798,800,803,806,808,810,812],{"class":125,"line":769},28,[123,771,772],{"class":129},"    reader",[123,774,134],{"class":133},[123,776,777],{"class":137},"read",[123,779,745],{"class":278},[123,781,134],{"class":133},[123,783,784],{"class":137},"then",[123,786,231],{"class":278},[123,788,225],{"class":224},[123,790,791],{"class":137}," getNextChunk",[123,793,794],{"class":133},"({",[123,796,797],{"class":234}," done",[123,799,156],{"class":133},[123,801,802],{"class":234}," value",[123,804,805],{"class":133}," }",[123,807,238],{"class":172},[123,809,351],{"class":256},[123,811,245],{"class":133},[123,813,263],{"class":133},[123,815,817,819,821,824,826],{"class":125,"line":816},29,[123,818,361],{"class":269},[123,820,176],{"class":278},[123,822,823],{"class":129},"done",[123,825,385],{"class":278},[123,827,388],{"class":133},[123,829,831,834,836,839],{"class":125,"line":830},30,[123,832,833],{"class":129},"        mp4boxFile",[123,835,134],{"class":133},[123,837,838],{"class":137},"flush",[123,840,318],{"class":278},[123,842,844],{"class":125,"line":843},31,[123,845,846],{"class":269},"        return\n",[123,848,850],{"class":125,"line":849},32,[123,851,636],{"class":133},[123,853,855],{"class":125,"line":854},33,[123,856,325],{"emptyLinePlaceholder":324},[123,858,860,863,866,868,870,872],{"class":125,"line":859},34,[123,861,862],{"class":224},"      const",[123,864,865],{"class":190}," copy",[123,867,307],{"class":172},[123,869,802],{"class":129},[123,871,134],{"class":133},[123,873,874],{"class":129},"buffer\n",[123,876,878,881,883,886,888],{"class":125,"line":877},35,[123,879,880],{"class":129},"      copy",[123,882,134],{"class":133},[123,884,885],{"class":129},"fileStart",[123,887,307],{"class":172},[123,889,890],{"class":129}," offset\n",[123,892,894,897,900,902,904],{"class":125,"line":893},36,[123,895,896],{"class":129},"      offset",[123,898,899],{"class":172}," +=",[123,901,802],{"class":129},[123,903,134],{"class":133},[123,905,906],{"class":190},"length\n",[123,908,910,913,915,918,920,923],{"class":125,"line":909},37,[123,911,912],{"class":129},"      mp4boxFile",[123,914,134],{"class":133},[123,916,917],{"class":137},"appendBuffer",[123,919,231],{"class":278},[123,921,922],{"class":129},"copy",[123,924,194],{"class":278},[123,926,928,931,933,935,937,939,941,943,946],{"class":125,"line":927},38,[123,929,930],{"class":129},"      reader",[123,932,134],{"class":133},[123,934,777],{"class":137},[123,936,745],{"class":278},[123,938,134],{"class":133},[123,940,784],{"class":137},[123,942,231],{"class":278},[123,944,945],{"class":129},"getNextChunk",[123,947,194],{"class":278},[123,949,951,954],{"class":125,"line":950},39,[123,952,953],{"class":133},"    }",[123,955,194],{"class":278},[123,957,959,962],{"class":125,"line":958},40,[123,960,961],{"class":133},"  }",[123,963,194],{"class":278},[123,965,967],{"class":125,"line":966},41,[123,968,969],{"class":133},"}\n",[35,971,972],{"id":972},"后记",[31,974,975,976,981],{},"在解决这个问题的过程中，我发现另一个强大的 JS 库：",[56,977,980],{"href":978,"rel":979},"https:\u002F\u002Fgithub.com\u002Fbuzz\u002Fmediainfo.js",[60],"mediainfo.js","，已经帮我们做好了这一切，并且支持解析更多格式的文件。",[31,983,984,985,990],{},"我基于这个库，做了一个可视化的工具页：",[56,986,989],{"href":987,"rel":988},"https:\u002F\u002Ftools.yuanfen.net\u002Fmetadata",[60],"媒体文件元数据解析","，方便解析媒体文件的元数据，纯浏览器本地解析，性能优异，并且不需要读完整个文件，读完头就可以了。",[992,993,994],"style",{},"html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":119,"searchDepth":266,"depth":266,"links":996},[997,998,999,1000,1001],{"id":37,"depth":266,"text":37},{"id":51,"depth":266,"text":52},{"id":82,"depth":266,"text":83},{"id":214,"depth":266,"text":214},{"id":972,"depth":266,"text":972},null,"jpg","2024-05-22",false,"md",{},"\u002Fposts\u002F2024\u002Fget-video-rotation-by-mp4box-js",{"text":1010,"minutes":1011,"time":1012,"words":1013},"4 min read",3.68,220800,736,{"title":23,"description":119},{"loc":1008},"posts\u002F2024\u002F20240522.get-video-rotation-by-mp4box-js",[1018,1019,1020],"技术","前端","音视频处理","D0zmDUaMjME7E7unN1UVePE8EFtBxbFmdtpj9iS2Dlc",1777579136377]