C++代码转为luann#include-stdafxhnn#include-utilsf4vmediahnntypedef-struct-_flv_headernn----unsigned-char-flvsig3;n----unsigned-char-version;n----unsigned-char-flag;n----int-headsize;-0x09n-flv_header;nntypedef-struct-_flv_tagnn----unsigned-char-type;n---
-- Lua version of the C++ code above local FLV_HEADER_SIZE = 9 local PRE_TAG_SIZE = 4 local TAG_HEADER_SIZE = 11
local function get_f4v_header_buffer(io_buf) return get_f4v_header_buffer(io_buf, #io_buf) end
local function get_f4v_header_buffer(buf, len) local THIS_BUFFER_SIZE = len if THIS_BUFFER_SIZE < FLV_HEADER_SIZE + PRE_TAG_SIZE then return "" end local pbuffer = buf local header = { flvsig = {pbuffer:byte(1, 3)}, version = pbuffer:byte(4), flag = pbuffer:byte(5), headsize = pbuffer:byte(6) + pbuffer:byte(7) * 256 + pbuffer:byte(8) * 65536 + pbuffer:byte(9) * 16777216, } if header.flvsig[1] ~= string.byte("F") or header.flvsig[2] ~= string.byte("L") or header.flvsig[3] ~= string.byte("V") then return "" end local ret_buffer = "" local pos = FLV_HEADER_SIZE + PRE_TAG_SIZE local h264_header_tag_pos = 0 local h264_header_tag_len = 0 local aac_header_tag_pos = 0 local aac_header_tag_len = 0 for i = 1, 3 do if pos + TAG_HEADER_SIZE >= THIS_BUFFER_SIZE then break end local p_tag = { type = pbuffer:byte(pos), bodylength = { pbuffer:byte(pos + 1), pbuffer:byte(pos + 2), pbuffer:byte(pos + 3), }, timestamp = pbuffer:byte(pos + 4) * 65536 * 256 + pbuffer:byte(pos + 5) * 65536 + pbuffer:byte(pos + 6) * 256 + pbuffer:byte(pos + 7), streamid = {pbuffer:byte(pos + 8), pbuffer:byte(pos + 9), pbuffer:byte(pos + 10)}, } local ibodysize = p_tag.bodylength[1] * 65536 + p_tag.bodylength[2] * 256 + p_tag.bodylength[3] if pos + TAG_HEADER_SIZE + ibodysize > THIS_BUFFER_SIZE then break end if p_tag.type == 8 then local audio_buffer = pbuffer:sub(pos + TAG_HEADER_SIZE, pos + TAG_HEADER_SIZE + ibodysize - 1) if audio_buffer:byte(2) == 0 then aac_header_tag_pos = pos aac_header_tag_len = ibodysize + TAG_HEADER_SIZE + PRE_TAG_SIZE end elseif p_tag.type == 9 then local video_buffer = pbuffer:sub(pos + TAG_HEADER_SIZE, pos + TAG_HEADER_SIZE + ibodysize - 1) local codec_id = bit.band(video_buffer:byte(1), 0x0f) if codec_id == 7 then h264_header_tag_pos = pos h264_header_tag_len = ibodysize + TAG_HEADER_SIZE + PRE_TAG_SIZE end elseif p_tag.type == 18 then -- script_pos = pos; -- script_len = ibodysize + TAG_HEADER_SIZE + PRE_TAG_SIZE; else -- do nothing end pos = pos + ibodysize + TAG_HEADER_SIZE + PRE_TAG_SIZE end ret_buffer = ret_buffer .. pbuffer:sub(1, FLV_HEADER_SIZE + PRE_TAG_SIZE) if h264_header_tag_len ~= 0 then ret_buffer = ret_buffer .. pbuffer:sub(h264_header_tag_pos + 1, h264_header_tag_pos + h264_header_tag_len) end if aac_header_tag_len ~= 0 then ret_buffer = ret_buffer .. pbuffer:sub(aac_header_tag_pos + 1, aac_header_tag_pos + aac_header_tag_len) end return ret_buffer end
原文地址: https://www.cveoy.top/t/topic/p1n 著作权归作者所有。请勿转载和采集!