通过文件IO的方式获取视频时长

该代码段是一个函数,用于从文件中读取MY_MVHD结构并解析出媒体的持续时间(DurationMs)。它首先尝试从偏移量0x0020处读取,如果结构不匹配,则尝试从偏移量0x0010处读取。解析成功后,将持续时间转换为毫秒并返回。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意:不同的平台需要修改MY_MVHD结构

//不同的平台需要修改MY_MVHD结构
int _Comm_GetFileDurationMs(const char* src_filename)
{
    int ifd = -1;
    int iRetLen = 0;
	int len = 0;
	int offset = 0;
    int ret = 0;
	MY_MVHD myMvhd = {0};
    MY_MVHD1 myMvhd1 = {0};
    
	/*
	00 00 6B 14  6D 6F 6F 76   00 00 00 6C	[6D 76 68 64] mvhd
	00 00 00 00  00 00 00 00   00 00 00 00	00 00 03 E8
	[00 00 EA C0]  00 01 00 00   01 00 00 00	00 00 00 00 DurationMs
	*/
	offset = 0x0020;
	
	do {
		ifd = open(src_filename, O_SYNC | O_RDWR);
		if (-1 == ifd) {
			ret = -4;
			break;
		}
		if (lseek(ifd, offset, SEEK_SET) == (off_t)-1) {
			ret = -5;
			break;
		}
		len = sizeof(myMvhd);
		iRetLen = read(ifd, (unsigned char*)&myMvhd, len);
		if (iRetLen != len) {
			ret = -6;
			break;
		}
	}while(0);
	if(ifd != -1)
		close(ifd);

    if(ret < 0) {
		LOGV("[%s] ret = %d\n", src_filename, ret);
		ret = 0;
    } else {
		//_Comm_DumpHexEx("mvhd", (char*)&myMvhd, len);
		//LOGD("mvhd=%x [%02x %02x %02x %02x]\n", myMvhd.mvhd, myMvhd.DurationMs[0], myMvhd.DurationMs[1], myMvhd.DurationMs[2], myMvhd.DurationMs[3]);
		if(myMvhd.mvhd == 0x6468766d) {
			ret = myMvhd.DurationMs[0]<<24|myMvhd.DurationMs[1]<<16|myMvhd.DurationMs[2]<<8|myMvhd.DurationMs[3]<<0;
		}
        else //不一致就要在读取一次
        {
            offset = 0x0010;
            do {
                ifd = open(src_filename, O_SYNC | O_RDWR);
                if (-1 == ifd) {
                    ret = -4;
                    break;
                }
                if (lseek(ifd, offset, SEEK_SET) == (off_t)-1) {
                    ret = -5;
                    break;
                }
                len = sizeof(myMvhd1);
                iRetLen = read(ifd, (unsigned char*)&myMvhd1, len);
                if (iRetLen != len) {
                    ret = -6;
                    break;
                }
            }while(0);
            if(ifd != -1)
                close(ifd);
            if(ret < 0) {
        		LOGV("[%s] ret = %d\n", src_filename, ret);
        		ret = 0;
            } else {
        		//_Comm_DumpHexEx("mvhd", (char*)&myMvhd1, len);
        		//LOGD("mvhd1=%x [%02x %02x %02x %02x]\n", myMvhd1.mvhd, myMvhd1.DurationMs[0], myMvhd1.DurationMs[1], myMvhd1.DurationMs[2], myMvhd1.DurationMs[3]);
        		if(myMvhd1.mvhd == 0x6468766d) {
        			ret = myMvhd1.DurationMs[0]<<24|myMvhd1.DurationMs[1]<<16|myMvhd1.DurationMs[2]<<8|myMvhd1.DurationMs[3]<<0;
        		}
                else {
                    ret = -7;
                }
           }
        }
    }
	
	//LOGI("[%s] DurationMs = %d\n", src_filename, ret);
	return ret;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值