
Recherche avancée
Médias (2)
-
SPIP - plugins - embed code - Exemple
2 septembre 2013, par
Mis à jour : Septembre 2013
Langue : français
Type : Image
-
Publier une image simplement
13 avril 2011, par ,
Mis à jour : Février 2012
Langue : français
Type : Video
Autres articles (47)
-
Les formats acceptés
28 janvier 2010, parLes commandes suivantes permettent d’avoir des informations sur les formats et codecs gérés par l’installation local de ffmpeg :
ffmpeg -codecs ffmpeg -formats
Les format videos acceptés en entrée
Cette liste est non exhaustive, elle met en exergue les principaux formats utilisés : h264 : H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 m4v : raw MPEG-4 video format flv : Flash Video (FLV) / Sorenson Spark / Sorenson H.263 Theora wmv :
Les formats vidéos de sortie possibles
Dans un premier temps on (...) -
La file d’attente de SPIPmotion
28 novembre 2010, parUne file d’attente stockée dans la base de donnée
Lors de son installation, SPIPmotion crée une nouvelle table dans la base de donnée intitulée spip_spipmotion_attentes.
Cette nouvelle table est constituée des champs suivants : id_spipmotion_attente, l’identifiant numérique unique de la tâche à traiter ; id_document, l’identifiant numérique du document original à encoder ; id_objet l’identifiant unique de l’objet auquel le document encodé devra être attaché automatiquement ; objet, le type d’objet auquel (...) -
Utilisation et configuration du script
19 janvier 2011, parInformations spécifiques à la distribution Debian
Si vous utilisez cette distribution, vous devrez activer les dépôts "debian-multimedia" comme expliqué ici :
Depuis la version 0.3.1 du script, le dépôt peut être automatiquement activé à la suite d’une question.
Récupération du script
Le script d’installation peut être récupéré de deux manières différentes.
Via svn en utilisant la commande pour récupérer le code source à jour :
svn co (...)
Sur d’autres sites (5569)
-
Adding A New System To The Game Music Website
1er août 2012, par Multimedia Mike — GeneralAt first, I was planning to just make a little website where users could install a Chrome browser extension and play music from old 8-bit NES games. But, like many software projects, the goal sort of ballooned. I created a website where users can easily play old video game music. It doesn’t cover too many systems yet, but I have had individual requests to add just about every system you can think of.
The craziest part is that I know it’s possible to represent most of the systems. Eventually, it would be great to reach Chipamp parity (a combination plugin for Winamp that packages together plugins for many of these chiptunes). But there is a process to all of this. I have taken to defining a number of phases that are required to get a new system covered.
Phase 0 informally involves marveling at the obscurity of some of the console systems for which chiptune collections have evolved. WonderSwan ? Sharp X68000 ? PC-88 ? I may be viewing this through a terribly Ameri-centric lens. I’ve at least heard of the ZX Spectrum and the Amstrad CPC even if I’ve never seen either.
No matter. The goal is to get all their chiptunes cataloged and playable.
Phase 1 : Finding A Player
The first step is to find a bit of open source code that can play a particular format. If it’s a library that can handle many formats, like Game Music Emu or Audio Overload SDK, even better (probably). The specific open source license isn’t a big concern for me. I’m almost certain that some of the libraries that SaltyGME currently mixes are somehow incompatible, license-wise. I’ll worry about it when I encounter someone who A) cares, and B) is in a position to do something about it. Historical preservation comes first, and these software libraries aren’t getting any younger (I’m finding some that haven’t been touched in a decade).Phase 2 : Test Program
The next phase is to create a basic test bench program that sends a music file into the library, generates a buffer of audio, and shoves it out to the speakers via PulseAudio’s simple API (people like to rip on PulseAudio, but its simple API really lives up to its name and requires pages less boilerplate code to play a few samples than ALSA).Phase 3 : Plug Into Web Player
After successfully creating the test bench and understanding exactly which source files need to be built, the next phase is to hook it up to the main SaltyGME program via the ad-hoc plugin API I developed. This API requires that a player backend can, at the very least, initialize itself based on a buffer of bytes and generate audio samples into an array of 16-bit numbers. The API also provides functions for managing files with multiple tracks and toggling individual voices/channels if the library supports such a feature. Having the test bench application written beforehand usually smooths out this step.But really, I’m just getting started.
Phase 4 : Collecting A Song Corpus
Then there is the matter of staging a collection of songs for a given system. It seems like it would just be a matter of finding a large collection of songs for a given format, downloading them in bulk, and mirroring them. Honestly, that’s the easy part. People who are interested in this stuff have been lovingly curating massive collections of these songs for years (see SNESmusic.org for one of the best examples, and they also host a torrent of all their music for really quick and easy hoarding).
In my drive to make this game music website more useful for normal people, the goal is to extract as much metadata as possible to make searching better, and to package the data so that it’s as convenient as possible for users. Whenever I seek to add a new format to the collection, this is the phase where I invariably find that I have to fundamentally modify some of the assumptions I originally made in the player.First, there were the NES Sound Format (NSF) files, the original format I wanted to play. These are files that have any number of songs packed into a single file. Playback libraries expose APIs to jump to individual tracks. So the player was designed around that. Game Boy GBS files also fall into this category but present a different challenge vis-à-vis metadata, addressed in the next phase.
Then, there were the SPC files. Each SPC file is its own song and multiple SPC files are commonly bundled as RAR files. Not wanting to deal with RAR, or any format where I interacted with a general compression API to pull a few files out, I created a custom resource format (inspired by so many I have studied and documented) and compressed it with a simpler compression API. I also had to modify some of the player’s assumptions to deal with this archive format. Genesis VGMs, bundled either in .zip or .7z, followed the same model as SPC in RAR.
Then it was suggested that I attempt to bring SaltyGME closer to feature parity with Chipamp, rather than just being a Chrome browser frontend for Game Music Emu. When I studied the Portable Sound Format (PSF), I realized it didn’t fit into the player model I already had. PSF uses a sort of shared library model for code execution and I developed another resource archive format to cope with it. So that covers quite a few formats.
One more architecture challenge arose when I started to study one of the prevailing metadata formats, explained in the next phase.
Phase 5 : Metadata
Finally, for the collections to really be useful, I need to harvest that juicy metadata for search and presentation.I have created a series of programs and scripts to scrape metadata out of these music files and store it all in a database that drives the website and search engine. I recognize that it’s no good to have a large corpus of songs with minimal metadata and while importing bulk quantities of music, the scripts harshly reject songs that have too little metadata.
Again, challenges abound. One of the biggest challenges I’m facing is the peculiar quasi-freeform metadata format that emerged as .m3u that takes a form similar to :
################################################################# # # GRADIUS2 # (c) KONAMI by Furukawa Motoaki, IKACHAN # #################################################################
nemesis2.kss::KSS,62,[Nemesis2] (Opening),2:23,,0
nemesis2.kss::KSS,61,[Nemesis2] (Start),7,,0
nemesis2.kss::KSS,43,[Nemesis2] (Air Battle),34,0-
nemesis2.kss::KSS,44,[Nemesis2] (1st. BGM),51,0-
[...]A lot of file formats (including Game Boy GBS mentioned earlier) store their metadata separately using this format. I have some ideas about tools I can use to help me process this data but I’m pretty sure each one will require some manual intervention.
As alluded to in phase 4, .m3u presents another architectural challenge : Notice the second field in the CSV .m3u data. That’s a track number. A player can’t expect every track in a bundled chiptune file to be valid, nor to be in any particular order. Thus, I needed to alter the architecture once more to take this into account. However, instead of modifying the SaltyGME player, I simply extended the metadata database to include a playback order which, by default, is the same as the track order but can also accommodate this new issue. This also has the bonus of providing a facility to exclude playback of certain tracks. This comes in handy for many PSF archives which tend to include files that only provide support for other files and aren’t meant to be played on their own.
Bright Side
The reward for all of this effort is that the data lands in a proper database in the end. None of it goes back into the chiptune files themselves. This makes further modification easier as all of the data that is indexed and presented on the site comes from the database. Somewhere down the road, I should probably create an API for accessing this metadata. -
Progress Bar findviewbyid returns null
1er avril 2017, par ziad kiwanHelp me please it’s getting frustrating !
i’m doing a chat application where i’m adding views to a linear layout programmatically each time a user press the send button the code is below :
public void appendToMessageHistory(String id,String uname, String messa,String messageType, final String filepath, String DownloadStatus,boolean internet,int type) {
//TextView tv=new TextView(Messaging.this);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(Width, LinearLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(0, 10, 0, 0);
View v = getLayoutInflater().inflate(R.layout.message_entity, null);
TextView mess;
TextView time;
final ImageView iv;
final ProgressBar progressBar;
ImageView statusiv;
if (friend.userName.equals(uname)) {
v = getLayoutInflater().inflate(R.layout.message_entity, null);
v.setId(Integer.parseInt(id));
mess = (TextView) v.findViewById(R.id.message_entity_message);
time = (TextView) v.findViewById(R.id.message_entity_time);
iv = (ImageView) v.findViewById(R.id.message_entity_imageview);
statusiv = (ImageView) v.findViewById(R.id.imageView);
progressBar = (ProgressBar) v.findViewById(R.id.message_entity_progressbar);
} else {
v = getLayoutInflater().inflate(R.layout.message_entity_right, null);
lp.gravity = Gravity.RIGHT;
v.setId(Integer.parseInt(id));
mess = (TextView) v.findViewById(R.id.message_entity_right_message);
time = (TextView) v.findViewById(R.id.message_entity_right_time);
iv = (ImageView) v.findViewById(R.id.message_entity_right_imageview);
statusiv = (ImageView)v.findViewById(R.id.imageViewleft);
progressBar = (ProgressBar) v.findViewById(R.id.message_entity_Right_progressbar);
}
try {
progressBar.setId(Integer.parseInt(id));
} catch (Exception e) {
e.printStackTrace();
}
if (messageType != null) {
if (messageType.equals(MessageInfo.MESSAGE_TYPE_PIC)) {
iv.setImageBitmap(ImageHandlet.GetBitmapFromPath(filepath));
progressBar.setVisibility(View.GONE);
iv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file://" + filepath), "image/png");
startActivity(intent);
Log.d("FIlePAth", filepath);
}
});
} else if (messageType.equals(MessageInfo.MESSAGE_TYPE_VIDEO)) {
if (DownloadStatus.equals(LocalStorageHandler.DOWNLOADED)) {
if(!(friend.userName.equals(uname))) {
if (type != 3) {
Bitmap bitTh = ThumbnailUtils.createVideoThumbnail(filepath, MediaStore.Images.Thumbnails.MINI_KIND);
iv.setImageBitmap(bitTh);
progressBar.setVisibility(View.GONE);
iv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(filepath));
intent.setDataAndType(Uri.parse(filepath), "video/mp4");
startActivity(intent);
}
});
} else {
Log.w("Zipping","Progress Bar");
progressBar.setVisibility(View.VISIBLE);
}
} else {
Bitmap bitTh = ThumbnailUtils.createVideoThumbnail(filepath, MediaStore.Images.Thumbnails.MINI_KIND);
iv.setImageBitmap(bitTh);
progressBar.setVisibility(View.GONE);
iv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(filepath));
intent.setDataAndType(Uri.parse(filepath), "video/mp4");
startActivity(intent);
}
});
}
} else if (DownloadStatus.equals(LocalStorageHandler.NotDOWNLOADED)) {
iv.setTag(id);
iv.setImageResource(R.drawable.download);
iv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
progressBar.setVisibility(View.VISIBLE);
Cursor c = localstoragehandler.getIDnfo(iv.getTag().toString());
String filepath = "";
//Toast.makeText(getApplication(),iv.getTag().toString()+" iD " +iv.getId(),Toast.LENGTH_SHORT).show();
while (c.moveToNext()) {
String msg0 = c.getString(0);
String msg2 = c.getString(2);
String msg3 = c.getString(3);
String msg4 = c.getString(4);
String msg5 = c.getString(5);
String msg6 = c.getString(6);
filepath = msg5;
Log.d("-----------Vedio-----", "------------------");
Log.d("DATABASE---------", msg0);
Log.d("DATABASE-------", msg2);
Log.d("DATABASE---------", msg3);
Log.d("DATABASE-----", msg4 + "");
Log.d("DATABASE-------", msg5 + "");
Log.d("DATABASE----------", msg6 + "");
Log.d("--------END-------", "-------END-----------");
}
Toast.makeText(getApplicationContext(), filepath.toString() + iv.getTag().toString(), Toast.LENGTH_SHORT).show();
DownloadFileFromURL downloadFileFromURL = new DownloadFileFromURL(filepath, iv.getTag().toString());
downloadFileFromURL.execute("");
}
});
}
} else {
iv.setVisibility(View.GONE);
progressBar.setVisibility(View.GONE);
}
}
if(!(messageType.equals(MessageInfo.MESSAGE_TYPE_VIDEO))) {
if (!internet) {
statusiv.setImageResource(R.drawable.noconnectionl);
}
}
mess.setText(messa);
//time.setText(sendt);
v.setLayoutParams(lp);
final View lastview = v;
runOnUiThread(new Runnable() {
@Override
public void run() {
mEssageBox.addView(lastview);
}
});
scrollView.post(new Runnable() {
@Override
public void run() {
scrollView.fullScroll(View.FOCUS_DOWN);
messageText.requestFocus();
}
});
}and here is the XML of the dialogbox :
<?xml version="1.0" encoding="utf-8"?>
<relativelayout>
<imageview></imageview>
<relativelayout>
<textview></textview>
<textview></textview>
<imageview></imageview>
<progressbar style="?android:attr/progressBarStyleLarge"></progressbar>
</relativelayout>
</relativelayout>And here is the code to send the video message :
final String message = messageText.getText().toString();
final Long rowid = localstoragehandler.insert(imService.getUsername(), friend.userName, message, MessageInfo.MESSAGE_TYPE_VIDEO, ZippedVideoPath, LocalStorageHandler.DOWNLOADED); //insert data into db and get to chat_id
appendToMessageHistory(rowid + "", imService.getUsername(), message, MessageInfo.MESSAGE_TYPE_VIDEO, ZippedVideoPath, LocalStorageHandler.DOWNLOADED, internet,3);// append the video with type 3 to just display the progress
messageText.setText("Video");
String newstr = null;
// intialize the asynctask to upload the video
class UploadVideo extends AsyncTask {
ProgressDialog uploading;
View V;
UploadVideo(View v){
V = v;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
// uploading = ProgressDialog.show(Messaging.this, "Uploading File", "Please wait...", false, false);
}
@Override
protected String doInBackground(Void... params) {
return imService.sendVideoMessage(imService.getUsername(), friend.userName, message, MessageInfo.MESSAGE_TYPE_VIDEO, "", ZippedVideoPath);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
// RelativeLayout v = (RelativeLayout) V.findViewById(rowid.intValue());
// Log.w("Zipping",v.toString());
// ProgressBar progressBar1 = (ProgressBar) V.findViewById(R.id.message_entity_Right_progressbar);
// Log.w("Zipping",progressBar1.toString());
// ImageView iv = (ImageView) v.findViewById(R.id.message_entity_right_imageview);
// progressBar1.setVisibility(View.GONE);
// Log.d("POST Execute", s + "");
//textViewResponse.setText(Html.fromHtml("<b>Uploaded at <a href="http://stackoverflow.com/feeds/tag/" + s + "">" + s + "</a></b>"));
//textViewResponse.setMovementMethod(LinkMovementMethod.getInstance());
// here i am preparing the path so when the compress is done to save into.
}
}
if (null != absolute && absolute.length() > 0) {
int endIndex = absolute.lastIndexOf("/");
if (endIndex != -1) {
newstr = absolute.substring(endIndex, absolute.length()); // not forgot to put check if(endIndex != -1)
}
}
Log.w("Zipping", newstr);
final File videosdir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/videos/");
if (!videosdir.exists()) {
videosdir.mkdirs();
}
ZippedVideoPath = videosdir.getAbsolutePath() + "/" + newstr;
Log.w("Zipping", ZippedVideoPath);
// here i got the ffmpeg library from the net to compress the video and i'm preparing the commands
String[] complexCommand = {"-y", "-i", absolute, "-strict", "experimental", "-r", "25", "-vcodec", "mpeg4", "-b:a", "150k", "-ab", "48000", "-ac", "2", "-ar", "22050", ZippedVideoPath};
FFmpeg ffmpeg = FFmpeg.getInstance(getBaseContext());
try {
// to execute "ffmpeg -version" command you just need to pass "-version"
ffmpeg.execute(complexCommand, new ExecuteBinaryResponseHandler() {
@Override
public void onStart() {
Log.w("Zipping", "started");
}
@Override
public void onProgress(String message) {
}
@Override
public void onFailure(String message) {
Log.w("Zipping", message);
}
@Override
public void onSuccess(String message1) {
Log.w("Zipping","Success");
RelativeLayout v = (RelativeLayout) mEssageBox.findViewById(rowid.intValue());
Log.w("VideoView",v.toString());
ProgressBar progressBar = (ProgressBar) v.findViewById(R.id.message_entity_Right_progressbar);
ImageView iv = (ImageView) v.findViewById(R.id.message_entity_right_imageview);
// progressBar.setVisibility(View.GONE);
Bitmap bitTh = ThumbnailUtils.createVideoThumbnail(ZippedVideoPath, MediaStore.Images.Thumbnails.MINI_KIND);
iv.setImageBitmap(bitTh);
progressBar.setVisibility(View.GONE);
iv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(ZippedVideoPath));
intent.setDataAndType(Uri.parse(ZippedVideoPath), "video/mp4");
startActivity(intent);
}
});
UploadVideo uv = new UploadVideo(v);
uv.execute();
}
@Override
public void onFinish() {
}
});
} catch (FFmpegCommandAlreadyRunningException e) {
Log.w("Zipping", e.toString());
}
}okay now to the problem when i call the findviewbyid for the progress bar in sendvideomessage ffmpeg onsuccess callback it returns null even though the findviewbyid for the the imageview which is in the same layout it returns the view ! so please tell me what is the problem
public void onSuccess(String message1) {
Log.w("Zipping","Success");
RelativeLayout v = (RelativeLayout) mEssageBox.findViewById(rowid.intValue()); ;
ProgressBar progressBar = (ProgressBar) v.findViewById(R.id.message_entity_Right_progressbar); // this keeps returning null!
ImageView iv = (ImageView) v.findViewById(R.id.message_entity_right_imageview); // returns the view
// progressBar.setVisibility(View.GONE);
Bitmap bitTh = ThumbnailUtils.createVideoThumbnail(ZippedVideoPath, MediaStore.Images.Thumbnails.MINI_KIND);
iv.setImageBitmap(bitTh);
progressBar.setVisibility(View.GONE);
iv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(ZippedVideoPath));
intent.setDataAndType(Uri.parse(ZippedVideoPath), "video/mp4");
startActivity(intent);
}
});
UploadVideo uv = new UploadVideo(v);
uv.execute();
}Thank you !
-
Making Your First-Party Data Work for You and Your Customers
11 mars, par Alex CarmonaAt last count, 162 countries had enacted data privacy policies of one kind or another. These laws or regulations, without exception, intend to eliminate the use of third-party data. That puts marketing under pressure because third-party data has been the foundation of online marketing efforts since the dawn of the Internet.
Marketers need to future-proof their operations by switching to first-party data. This will require considerable adjustment to systems and processes, but the reward will be effective marketing campaigns that satisfy privacy compliance requirements and bring the business closer to its customers.
To do that, you’ll need a coherent first-party data strategy. That’s what this article is all about. We’ll explain the different types of personal data and discuss how to use them in marketing without compromising or breaching data privacy regulations. We’ll also discuss how to build that strategy in your business.
So, let’s dive in.
The different data types
There are four distinct types of personal data used in marketing, each subject to different data privacy regulations.
Before getting into the different types, it’s essential to understand that all four may comprise one or more of the following :
Identifying data Name, email address, phone number, etc. Behavioural data Website activity, app usage, wishlist content, purchase history, etc. Transactional data Orders, payments, subscription details, etc. Account data Communication preferences, product interests, wish lists, etc. Demographic data Age, gender, income level, education, etc. Geographic Data Location-based information, such as zip codes or regional preferences. Psychographic Data Interests, hobbies and lifestyle preferences. First-party data
When businesses communicate directly with customers, any data they exchange is first-party. It doesn’t matter how the interaction occurs : on the telephone, a website, a chat session, or even in person.
Of course, the parties involved aren’t necessarily individuals. They may be companies, but people within those businesses will probably share at least some of the data with colleagues. That’s fine, so long as the data :
- Remains confidential between the original two parties involved, and
- It is handled and stored following applicable data privacy regulations.
The core characteristic of first-party data is that it’s collected directly from customer interactions. This makes it reliable, accurate and inherently compliant with privacy regulations — assuming the collecting party complies with data privacy laws.
A great example of first-party data use is in banking. Data collected from customer interactions is used to provide personalised services, detect fraud, assess credit risk and improve customer retention.
Zero-party data
There’s also a subset of first-party data, sometimes called zero-party data. It’s what users intentionally and proactively share with a business. It can be preferences, intentions, personal information, survey responses, support tickets, etc.
What makes it different is that the collection of this data depends heavily on the user’s trust. Transparency is a critical factor, too ; visitors expect to be informed about how you’ll use their data. Consumers also have the right to withdraw permission to use all or some of their information at any time.
Second-party data
This data is acquired from a separate organisation that collects it firsthand. Second-party data is someone else’s first-party data that’s later shared with or sold to other businesses. The key here is that whoever owns that data must give explicit consent and be informed of who businesses share their data with.
A good example is the cooperation between hotel chains, car rental companies, and airlines. They share joint customers’ flight data, hotel reservations, and car rental bookings, much like travel agents did before the internet undermined that business model.
Third-party data
This type of data is the arch-enemy of lawmakers and regulators trying to protect the personal data of citizens and residents in their country. It’s information collected by entities that have no direct relationship with the individuals whose data it is.
Third-party data is usually gathered, aggregated, and sold by data brokers or companies, often by using third-party cookies on popular websites. It’s an entire business model — these third-party brokers sell data for marketing, analytics, or research purposes.
Most of the time, third-party data subjects are unaware that their data has been gathered and sold. Hence the need for strong data privacy regulations.
Benefits of a first-party data strategy
First-party data is reliable, accurate, and ethically sourced. It’s an essential part of any modern digital marketing strategy.
More personalised experiences
The most important application of first-party data is customising and personalising customers’ interactions based on real behaviours and preferences. Personalised experiences aren’t restricted to websites and can extend to all customer communication.
The result is company communications and marketing messages are far more relevant to customers. It allows businesses to engage more meaningfully with them, building trust and strengthening customer relationships. Inevitably, this also results in stronger customer loyalty and better customer retention.
Greater understanding of customers
Because first-party data is more accurate and reliable, it can be used to derive valuable insights into customer needs and wants. When all the disparate first-party data points are centralised and organised, it’s possible to uncover trends and patterns in customer behaviour that might not be apparent using other data.
This helps businesses predict and respond to customer needs. It also allows marketing teams to be more deliberate when segmenting customers and prospects into like-minded groups. The data can also be used to create more precise personas for future campaigns or reveal how likely a customer would be to purchase in response to a campaign.
Build trust with customers
First-party data is unique to a business and originates from interactions with customers. It’s also data collected with consent and is “owned” by the company — if you can ever own someone else’s data. If treated like the precious resource, it can help businesses build trust with customers.
However, developing that trust requires a transparent, step-by-step approach. This gradually strengthens relationships to the point where customers are more comfortable sharing the information they’re asked for.
However, while building trust is a long and sometimes arduous process, it can be lost in an instant. That’s why first-party data must be protected like the Crown Jewels.
Components of a first-party data strategy
Security is essential to any first-party data strategy, and for good reason. As Gartner puts it, a business must find the optimal balance between business outcomes and data risk mitigation. Once security is baked in, attention can turn to the different aspects of the strategy.
Data collection
There are many ways to collect first-party data ethically, within the law and while complying with data privacy regulations, such as Europe’s General Data Protection Regulation (GDPR). Potential sources include :
Website activity forms and surveys, behavioural tracking, cookies, tracking pixels and chatbots Mobile app interactions in-app analytics, push notifications and in-app forms Email marketing newsletter sign-ups, email engagement tracking, promotions, polls and surveys Events registrations, post-event surveys and virtual event analytics Social media interaction polls and surveys, direct messages and social media analytics Previous transactions purchase history, loyalty programmes and e-receipts Customer service call centre data, live chat, chatbots and feedback forms In-person interactions in-store purchases, customer feedback and Wi-Fi sign-ins Gated content whitepapers, ebooks, podcasts, webinars and video downloads Interactive content quizzes, assessments, calculators and free tools CRM platforms customer profiles and sales data Consent management privacy policies, consent forms, preference setting Consent management
It may be the final item on the list above, but it’s also a key requirement of many data privacy laws and regulations. For example, the GDPR is very clear about consent : “Processing personal data is generally prohibited, unless it is expressly allowed by law, or the data subject has consented to the processing.”
For that reason, your first-party data strategy must incorporate various transparent consent mechanisms, such as cookie banners and opt-in forms. Crucially, you must provide customers with a mechanism to manage their preferences and revoke that consent easily if they wish to.
Data management
Effective first-party data management, mainly its security and storage, is critical. Most data privacy regimes restrict the transfer of personal data to other jurisdictions and even prohibit it in some instances. Many even specify where residents’ data must be stored.
Consider this cautionary tale : The single biggest fine levied for data privacy infringement so far was €1.2 billion. The Irish Data Protection Commission imposed a massive fine on Meta for transferring EU users’ data to the US without adequate data protection mechanisms.
Data security is critical. If first-party data is compromised, it becomes third-party data, and any customer trust developed with the business will evaporate. To add insult to injury, data regulators could come knocking. That’s why the trend is to use encryption and anonymisation techniques alongside standard access controls.
Once security is assured, the focus is on data management. Many businesses use a Customer Data Platform. This software gathers, combines and manages data from many sources to create a complete and central customer profile. Modern CRM systems can also do that job. AI tools could help find patterns and study them. But the most important thing is to keep databases clean and well-organised to make it easier to use and avoid data silos.
Data activation
Once first-party data has been collected and analysed, it needs to be activated, which means a business needs to use it for the intended purpose. This is the implementation phase where a well-constructed first-party strategy pays off.
The activation stage is where businesses use the intelligence they gather to :
- Personalise website and app experiences
- Adapt marketing campaigns
- Improve conversion rates
- Match stated preferences
- Cater to observed behaviours
- Customise recommendations based on purchase history
- Create segmented email campaigns
- Improve retargeting efforts
- Develop more impactful content
Measurement and optimisation
Because first-party data is collected directly from customers or prospects, it’s far more relevant, reliable, and specific. Your analytics and campaign tracking will be more accurate. This gives you direct and actionable insights into your audience’s behaviour, empowering you to optimise your strategies and achieve better results.
The same goes for your collection and activation efforts. An advanced web analytics platform like Matomo lets you identify key user behaviour and optimise your tracking. Heatmaps, marketing attribution tools, user behaviour analytics and custom reports allow you to segment audiences for better traction (and collect even more first-party data).
How to build a first-party data strategy
There are five important and sequential steps to building a first-party data strategy. But this isn’t a one-time process. It must be revisited regularly as operating and regulatory environments change. There are five steps :
- Audit existing data
Chances are that customers already freely provide a lot of first-party data in the normal course of business. The first step is to locate this data, and the easiest way to do that is by mapping the customer journey. This identifies all the touchpoints where first-party data might be found.
- Define objectives
Then, it’s time to step back and figure out the goals of the first-party data strategy. Consider what you’re trying to achieve. For example :
- Reduce churn
- Expand an existing loyalty programme
- Unload excess inventory
- Improve customer experiences
Whatever the objectives are, they should be clear and measurable.
- Implement tools and technology
The first two steps point to data gaps. Now, the focus turns to ethical web analytics with a tool like Matomo.
To further comply with data privacy regulations, it may also be appropriate to implement a Consent Management Platform (CMP) to help manage preferences and consent choices.
- Build trust with transparency
With the tools in place, it’s time to engage customers. To build trust, keep them informed about how their data is used and remind them of their right to withdraw their consent.
Transparency is crucial in such engagement, as outlined in the 7 GDPR principles.
- Continuously improve
Rinse and repeat. The one constant in business and life is change. As things change, they expose weaknesses or flaws in the logic behind systems and processes. That’s why a first-party data strategy needs to be continually reviewed, updated, and revised. It must adapt to changing trends, markets, regulations, etc.
Tools that can help
Looking back at the different types of data, it’s clear that some are harder and more bothersome to get than others. But capturing behaviours and interactions can be easy — especially if you use tools that follow data privacy rules.
But here’s a tip. Google Analytics 4 isn’t compliant by default, especially not with Europe’s GDPR. It may also struggle to comply with some of the newer data privacy regulations planned by different US states and other countries.
Matomo Analytics is compliant with the GDPR and many other data privacy regulations worldwide. Because it’s open source, it can be integrated with any consent manager.
Get started today by trying Matomo for free for 21 days,
no credit card required.