我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java怎么实现提取QSV文件视频内容

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java怎么实现提取QSV文件视频内容

今天小编给大家分享一下Java怎么实现提取QSV文件视频内容的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

创建类

第一步新建一个java类QSV,构造函数传入需要解析的文件名称。

public class QSV {        private RandomAccessFile randomAccessFile;    private String name;    public QSV(String name) throws FileNotFoundException {        randomAccessFile = new RandomAccessFile(name, "r");        this.name = name;    }}

通用方法

逐字节读取文件

我们需要逐个字节读取文件,这边就需要jdk自带的类RandomAccessFile,先定义一个通用函数,输出偏移位置和字节大小获取字节数组。

private byte[] getByteFromFile(int offset, int size) throws IOException {    //指针移动至偏移位置    randomAccessFile.seek(offset);    //需要读取的字节数    byte[] bs = new byte[size];    randomAccessFile.read(bs);    return bs;}

字节数组转16进制字符串

private static final char[] HEX_VOCABLE = {'0', '1', '2', '3', '4', '5', '6', '7',        '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};public String bytesToHex(byte[] bs) {    StringBuilder sb = new StringBuilder();    for (byte b : bs) {        int high = (b >> 4) & 0x0f;        int low = b & 0x0f;        sb.append(HEX_VOCABLE[high]);        sb.append(HEX_VOCABLE[low]);    }    return sb.toString();}

字节数组转int

public int toInt(byte[] b) {    int res = 0;    for (int i = 0; i < b.length; i++) {        res += (b[i] & 0xff) << (i * 8);    }    return res;}

老版本解密算法

老版本解密方法比较简单,先看下C的写法:

// 定义1个字节内存typedef uint8_t BYTE;// 定义4个字节内存typedef uint32_t DWORD;// decryption algorithm for some segments in qsv version 0x1void decrypt_1(BYTE* buffer, DWORD size) {    static BYTE dict[] = {0x62, 0x67, 0x70, 0x79};    for(int i = 0; i < size; ++i) {        DWORD j = ~i & 0x3;        buffer[i] ^= dict[j];    }}

可以直接用byte数组和long类型替换c的内存定义,这边没问题时因为没有位移算法,后面新版本解密算法会讲到。

private void decrypt_1(byte[] bs, long len) {    byte[] b = new byte[]{0x62, 0x67, 0x70, 0x79};    for (int i = 0; i < len; i++) {        //先取反再与运算        int j = ~i & 0x3;        //异或运算        bs[i] ^= b[j];    }}

新版本解密算法

新版本解密算法比较复杂,同样先看下c的写法:

// 定义1个字节内存typedef uint8_t BYTE;// 定义4个字节内存typedef uint32_t DWORD;// decryption algorithm for some segments in qsv version 0x2void decrypt_2(BYTE* buffer, DWORD size) {    DWORD x = 0x62677079;    for(DWORD i = size - 1; i != 0; --i) {        x = (x << 1) | (x >> 31);        x ^= buffer[i];    }    for(DWORD i = 1; i < size; ++i) {        x ^= buffer[i] & 0xFF;        x = (x >> 1) | (x << 31);        DWORD j = x % i;        BYTE tmp = buffer[j];        buffer[j] = tmp ^ (BYTE)~buffer[i];        buffer[i] = tmp;    }}

这边注意c的写法有位移,定义的DWORD占32位内存,而java与之对应的int类型也是占32位内存,取值范围是-2^31~2^31-1(即-2147483648~2147483647),如果超出这个范围java需要用long,而long占64位内存取反和位移都是按64位进行的与C的32位取反位移计算结果肯定有差异。

比如:2147483648,转换位二进制表示:10000000000000000000000000000000,C的写法由于DWORD占32位内存,左移一位后超出32为故就变成00000000000000000000000000000000,而java已经超出了int的取值范围,只能用long定义,由于long占64位,左移一位不会超出,结果也就不一样了。

又比如:9147483648,转为二进制表示:1000100001001110111000011000000000,已经超出32位,存到DWORD中的只保留右边的32位,即00100001001110111000011000000000,左移以为变成01000010011101110000110000000000,转为10进制为1115098112,而java采用long定义不会超出64位,左移结果位10001000010011101110000110000000000,转为十进制表示为18294967296,与C的结果相差较大。那么有办法解决吗,答案肯定是有的,我们需要重新写一个位移算法。

private long longLeftShift(long value, int i) {    String binary = format32(value);    binary = binary.substring(i) + String.format("%0" + i + "d", 0);    return Long.parseLong(binary, 2);}private long longRightShift(long value, int i) {    String binary = format32(value);    binary = String.format("%0" + i + "d", 0) + binary.substring(0, binary.length() - i);    return Long.parseLong(binary, 2);}private String format32(long value) {    String binary = Long.toBinaryString(value);    if (binary.length() < 32) {        //补满32位        binary = String.format("%0" + (32 - binary.length()) + "d", 0) + binary;    } else {        //多余的截取掉        binary = binary.substring(binary.length() - 32);    }    return binary;}

有了新定义的位移算法,解密算法就可以修改为:

private void decrypt_2(byte[] buffer, int size) {    long x = 0x62677079;    for (int i = size - 1; i != 0; --i) {        x = longLeftShift(x, 1) | longRightShift(x, 31);        x ^= buffer[i] & 0xFF;    }    for (int i = 1; i < size; ++i) {        x ^= buffer[i] & 0xFF;        x = longRightShift(x, 1) | longLeftShift(x, 31);        int j = (int) (x % i);        byte tmp = buffer[j];        int a = buffer[i];        buffer[j] = (byte) (tmp ^ ~a);        buffer[i] = tmp;    }}

获取QSV头部信息

上一篇文章讲到,头部信息共90个字节,signature(10byte)+version(4byte)+vid(16byte)+_unknown1(4byte)+_unknown2(32byte)+_unknown3(4byte)+_unknown4(4byte)+json_offset(8byte)+json_size(4byte)+nb_indices(4byte)

public static void main(String[] args) throws IOException {    QSV qsv = new QSV("D:\\workspace\\c\\风吹半夏第1集-蓝光1080P.qsv");    qsv.readHead();    qsv.close();}public void readHead() throws IOException {    //signature:10byte    byte[] signature = getByteFromFile(0x0, 0xA);    //version:4byte    byte[] version = getByteFromFile(0xA, 0x4);    //vid:16byte    byte[] vid = getByteFromFile(0xE, 0x10);    //_unknown1:4byte    byte[] _unknown1 = getByteFromFile(0x1E, 0x4);    //_unknown2:32byte    byte[] _unknown2 = getByteFromFile(0x22, 0x20);    //_unknown3:4byte    byte[] _unknown3 = getByteFromFile(0x42, 0x4);    //_unknown4:4byte    byte[] _unknown4 = getByteFromFile(0x46, 0x4);    //json_offset:8byte    byte[] json_offset = getByteFromFile(0x4A, 0x8);    //json_size:4byte    byte[] json_size = getByteFromFile(0x52, 0x4);    //nb_indices:4byte    byte[] nb_indices = getByteFromFile(0x56, 0x4);    System.out.println(String.format("signature:%s\nversion:%s\nvid:%s\n_unknown1:%s\n_unknown2:%s\n_unknown3:%s\n_unknown4:%s\njson_offset:0x%s\njson_size:0x%s\nnb_indices:0x%s",            new String(signature), toInt(version), bytesToHex(vid), bytesToHex(_unknown1), bytesToHex(_unknown2), bytesToHex(_unknown3),            bytesToHex(_unknown4), Integer.toHexString(toInt(json_offset)), Integer.toHexString(toInt(json_size)), Integer.toHexString(toInt(nb_indices))));}

运行结果:

signature:QIYI VIDEO
version:2
vid:A90EA47D4333331BB85F331C1130504C
_unknown1:01000000
_unknown2:0000000000000000000000000000000000000000000000000000000000000000
_unknown3:01000000
_unknown4:01000000
json_offset:0x167
json_size:0x1d81
nb_indices:0x7

获取json数据

获取json数据需要先获取头部信息记录的json的偏移位置和字节大小,获取到的字节数组再通过老版本解密算法解密即可。

public static void main(String[] args) throws IOException {    QSV qsv = new QSV("D:\\workspace\\c\\风吹半夏第1集-蓝光1080P.qsv");    qsv.readJson();    qsv.close();}public void readJson() throws IOException {    //json_offset:8byte    byte[] json_offset = getByteFromFile(0x4A, 0x8);    //json_size:4byte    byte[] json_size = getByteFromFile(0x52, 0x4);    //json    byte[] bs = getByteFromFile(toInt(json_offset), toInt(json_size));    decrypt_1(bs, bs.length);    System.out.println(String.format("json_offset:0x%s\njson_size:0x%s", Integer.toHexString(toInt(json_offset)), Integer.toHexString(toInt(json_size))));    System.out.println(new String(bs, StandardCharsets.UTF_8));}

运行结果:

json_offset:0x167
json_size:0x1d81
QYVI   {"qsv_info":{"ad":{},"aid":"3644740799867701","bid":600,"dr":-1,"independentaudio":true,"m3u8":"","pano":{"type":1},"qsvinfo_version":2,"sdv":"","st":"","thdt":1,"tht":0,"title":"","title_tail_info":{"bt":99,"bts":-1,"et":2621,"ete":-1,"fe":1,"le":0},"tvid":"3185901936393500","vd":{"seg":{"duration":["376140","365508","370300","371477","368311","368308","554319"],"rid":["a8c47c2906b88ae47e8503c96dae0494","4c8578cecbdfa3137a61b7e2bd1c68dc","4bc76f9b4d4ce995f40b42c467d206f8","8ed13ccd56aa2367f5eaabee12043d89","247b4612415c5b452f5965894a967e19","309400bef063cfd6baf19feb0d4a73a9","9771b1042cabfc9828767a3d0350f655"],"size":["75624801","84329329","90135782","82093900","91974933","75298884","111399115"]},"time":{"et":"2621000","st":"99000"}},"vi":"{\"writer\":\"\",\"authors\":\"\",\"upOrder\":36,\"rewardAllowed\":0,\"fl\":[],\"allowEditVVIqiyi\":0,\"isPopup\":1,\"payMark\":0,\"an\":\"风吹半夏\",\"pvu\":\"\",\"subType\":1,\"rewardMessage\":\"\",\"ipLimit\":1,\"pubTime\":\"1673306651000\",\"mainActorRoles\":[],\"up\":\"2023-01-17 20:20:02\",\"un\":\"\",\"qiyiProduced\":1,\"platforms\":[],\"vn\":\"风吹半夏第1集\",\"plc\":{\"4\":{\"downAld\":1,\"coa\":1},\"40\":{\"downAld\":1,\"coa\":1},\"10\":{\"downAld\":1,\"coa\":1},\"5\":{\"downAld\":1,\"coa\":1},\"41\":{\"downAld\":1,\"coa\":1},\"22\":{\"downAld\":1,\"coa\":1},\"32\":{\"downAld\":1,\"coa\":1},\"11\":{\"downAld\":1,\"coa\":1},\"12\":{\"downAld\":1,\"coa\":1},\"7\":{\"downAld\":1,\"coa\":1},\"13\":{\"downAld\":1,\"coa\":1},\"14\":{\"downAld\":1,\"coa\":1},\"91\":{\"downAld\":1,\"coa\":1},\"34\":{\"downAld\":1,\"coa\":1},\"9\":{\"downAld\":1,\"coa\":1},\"6\":{\"downAld\":1,\"coa\":1},\"16\":{\"downAld\":1,\"coa\":1},\"17\":{\"downAld\":1,\"coa\":1},\"27\":{\"downAld\":1,\"coa\":1},\"28\":{\"downAld\":1,\"coa\":1},\"18\":{\"downAld\":1,\"coa\":1},\"29\":{\"downAld\":1,\"coa\":1},\"1\":{\"downAld\":1,\"coa\":1},\"50\":{\"downAld\":1,\"coa\":1},\"31\":{\"downAld\":1,\"coa\":1},\"15\":{\"downAld\":1,\"coa\":1},\"2\":{\"downAld\":1,\"coa\":1},\"3\":{\"downAld\":1,\"coa\":1},\"21\":{\"downAld\":1,\"coa\":1},\"30\":{\"downAld\":1,\"coa\":1},\"19\":{\"downAld\":1,\"coa\":1},\"8\":{\"downAld\":1,\"coa\":1},\"20\":{\"downAld\":1,\"coa\":1}},\"sm\":0,\"st\":200,\"startTime\":99,\"showChannelId\":2,\"vu\":\"http:\\/\\/www.iqiyi.com\\/v_uvxuws1kkw.html\",\"povu\":\"\",\"ppsuploadid\":0,\"qiyiPlayStrategy\":\"非会员每日20:00转免1集\",\"ar\":\"内地\",\"cc\":0,\"videoQipuId\":3185901936393500,\"albumQipuId\":3644740799867701,\"pano\":{\"type\":1},\"subt\":\"许半夏帮童骁骑驱霉运\",\"endTime\":2621,\"cpa\":1,\"userVideocount\":0,\"es\":36,\"plg\":2774,\"stl\":{\"d\":\"http:\\/\\/meta.video.iqiyi.com\",\"stl\":[]},\"subKey\":\"3644740799867701\",\"tvFocuse\":\"赵丽颖欧豪携手创业\",\"qtId\":0,\"ty\":0,\"ppsInfo\":{\"shortTitle\":\"风吹半夏第1集\",\"name\":\"风吹半夏第1集\"},\"sid\":0,\"etm\":\"\",\"keyword\":\"风吹半夏\",\"pturl\":\"\",\"a\":\"\",\"isTopChart\":0,\"idl\":0,\"albumAlias\":\"许半夏帮童骁骑驱霉运\",\"stm\":\"\",\"pd\":1,\"tags\":[],\"coa\":0,\"c\":2,\"producers\":\"\",\"nurl\":\"\",\"tvEname\":\"wild bloom\",\"uid\":\"0\",\"asubt\":\"\",\"d\":\"傅东育|毛溦\",\"vid\":\"a90ea47d4333331bb85f331c1130504c\",\"dts\":\"20230117202002\",\"editorInfo\":\"\",\"tvSeason\":0,\"ntvd\":3185901936393500,\"vpic\":\"http:\\/\\/pic6.iqiyipic.com\\/image\\/20221127\\/e2\\/52\\/v_170312139_m_601_m1.jpg\",\"vType\":0,\"cType\":1,\"payMarkUrl\":\"\",\"apic\":\"http:\\/\\/pic8.iqiyipic.com\\/image\\/20230104\\/6c\\/00\\/a_100498846_m_601_m26.jpg\",\"shortTitle\":\"风吹半夏第1集\",\"tvid\":3185901936393500,\"aid\":3644740799867701,\"au\":\"http:\\/\\/www.iqiyi.com\\/a_yq6d69gtw9.html\",\"tvPhase\":0,\"ifs\":0,\"is\":0,\"tpl\":[],\"actors\":[],\"isVip\":\"\",\"votes\":[],\"previewImageUrl\":\"http:\\/\\/preimage3.iqiyipic.com\\/preimage\\/20230110\\/6a\\/a6\\/v_170312139_m_611_m6.jpg\",\"e\":\"\",\"cnPremTime\":0,\"s\":\"\",\"ma\":\"赵丽颖|欧豪|李光洁|刘威|柯蓝|任重|冯嘉怡|孙千|黄澄澄|是安|宋熹|王西|黄义威|王劲松|刘威葳|尤靖茹|林鹏(大陆男演员)|郝平|淮文|颜世魁|薛淑杰|刘硕|丁冠中|豆艺坤|寇钟吁|杨德民|傅宜箴|朱超艺|黄子琪|荣飞|田玲|周小镔|孔琳|方晓莉|陈创|韩朔|高远\",\"supName\":\"\",\"sc\":0,\"categoryKeywords\":\"电视剧,3644740799867701,0,http:\\/\\/list.iqiyi.com\\/www\\/2\\/------------------.html 自制,12791537149997,2,http:\\/\\/list.iqiyi.com\\/www\\/2\\/-12791537149997-----------------.html 浙江卫视,20291787825994,0,http:\\/\\/list.iqiyi.com\\/www\\/2\\/------------------.html 家庭,23757144288056,2,http:\\/\\/list.iqiyi.com\\/www\\/2\\/-23757144288056-----------------.html 言情,23789230921965,2,http:\\/\\/list.iqiyi.com\\/www\\/2\\/-23789230921965-----------------.html 励志,29717236536467,2,http:\\/\\/list.iqiyi.com\\/www\\/2\\/-29717236536467-----------------.html 商战,32284167249109,2,http:\\/\\/list.iqiyi.com\\/www\\/2\\/-32284167249109-----------------.html 剧情,37979544767779,2,http:\\/\\/list.iqiyi.com\\/www\\/2\\/-37979544767779-----------------.html 都市,80141381722890,2,http:\\/\\/list.iqiyi.com\\/www\\/2\\/-80141381722890-----------------.html 内地,80526421329786,0,http:\\/\\/list.iqiyi.com\\/www\\/2\\/------------------.html 爱情,87328787718281,2,http:\\/\\/list.iqiyi.com\\/www\\/2\\/-87328787718281-----------------.html\",\"onlineStatus\":1,\"mdown\":0,\"bmsg\":{\"t\":\"20230117202002\",\"f\":\"web\",\"mid\":\"\",\"sp\":\"26173601,\"},\"nvid\":\"8ec7f862076f40ee17c908e2bbc3fae2\",\"flpps\":[],\"supType\":\"\",\"lg\":2,\"is3D\":0,\"bossStatus\":0,\"isDisplayCircle\":0,\"actorRoles\":[],\"exclusive\":1,\"circle\":{\"type\":0,\"id\":0},\"commentAllowed\":1,\"tg\":\"忠犬 大女主 自制 工业强国 毒舌 重组家庭 渣男 浙江卫视 家庭 言情 霸道总裁 御姐 励志 个人成长 虐恋 双强 普通话 商战 硬汉 剧情 出轨 兄弟反目 女强人 爽剧 初恋 青年奋斗 热血 女性励志 群像 个人奋斗 接地气 女青年 大佬 原生家庭 猪队友 都市 内地 组团 爱情\",\"info\":\"1996年的秋天,阳光炫目。许半夏开着一辆桑塔纳,接着刚出狱的童骁骑驶往鹭州出差。一路上童骁骑默默无言,二人之间气氛尴尬。到了酒店后,许半夏的指示很清楚:洗澡,看电视,睡觉,第二天一早,她来接童骁骑一起出差。童骁骑点点头,在许半夏离开后,他开始洗澡,记忆也回到了五年前&hellip;&hellip;\\n1991年的一个雨夜,童骁骑因为急着给妈妈筹医药费,撬了一堆下水井盖,蹬着三轮车拉到了许半夏和小陈的废品站。小陈认定童骁骑就是个骗子,不愿帮忙,但善良的半夏相信童骁骑,给了他钱,并且三个人一大早一起把井盖都送了回去。童骁骑为表感激,愿意替二人做事。许半夏提到当地钢厂有很多废了的下脚料,他们可以去收,但缺一辆大车。于是司机班出身的童骁骑真的把厂里的东风偷偷开了出来,三人摇摇晃晃进了钢厂,挣到了人生的第一桶金,但童骁骑也因为私自用车被厂里开除了。回到废品站的童骁骑心灰意冷,许半夏却安慰道正好,今后他们三个人就一块儿干,而这些钱就是他们的第一笔合伙资金。\",\"supId\":0,\"issueTime\":0,\"dtype\":3,\"producer\":\"\",\"presentor\":[],\"followerCount\":0}","vid":"a90ea47d4333331bb85f331c1130504c","videotype":0}}s

提取视频信息

获取视频信息,首先要先提取索引信息,根据索引信息中的偏移位置和字节大小获取,获取到的字节数组前1024个字节需要解密,根据头部信息中的version判断,如果是1则用老版本算法解密,如果是2则用新版本算法解密。

一个QSV文件包含多段视频数据,已发现的视频格式有flv(旧版客户端)、mpeg-ts(新版客户端)。可以通过前三个字节判断,如果前三个字节转字符串为FLV则为FLV格式。

public static void main(String[] args) throws IOException {    QSV qsv = new QSV("D:\\workspace\\c\\风吹半夏第1集-蓝光1080P.qsv");    qsv.readIndex("D:\\workspace\\c");    qsv.close();}public void readIndex(String outPath) throws IOException {    //nb_indices    byte[] nb_indices = getByteFromFile(0x56, 0x4);    //索引    //_unknown_flag    byte[] _unknown_flag = getByteFromFile(0x5A, toInt(nb_indices) + 7 >> 3);    System.out.println(String.format("nb_indices:0x%s\n_unknown_flag:%s", Integer.toHexString(toInt(nb_indices)), bytesToHex(_unknown_flag)));    //version:4byte    byte[] version = getByteFromFile(0xA, 0x4);    //索引体    byte[] indices = getByteFromFile(0x5A + (toInt(nb_indices) + 7 >> 3), toInt(nb_indices) * 0x1C);    for (int i = 0; i < toInt(nb_indices); i++) {        byte[] indice = new byte[0x1C];        System.arraycopy(indices, 0x1C * i, indice, 0, 0x1C);        if (toInt(version) == 1) {            decrypt_1(indice, indice.length);        } else if (toInt(version) == 2) {            decrypt_2(indice, indice.length);        }        //索引体        //_codetable        byte[] _codetable = new byte[0x10];        System.arraycopy(indice, 0, _codetable, 0, 0x10);        //segment_offset        byte[] segment_offset = new byte[0x8];        System.arraycopy(indice, 0x10, segment_offset, 0, 0x8);        //segment_size        byte[] segment_size = new byte[0x4];        System.arraycopy(indice, 0x18, segment_size, 0, 0x4);        System.out.println(String.format("_codetable:%s,segment_offset:0x%s,segment_size:0x%s", bytesToHex(_codetable), Integer.toHexString(toInt(segment_offset)), Integer.toHexString(toInt(segment_size))));        exportVideo(i + 1, segment_offset, segment_size, outPath);    }}private void exportVideo(int fileindex, byte[] segment_offset, byte[] segment_size, String outPath) throws IOException {    byte[] file = getByteFromFile(toInt(segment_offset), toInt(segment_size));    //前1024字节加密    decrypt_2(file, 1024);    byte[] head = new byte[0x3];    System.arraycopy(file, 0, head, 0, 0x3);    //System.out.println(new String(head));    String outname = name.substring(name.lastIndexOf(File.separator) + 1);    String outFile = outPath + File.separator + outname.substring(0, outname.lastIndexOf(".")) + "-第" + fileindex + "段." + new String(head).toLowerCase();    RandomAccessFile write = new RandomAccessFile(outFile, "rw");    System.out.println("export:" + outFile);    write.write(file);    write.close();}

运行结果:

nb_indices:0x7
_unknown_flag:7F
_codetable:A8C47C2906B88AE47E8503C96DAE0494,segment_offset:0x1ee8,segment_size:0x481f161
export:D:\workspace\c\风吹半夏第1集-蓝光1080P-第1段.flv
_codetable:4C8578CECBDFA3137A61B7E2BD1C68DC,segment_offset:0x4821049,segment_size:0x506c371
export:D:\workspace\c\风吹半夏第1集-蓝光1080P-第2段.flv
_codetable:4BC76F9B4D4CE995F40B42C467D206F8,segment_offset:0x988d3ba,segment_size:0x55f5ce6
export:D:\workspace\c\风吹半夏第1集-蓝光1080P-第3段.flv
_codetable:8ED13CCD56AA2367F5EAABEE12043D89,segment_offset:0xee830a0,segment_size:0x4e4a74c
export:D:\workspace\c\风吹半夏第1集-蓝光1080P-第4段.flv
_codetable:247B4612415C5B452F5965894A967E19,segment_offset:0x13ccd7ec,segment_size:0x57b6d15
export:D:\workspace\c\风吹半夏第1集-蓝光1080P-第5段.flv
_codetable:309400BEF063CFD6BAF19FEB0D4A73A9,segment_offset:0x19484501,segment_size:0x47cf844
export:D:\workspace\c\风吹半夏第1集-蓝光1080P-第6段.flv
_codetable:9771B1042CABFC9828767A3D0350F655,segment_offset:0x1dc53d45,segment_size:0x6a3d0cb
export:D:\workspace\c\风吹半夏第1集-蓝光1080P-第7段.flv

以上就是“Java怎么实现提取QSV文件视频内容”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java怎么实现提取QSV文件视频内容

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java怎么实现提取QSV文件视频内容

今天小编给大家分享一下Java怎么实现提取QSV文件视频内容的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。创建类第一步新建一
2023-07-05

使用Python怎么在m3u8文件中提取视频

这期内容当中小编将会给大家带来有关使用Python怎么在m3u8文件中提取视频,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. HLS协议与m3u8文件  HLS,即 H T T P L i v e
2023-06-15

java怎么读取excel文件内容

可以使用Apache POI库来读取Excel文件内容。首先,你需要下载并导入Apache POI库。你可以在官方网站(https://poi.apache.org/)上找到所需的JAR文件。将JAR文件添加到你的项目中。以下是一个简单的例
2023-09-20

java怎么读取json文件内容

在Java中,可以使用JSON库来读取JSON文件内容。以下是使用Jackson库进行JSON文件读取的示例代码:javaimport com.fasterxml.jackson.databind.ObjectMapper;import j
2023-10-18

Java实现读取TXT和CSV文件内容

这篇文章主要为大家详细介绍了如何利用Java语言实现读取TXT和CSV文件内容的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
2023-02-08

java怎么逐行读取文件内容

在Java中,我们可以使用BufferedReader类来逐行读取文件内容。以下是一个示例代码:import java.io.BufferedReader;import java.io.FileReader;import java.i
java怎么逐行读取文件内容
2024-03-05

python怎么实现循环读取文件内容

可以使用open()函数打开文件,并使用read()函数循环读取文件内容。以下是一个示例代码:with open("file.txt", "r") as file:for line in file:# 每次循环读取文件中的一行内容prin
python怎么实现循环读取文件内容
2024-02-29

java怎么读取文件并修改文件内容

要读取和修改文件内容,可以使用Java中的File类和FileInputStream、FileOutputStream类。首先,使用File类来创建文件对象,指定要读取和修改的文件路径:File file = new File("文件路
java怎么读取文件并修改文件内容
2024-02-29

PHP怎么实现西瓜无水印视频地址提取

本篇内容主要讲解“PHP怎么实现西瓜无水印视频地址提取”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP怎么实现西瓜无水印视频地址提取”吧!1、Videoparse短视频解析接口支持:抖音、快
2023-06-04

C#中怎么读取文件内容并实现另存

这篇文章给大家介绍C#中怎么读取文件内容并实现另存,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。代码的实现:using System; using System.Data; using System.Configu
2023-06-18

TXT文件的内容如何利用Java实现读取

本篇文章为大家展示了TXT文件的内容如何利用Java实现读取,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java读取txt文件内容。可以作如下理解:首先获得一个文件句柄。File file = n
2023-05-31

java怎么从文件中截取指定内容

要从文件中截取指定内容,可以使用Java的文件读取和字符串处理技巧。首先,你需要使用Java的文件读取功能来读取文件内容。你可以使用BufferedReader类和FileReader类来实现文件读取。例如:String filePat
2023-10-21

java怎么读取csv文件内容并输出

在Java中,可以使用BufferedReader和FileReader类来读取CSV文件内容,并使用System.out.println()方法输出内容。下面是一个简单的示例代码:import java.io.BufferedReade
java怎么读取csv文件内容并输出
2024-03-14

java怎么读取文件内容并写入到另一文件

在Java中,可以使用`FileReader`和`BufferedReader`来读取文件内容,并使用`FileWriter`和`BufferedWriter`来写入到另一个文件。下面是一个示例代码,演示了如何读取一个文件的内容,并将其写入
2023-09-20

Node.js怎么实现逐行读取和写入文件内容

本篇内容介绍了“Node.js怎么实现逐行读取和写入文件内容”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是ReadlineReadli
2023-07-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录