8#include <QtCore/qbuffer.h>
9#include <QtCore/qiodevice.h>
10#include <QtCore/qdatetime.h>
11#include <QtCore/qlocale.h>
12#include <QtCore/qurl.h>
14#include <QtMultimedia/qvideoframe.h>
16#if __has_include(<AppKit/AppKit.h>)
20#include <CoreFoundation/CoreFoundation.h>
28 AVMetadataIdentifier
ID3;
35 { AVMetadataCommonIdentifierTitle, AVMetadataIdentifieriTunesMetadataSongName,
36 AVMetadataIdentifierQuickTimeMetadataTitle,
37 AVMetadataIdentifierID3MetadataTitleDescription,
38 nil, AVMetadata3GPUserDataKeyTitle },
40 { AVMetadataCommonIdentifierAuthor,AVMetadataIdentifieriTunesMetadataAuthor,
41 AVMetadataIdentifierQuickTimeMetadataAuthor, nil,
42 AVMetadataQuickTimeUserDataKeyAuthor, AVMetadata3GPUserDataKeyAuthor },
44 { nil, AVMetadataIdentifieriTunesMetadataUserComment,
45 AVMetadataIdentifierQuickTimeMetadataComment, AVMetadataIdentifierID3MetadataComments,
46 AVMetadataQuickTimeUserDataKeyComment, nil },
48 { AVMetadataCommonIdentifierDescription,AVMetadataIdentifieriTunesMetadataDescription,
49 AVMetadataIdentifierQuickTimeMetadataDescription, nil,
50 AVMetadataQuickTimeUserDataKeyDescription, AVMetadata3GPUserDataKeyDescription },
52 { nil, AVMetadataIdentifieriTunesMetadataUserGenre,
53 AVMetadataIdentifierQuickTimeMetadataGenre, nil,
54 AVMetadataQuickTimeUserDataKeyGenre, AVMetadata3GPUserDataKeyGenre },
56 { AVMetadataCommonIdentifierCreationDate, AVMetadataIdentifieriTunesMetadataReleaseDate,
57 AVMetadataIdentifierQuickTimeMetadataCreationDate, AVMetadataIdentifierID3MetadataDate,
58 AVMetadataQuickTimeUserDataKeyCreationDate, AVMetadataISOUserDataKeyDate },
60 { AVMetadataCommonIdentifierLanguage, nil, nil, AVMetadataIdentifierID3MetadataLanguage, nil, nil },
62 { AVMetadataCommonIdentifierPublisher, AVMetadataIdentifieriTunesMetadataPublisher,
63 AVMetadataIdentifierQuickTimeMetadataPublisher, AVMetadataIdentifierID3MetadataPublisher, nil, nil },
65 { AVMetadataCommonIdentifierCopyrights, AVMetadataIdentifieriTunesMetadataCopyright,
66 AVMetadataIdentifierQuickTimeMetadataCopyright, AVMetadataIdentifierID3MetadataCopyright,
67 AVMetadataQuickTimeUserDataKeyCopyright, AVMetadataISOUserDataKeyCopyright },
69 { nil, nil, nil, AVMetadataIdentifierID3MetadataOfficialAudioSourceWebpage, nil, nil },
71 { nil, nil, nil, AVMetadataIdentifierID3MetadataLength, nil, nil },
73 { AVMetadataCommonIdentifierType, nil, nil, AVMetadataIdentifierID3MetadataContentType, nil, nil },
75 { nil, nil, nil, AVMetadataIdentifierID3MetadataFileType, nil, nil },
77 { nil, nil, nil, nil, nil, nil },
79 { nil, nil, nil, nil, nil, nil },
81 { nil, nil, nil, nil, nil, nil },
83 { nil, nil, nil, nil, nil, nil },
85 { nil, nil, AVMetadataIdentifierQuickTimeMetadataCameraFrameReadoutTime, nil, nil, nil },
87 { AVMetadataCommonIdentifierAlbumName, AVMetadataIdentifieriTunesMetadataAlbum,
88 AVMetadataIdentifierQuickTimeMetadataAlbum, AVMetadataIdentifierID3MetadataAlbumTitle,
89 AVMetadataQuickTimeUserDataKeyAlbum, AVMetadata3GPUserDataKeyAlbumAndTrack },
91 { nil, AVMetadataIdentifieriTunesMetadataAlbumArtist, nil, nil,
92 AVMetadataQuickTimeUserDataKeyArtist, AVMetadata3GPUserDataKeyPerformer },
94 { AVMetadataCommonIdentifierArtist, AVMetadataIdentifieriTunesMetadataArtist,
95 AVMetadataIdentifierQuickTimeMetadataArtist, nil, nil, nil },
97 { nil, AVMetadataIdentifieriTunesMetadataTrackNumber,
98 nil, AVMetadataIdentifierID3MetadataTrackNumber, nil, nil },
100 { nil, AVMetadataIdentifieriTunesMetadataComposer,
101 AVMetadataIdentifierQuickTimeMetadataComposer, AVMetadataIdentifierID3MetadataComposer, nil, nil },
103 { nil, AVMetadataIdentifieriTunesMetadataPerformer,
104 AVMetadataIdentifierQuickTimeMetadataPerformer, AVMetadataIdentifierID3MetadataLeadPerformer, nil, nil },
106 { nil, nil, nil, AVMetadataIdentifierID3MetadataAttachedPicture, nil, nil },
108 { AVMetadataCommonIdentifierArtwork, AVMetadataIdentifieriTunesMetadataCoverArt,
109 AVMetadataIdentifierQuickTimeMetadataArtwork, nil, nil, nil },
111 { nil, nil, AVMetadataIdentifierQuickTimeMetadataVideoOrientation, nil, nil, nil },
113 { nil, nil, nil, nil, nil, nil }
120 AVMetadataIdentifier identifier = nil;
121 if ([keySpace isEqualToString:AVMetadataKeySpaceiTunes]) {
123 }
else if ([keySpace isEqualToString:AVMetadataKeySpaceID3]) {
125 }
else if ([keySpace isEqualToString:AVMetadataKeySpaceQuickTimeMetadata]) {
133static std::optional<QMediaMetaData::Key>
toKey(AVMetadataItem *
item)
140 AVMetadataKey commonKey =
item.commonKey;
141 if (commonKey.length != 0) {
142 if ([commonKey isEqualToString:AVMetadataCommonKeyTitle]) {
144 }
else if ([commonKey isEqualToString:AVMetadataCommonKeyDescription]) {
146 }
else if ([commonKey isEqualToString:AVMetadataCommonKeyPublisher]) {
148 }
else if ([commonKey isEqualToString:AVMetadataCommonKeyCreationDate]) {
150 }
else if ([commonKey isEqualToString:AVMetadataCommonKeyType]) {
152 }
else if ([commonKey isEqualToString:AVMetadataCommonKeyLanguage]) {
154 }
else if ([commonKey isEqualToString:AVMetadataCommonKeyCopyrights]) {
156 }
else if ([commonKey isEqualToString:AVMetadataCommonKeyAlbumName]) {
158 }
else if ([commonKey isEqualToString:AVMetadataCommonKeyAuthor]) {
160 }
else if ([commonKey isEqualToString:AVMetadataCommonKeyArtist]) {
167 enum keySpaces { iTunes, QuickTime, QuickTimeUserData, IsoUserData, ID3,
Other } itemKeySpace;
168 itemKeySpace =
Other;
169 AVMetadataKeySpace keySpace = [
item keySpace];
170 AVMetadataIdentifier identifier = [
item identifier];
172 if ([keySpace isEqualToString:AVMetadataKeySpaceiTunes]) {
173 itemKeySpace = iTunes;
174 }
else if ([keySpace isEqualToString:AVMetadataKeySpaceQuickTimeMetadata]) {
175 itemKeySpace = QuickTime;
176 }
else if ([keySpace isEqualToString:AVMetadataKeySpaceQuickTimeUserData]) {
177 itemKeySpace = QuickTimeUserData;
178 }
else if ([keySpace isEqualToString:AVMetadataKeySpaceISOUserData]) {
179 itemKeySpace = IsoUserData;
180 }
else if (([keySpace isEqualToString:AVMetadataKeySpaceID3])) {
185 AVMetadataIdentifier idForKey = nil;
186 switch (itemKeySpace) {
196 case QuickTimeUserData:
206 if ([identifier isEqualToString:idForKey])
217 for (AVMetadataItem*
item in metadataItems) {
237 const CMTime
time = [asset duration];
238 const qint64 duration =
static_cast<qint64>(float(
time.value) / float(
time.timescale) * 1000.0f);
247 if ([asset.mediaType isEqualToString:AVMediaTypeAudio]) {
249 auto *languageCode = asset.languageCode;
253 auto id = CFLocaleCreateCanonicalLanguageIdentifierFromString(kCFAllocatorDefault,
254 (__bridge CFStringRef)languageCode);
255 QString lang = QString::fromCFString(
id);
261 if ([asset.mediaType isEqualToString:AVMediaTypeVideo]) {
275 AVMetadataKeySpace keySpace = AVMetadataKeySpaceCommon)
278 if (!identifier.length)
281 AVMutableMetadataItem *
item = [AVMutableMetadataItem metadataItem];
282 item.keySpace = keySpace;
283 item.identifier = identifier;
288#if defined(Q_OS_MACOS)
295 NSData *
data = arr.toNSData();
296 NSImage *nsImg = [[NSImage alloc] initWithData:
data];
306 item.value = avFormat;
312 item.value = lang.toNSString();
317 int rotation =
value.toInt(&
ok);
319 item.value = [NSNumber numberWithInt:rotation];
322 switch (
value.typeId()) {
323 case QMetaType::QString: {
324 item.value =
value.toString().toNSString();
327 case QMetaType::Int: {
328 item.value = [NSNumber numberWithInt:
value.toInt()];
331 case QMetaType::LongLong: {
332 item.value = [NSNumber numberWithLongLong:
value.toLongLong()];
335 case QMetaType::Double: {
336 item.value = [NSNumber numberWithDouble:
value.toDouble()];
339 case QMetaType::QDate:
340 case QMetaType::QDateTime: {
341 item.value =
value.toDateTime().toNSDate();
344 case QMetaType::QUrl: {
359 NSMutableArray<AVMetadataKeySpace> *keySpaces = [NSMutableArray<AVMetadataKeySpace>
array];
360 if (
format == AVFileTypeAppleM4A) {
361 [keySpaces addObject:AVMetadataKeySpaceiTunes];
362 }
else if (
format == AVFileTypeMPEGLayer3) {
363 [keySpaces addObject:AVMetadataKeySpaceID3];
364 [keySpaces addObject:AVMetadataKeySpaceiTunes];
365 }
else if (
format == AVFileTypeQuickTimeMovie) {
366 [keySpaces addObject:AVMetadataKeySpaceQuickTimeMetadata];
368 [keySpaces addObject:AVMetadataKeySpaceCommon];
370 NSMutableArray<AVMetadataItem *> *avMetaDataArr = [NSMutableArray
array];
371 for (
const auto &
key : metadata.
keys()) {
377 [avMetaDataArr addObject:
item];
380 return avMetaDataArr;
\inmodule QtCore \reentrant
static QString languageToCode(Language language, LanguageCodeTypes codeTypes=AnyLanguageCode)
Returns the two- or three-letter language code for language, as defined in the ISO 639 standards.
static Language codeToLanguage(QStringView languageCode, LanguageCodeTypes codeTypes=AnyLanguageCode) noexcept
Returns the QLocale::Language enum corresponding to the two- or three-letter languageCode,...
\macro QT_RESTRICTED_CAST_FROM_ASCII
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
bool isNull() const
Returns true if this is a null variant, false otherwise.
RotationAngle
The angle of the clockwise rotation that should be applied to a video frame before displaying.
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
GLenum GLenum GLsizei count
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLint GLsizei GLsizei GLenum format