发明内容
本发明的目的在于提供一种YUV文件的存储、播放方法及其装置,实现YUV单文件的多分辨率、变帧率的自适应播放。
为解决上述技术问题,本发明的实施方式提供了一种YUV文件的存储方法,包含以下步骤:
将YUV帧顺序写入YUV文件中,并将同类型的YUV帧作为一个片段,生成该片段的属性信息;
当待存储的YUV帧已全部写入YUV文件后,在YUV文件中写入参数信息,并在参数信息后,将参数信息的长度写入该YUV文件中,参数信息的长度以预定长度的字节数表示;
其中,参数信息为依次生成的各片段的属性信息的集合。
本发明的实施方式还提供了一种YUV文件的播放方法,对应于上文的YUV文件的存储方法,包含以下步骤:
从YUV文件的尾部读取预定长度的用于表示参数信息长度的字节数,获取参数信息长度;
根据参数信息长度,得到参数信息在YUV文件的起始位置和结束位置,并在YUV文件中读取参数信息;
根据参数信息中包含的各片段的属性信息,播放YUV文件中存储的YUV帧。
本发明的实施方式还提供了一种YUV文件的存储装置,包含:
YUV数据写入模块,用于将YUV帧顺序写入YUV文件中;
属性信息生成模块,用于将同类型的YUV帧作为一个片段,生成该片段的属性信息;
参数信息写入模块,用于当YUV数据写入模块已将待存储的YUV帧全部写入YUV文件后,在YUV文件中写入参数信息,参数信息为属性信息生成模块依次生成的各片段的属性信息的集合;
长度信息写入模块,用于在参数信息写入模块将参数信息写入YUV文件后,将参数信息的长度写入该YUV文件中,参数信息的长度以预定长度的字节数表示。
本发明的实施方式还提供了一种YUV文件的播放装置,对应于上文的YUV文件的存储装置,包含:
参数信息长度获取模块,用于从YUV文件的尾部读取预定长度的用于表示参数信息长度的字节数,获取参数信息长度;
参数信息读取模块,用于根据参数信息长度,得到参数信息在YUV文件的起始位置和结束位置,并在YUV文件中读取参数信息;
播放模块,用于根据参数信息中包含的各片段的属性信息,播放YUV文件中存储的YUV帧。
本发明实施方式与现有技术相比,主要区别及其效果在于:
将参数信息(即各片段的属性信息)写在YUV帧数据之后,并在参数信息之后,写入参数信息的长度,该参数信息的长度以预定长度的字节数表示。由于在YUV文件的尾部写入了参数信息长度,并且该参数信息长度是以预定长度的字节数表示的,因此在播放时,只需从该YUV文件尾部先读取该预定长度的字节数,即可获取到参数信息的长度,根据该参数信息长度,可得到参数信息在YUV文件的起始位置和结束位置,进而读取到参数信息。由于参数信息包含了依次生成的各片段的属性信息(如帧高、帧宽等),因此可以根据该参数信息还原出各片段中YUV帧的显示参数,完成YUV帧的播放。对于传统的播放器而言,仍是从从文件头开始读取一帧帧固定长度的数据,并且无需手动输入参数,无需额外保存参数信息,极大的改善了YUV文件的播放可控性,实现YUV文件的自适应播放。而且,由于不同片段中包含的是不同类型的帧,因此可以实现YUV单文件的多分辨率的,变帧率的播放。
进一步地,在将参数信息的长度写入该YUV文件后,还需在YUV文件的末尾设置长度固定的标识符。通过标识符的设置,可使得播放装置能轻易地判别YUV文件为携带参数信息的YUV文件,还是纯YUV数据的文件,从而选择相应的播放方法,因此能够较好地与现有技术相兼容。
进一步地,标识符的长度至少为4个字节。由于四字节的数据一共是32位,出现伪标识符的概率至少是1/232,因此可以较好地避免发生出现伪标识符的情况。
进一步地,生成的各片段的属性信息,分别保存在相同的数据结构中,不同片段所对应的用于保存本片段的属性信息的数据结构,使用不同的结构名称。采用相同的数据结构保存各片段的属性信息,有利于在播放时能够更方便地读取对各片段的属性信息。
具体实施方式
在以下的叙述中,为了使读者更好地理解本申请而提出了许多技术细节。但是,本领域的普通技术人员可以理解,即使没有这些技术细节和基于以下各实施方式的种种变化和修改,也可以实现本申请各权利要求所要求保护的技术方案。
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明的实施方式作进一步地详细描述。
本发明第一实施方式涉及一种YUV文件的存储方法,在本实施方式中,预先设置如下数据结构:
一个上述数据结构对应一个片段(同类型的YUV帧属于同一个片段),用于保存该片段的属性信息(即该片段的数据开始位置、片段的数据结束位置、属于该片段的YUV帧的帧宽、帧高、YUV格式、帧率等等)。也就是说,如果待存储的YUV帧共有N种类型,则这N种类型的YUV帧分别属于N个片段,利用N个上述数据结构保存各片段的属性信息。不同片段所对应的数据结构,使用不同的结构名称。采用相同的数据结构保存各片段的属性信息,有利于在播放时能够更方便地读取对各片段的属性信息。通常一个数据结构的大小占16个字节。
本实施方式的具体流程如图1所示,在步骤101中,获取一帧待存储的YUV帧。
接着,进入步骤102,获取待存储的YUV帧的相关信息,如该YUV帧的帧宽、帧高、YUV格式、帧率等等。
接着,进入步骤103,判断步骤101中获取的YUV帧是否属于已有片段的帧,本实施方式中,将同类型的YUV帧作为一个片段。如果判定为不属于已有片段的帧,则进入步骤104;如果属于已有片段的帧,则进入步骤105。
比如说,如果步骤101中获取的YUV帧是待存储的第一帧,则由于尚未存在任何片段,此时该YUV帧不可能属于已有片段,需要进入步骤104。或者,如果该YUV帧的相关信息(如帧宽、帧高、YUV格式、帧率等等),与之前获取的YUV帧的相关信息发生了变化,则说明该YUV帧属于一个新的片段,不属于已有片段,也同样需要进入步骤104。
在步骤104中,生成该YUV帧所属片段的属性信息,并将生成的该片段的属性信息保存在一个上述数据结构中。当然,不同片段所对应的用于保存本片段的属性信息的数据结构,需要使用不同的结构名称。
在步骤105中,将获取的YUV帧写入YUV文件中。
接着,进入步骤106,判断待存储的YUV帧是否已全部存储结束,即判断待存储的YUV帧是否已全部写入YUV文件中。如果已全部写入YUV文件中,则进入步骤107,如果尚未全部写入YUV文件中,则回到步骤101,继续获取一帧YUV,直至待存储的YUV帧已全部写入YUV文件,进入步骤107。
在步骤107中,在YUV文件中写入参数信息,参数信息为依次生成的各片段的属性信息的集合。也就是说,如果有N个片段,则该参数信息为依次生成的N个上述数据结构,每个数据结构中保存有所对应的片段的属性信息。由于在进入本步骤之前,待存储的YUV帧势必已全部写入YUV文件中,因此参数信息势必是写在所有待存储的YUV帧的数据之后。在实际应用中,可以采用四字节对齐的方式,将参数信息写入YUV文件中,以避免内存读取偏移的问题。
接着,进入步骤108,在参数信息后,将参数信息的长度写入该YUV文件中,参数信息的长度以预定长度的字节数表示。在本实施方式中,参数信息的长度用四个字节表示。也就是说,YUV文件的末尾4个字节,为参数信息的长度,如图2所示。
本发明第二实施方式涉及一种YUV文件的播放方法,本实施方式的YUV文件的播放方法与第一实施方式的YUV文件的存储方法相对应。
具体流程如图3所示,在步骤301中,从YUV文件的尾部读取预定长度的用于表示参数信息长度的字节数,获取参数信息长度。由于在第一实施方式中,预定长度的用于表示参数信息长度的字节数为4个字节,因此在本步骤中,读取YUV文件尾部的4个字节,即读取YUV文件中倒数的第1至第4个字节,获取参数信息长度。
接着,在步骤302中,根据参数信息长度,得到参数信息在YUV文件的起始位置和结束位置,并在YUV文件中读取参数信息。由于参数信息中包含了各片段的属性信息,因此可通过读取参数信息,得到各片段所对应的数据结构中保存的本片段的属性信息。
接着,在步骤303中,读取一个片段的属性信息,即读取一个片段所对应的数据结构。
接着,在步骤304中,根据读取的数据结构中所保存的片段的属性信息(包括该片段的数据开始位置、该片段的数据结束位置、该片段中的帧宽、帧高、YUV格式、帧率),重设显示参数。
接着,在步骤305中,读取一帧YUV帧。
接着,在步骤306中,根据重设的显示参数,还原所读取的YUV帧。
接着,在步骤307中,判断该YUV帧所属的片段是否已结束,如果已经结束,则进入步骤308,如果尚未结束,则回到步骤305,继续读取一帧YUV帧。
在步骤308中,判断YUV文件是否已经结束,即该YUV文件中所存储的YUV数据是否已全部播放完,如果已全部播放完,则结束本流程;如果尚未全部播放完,则回到步骤303,继续读取一个片段的属性信息。
也就是说,对于YUV文件中的每个片段,根据从该片段的属性信息中获取的该片段的数据开始位置、该片段的数据结束位置、该片段中的帧宽、帧高、YUV格式、帧率,播放该片段中的YUV帧,直至完成YUV文件中所有存储的YUV帧的播放。
由于在YUV文件的尾部写入了参数信息长度,并且该参数信息长度是以预定长度的字节数表示的,因此在播放时,只需从该YUV文件尾部先读取该预定长度的字节数,即可获取到参数信息的长度,根据该参数信息长度,可得到参数信息在YUV文件的起始位置和结束位置,进而读取到参数信息。由于参数信息包含了依次生成的各片段的属性信息(如帧高、帧宽等),因此可以根据该参数信息还原出各片段中YUV帧的显示参数,完成YUV帧的播放。对于传统的播放器而言,仍是从从文件头开始读取一帧帧固定长度的数据,并且无需手动输入参数,无需额外保存参数信息,极大的改善了YUV文件的播放可控性,实现YUV文件的自适应播放。而且,由于不同片段中包含的是不同类型的帧,因此可以实现YUV单文件的多分辨率的,变帧率的播放。
本发明第三实施方式涉及一种YUV文件的存储方法。第三实施方式在第一实施方式的基础上进行了改进,主要改进之处在于:在本实施方式中,在将参数信息的长度写入该YUV文件后,还需在YUV文件的末尾设置长度固定的标识符,如图4所示。
具体地说,本实施方式的流程如图5所示,步骤501至步骤508分别与步骤101至步骤108相同,在此不再赘述。
在步骤509中,在将参数信息的长度写入该YUV文件后,在YUV文件的末尾设置长度固定的标识符(如HYUV)。在本实施方式中,标识符的长度至少为4个字节。
在本实施方式中,通过标识符的设置,可使得播放装置能轻易地判别YUV文件为携带参数信息的YUV文件,还是纯YUV数据的文件,从而选择相应的播放方法,因此能够较好地与现有技术相兼容。
而且,由于四字节的数据一共是32位,出现伪标识符的概率至少是1/232,因此可以较好地避免发生出现伪标识符的情况。此外,可以理解,在实际应用中,也可以采用小于4个字节的字节数表示标识符。
本发明第四实施方式涉及一种YUV文件的播放方法,本实施方式的YUV文件的播放方法与第三实施方式的YUV文件的存储方法相对应。
本实施方式在第二实施方式的基础上进行了改进,主要改进之处在于:在从YUV文件的尾部读取预定长度的用于表示参数信息长度的字节数之前,还需判断YUV文件的尾部的固定长度的字节数,是否为标识符,如果是标识符,则将标识符在YUV文件中的起始位置,作为该YUV文件的尾部,读取预定长度的用于表示参数信息长度的字节数。
具体地说,由于在YUV文件中,在参数信息的长度后,还设置了长度至少为4个字节的标识符。因此,在本实施方式中,需要先从YUV文件的末尾处读取固定长度的字节数。比如说,标识符为4个字节,那么需读取YUV文件中倒数的第1至第4字节,判断YUV文件中倒数的第1至第4个字节是否为标识符,如果是标识符,则将标识符在YUV文件中的起始位置,作为该YUV文件的尾部,读取预定长度的用于表示参数信息长度的字节数,即读取YUV文件中倒数的第5至第8个字节,获取参数信息长度,之后的流程与第二实施方式相同,在此不再赘述。如果YUV文件中倒数的第1至第4个字节不是标识符,则说明该YUV文件不是携带参数信息的YUV文件,因此采用常规的方法播放该YUV文件,如图6所示。
需要说明的是,本发明的各方法实施方式均可以以软件、硬件、固件等方式实现。不管本发明是以软件、硬件、还是固件方式实现,指令代码都可以存储在任何类型的计算机可访问的存储器中(例如永久的或者可修改的,易失性的或者非易失性的,固态的或者非固态的,固定的或者可更换的介质等等)。同样,存储器可以例如是可编程阵列逻辑(Programmable ArrayLogic,简称“PAL”)、随机存取存储器(Random Access Memory,简称“RAM”)、可编程只读存储器(Programmable Read Only Memory,简称“PROM”)、只读存储器(Read-Only Memory,简称“ROM”)、电可擦除可编程只读存储器(Electrically Erasable Programmable ROM,简称“EEPROM”)、磁盘、光盘、数字通用光盘(Digital Versatile Disc,简称“DVD”)等等。
本发明第五实施方式涉及一种YUV文件的存储装置。如图7所示,该YUV文件的存储装置包含:
YUV数据写入模块,用于将YUV帧顺序写入YUV文件中。
属性信息生成模块,用于将同类型的YUV帧作为一个片段,生成该片段的属性信息。
参数信息写入模块,用于当YUV数据写入模块已将待存储的YUV帧全部写入YUV文件后,在YUV文件中写入参数信息,参数信息为属性信息生成模块依次生成的各片段的属性信息的集合。
长度信息写入模块,用于在参数信息写入模块将参数信息写入YUV文件后,将参数信息的长度写入该YUV文件中,参数信息的长度以预定长度的字节数表示。
其中,每个片段的属性信息包含以下信息:
片段的数据开始位置、片段的数据结束位置、帧宽、帧高、YUV格式、帧率。
值得一提的是,属性信息生成模块将生成的各片段的属性信息,分别保存在相同的数据结构中,不同片段所对应的用于保存本片段的属性信息的数据结构,使用不同的结构名称。
不难发现,第一实施方式是与本实施方式相对应的方法实施方式,本实施方式可与第一实施方式互相配合实施。第一实施方式中提到的相关技术细节在本实施方式中依然有效,为了减少重复,这里不再赘述。相应地,本实施方式中提到的相关技术细节也可应用在第一实施方式中。
本发明第六实施方式涉及一种YUV文件的播放装置,该YUV文件的播放装置用于播放第五实施方式中存储的YUV文件。具体如图8所示,包含:
参数信息长度获取模块,用于从YUV文件的尾部读取预定长度的用于表示参数信息长度的字节数,获取参数信息长度。
参数信息读取模块,用于根据参数信息长度,得到参数信息在YUV文件的起始位置和结束位置,并在YUV文件中读取参数信息。
播放模块,用于根据参数信息中包含的各片段的属性信息,播放YUV文件中存储的YUV帧。
其中,播放模块在根据参数信息中包含的各片段的属性信息,播放YUV文件中存储的YUV帧时,对于每个片段,根据从该片段的属性信息中获取的该片段的数据开始位置、该片段的数据结束位置、该片段中的帧宽、帧高、YUV格式、帧率,播放该片段中的YUV帧。
不难发现,第二实施方式是与本实施方式相对应的方法实施方式,本实施方式可与第二实施方式互相配合实施。第二实施方式中提到的相关技术细节在本实施方式中依然有效,为了减少重复,这里不再赘述。相应地,本实施方式中提到的相关技术细节也可应用在第二实施方式中。
本发明第七实施方式涉及一种YUV文件的存储装置,第七实施方式在第五实施方式的基础上进行了改进,主要改进之处在于:长度信息写入模块还用于在将参数信息的长度写入该YUV文件后,在YUV文件的末尾设置长度固定的标识符。其中,标识符的长度至少为4个字节。
不难发现,第三实施方式是与本实施方式相对应的方法实施方式,本实施方式可与第三实施方式互相配合实施。第三实施方式中提到的相关技术细节在本实施方式中依然有效,为了减少重复,这里不再赘述。相应地,本实施方式中提到的相关技术细节也可应用在第三实施方式中。
本发明第八实施方式涉及一种YUV文件的播放装置,该YUV文件的播放装置用于播放第七实施方式中存储的YUV文件。
第八实施方式在第六实施方式的基础上进行了改进,主要改进之处在于:YUV文件的播放装置还包含:
标识符判断模块,用于在参数信息长度获取模块获取参数信息长度之前,判断YUV文件的尾部的固定长度的字节数,是否为标识符,如果是标识符,则触发参数信息长度获取模块将标识符在YUV文件中的起始位置,作为该YUV文件的尾部,获取参数信息长度。其中,标识符的长度至少为4个字节。
不难发现,第四实施方式是与本实施方式相对应的方法实施方式,本实施方式可与第四实施方式互相配合实施。第四实施方式中提到的相关技术细节在本实施方式中依然有效,为了减少重复,这里不再赘述。相应地,本实施方式中提到的相关技术细节也可应用在第四实施方式中。
需要说明的是,本发明各设备实施方式中提到的各单元都是逻辑单元,在物理上,一个逻辑单元可以是一个物理单元,也可以是一个物理单元的一部分,还可以以多个物理单元的组合实现,这些逻辑单元本身的物理实现方式并不是最重要的,这些逻辑单元所实现的功能的组合是才解决本发明所提出的技术问题的关键。此外,为了突出本发明的创新部分,本发明上述各设备实施方式并没有将与解决本发明所提出的技术问题关系不太密切的单元引入,这并不表明上述设备实施方式并不存在其它的单元。
虽然通过参照本发明的某些优选实施方式,已经对本发明进行了图示和描述,但本领域的普通技术人员应该明白,可以在形式上和细节上对其作各种改变,而不偏离本发明的精神和范围。