Recherche avancée

Médias (1)

Mot : - Tags -/3GS

Autres articles (96)

  • MediaSPIP 0.1 Beta version

    25 avril 2011, par

    MediaSPIP 0.1 beta is the first version of MediaSPIP proclaimed as "usable".
    The zip file provided here only contains the sources of MediaSPIP in its standalone version.
    To get a working installation, you must manually install all-software dependencies on the server.
    If you want to use this archive for an installation in "farm mode", you will also need to proceed to other manual (...)

  • MediaSPIP Core : La Configuration

    9 novembre 2010, par

    MediaSPIP Core fournit par défaut trois pages différentes de configuration (ces pages utilisent le plugin de configuration CFG pour fonctionner) : une page spécifique à la configuration générale du squelettes ; une page spécifique à la configuration de la page d’accueil du site ; une page spécifique à la configuration des secteurs ;
    Il fournit également une page supplémentaire qui n’apparait que lorsque certains plugins sont activés permettant de contrôler l’affichage et les fonctionnalités spécifiques (...)

  • ANNEXE : Les plugins utilisés spécifiquement pour la ferme

    5 mars 2010, par

    Le site central/maître de la ferme a besoin d’utiliser plusieurs plugins supplémentaires vis à vis des canaux pour son bon fonctionnement. le plugin Gestion de la mutualisation ; le plugin inscription3 pour gérer les inscriptions et les demandes de création d’instance de mutualisation dès l’inscription des utilisateurs ; le plugin verifier qui fournit une API de vérification des champs (utilisé par inscription3) ; le plugin champs extras v2 nécessité par inscription3 (...)

Sur d’autres sites (5847)

  • Using PyAV to encode mono audio to file, params match docs, but still causes Errno 22

    20 février 2023, par andrew8088

    While trying to use PyAV to encode live mono audio from a microphone to a compressed audio stream (using mp2 or flac as encoder), the program kept raising an exception ValueError: [Errno 22] Invalid argument.

    


    To remove the live microphone source as a cause of the problem, and to make the problematic code easier for others to run/test, I have removed the mic source and now just generate a pure tone as a sequence of input buffers.

    


    All attempts to figure out the missing or mismatched or incorrect argument have just resulted in seeing documentation and examples that are the same as my code.

    


    I would like to know from someone who has used PyAV successfully for mono audio what the correct method and parameters are for encoding mono frames into the mono stream.

    


    The package used is av 10.0.0 installed with
pip3 install av --no-binary av
so it uses my package-manager provided ffmpeg library, which is version 4.2.7.

    


    The problematic python code is :

    


    #!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Recreating an error 22 when encoding sound with PyAV.

Created on Sun Feb 19 08:10:29 2023
@author: andrewm
"""
import typing
import sys
import math
import fractions

import av
from av import AudioFrame

""" Ensure some PyAudio constants are still defined without changing 
    the PyAudio recording callback function and without depending 
    on PyAudio simply for reproducing the PyAV bug [Errno 22] thrown in 
    File "av/filter/context.pyx", line 89, in av.filter.context.FilterContext.push
"""
class PA_Stub():
    paContinue = True
    paComplete= False

pyaudio = PA_Stub()


"""Generate pure tone at given frequency with amplitude 0...1.0 at 
   sampling frewuency fs and beginning at phase offset 'phase'.
   Returns the new phase after the sinusoid has cycled over the 
   sampling window length.
"""
def generate_tone(
        freq:int, phase:float, amp:float, fs, samp_fmt, buffer:bytearray
) -> float:
    assert samp_fmt == "s16", "Only s16 supported atm"
    samp_size_bytes = 2
    n_samples = int(len(buffer)/samp_size_bytes)
    window = [int(0) for i in range(n_samples)]
    theta = phase
    phase_inc = 2*math.pi * freq / fs
    for i in range(n_samples):
        v = amp * math.sin(theta)
        theta += phase_inc
        s = int((2**15-1)*v)
        window[i] = s
    for sample_i in range(len(window)):
        byte_i = sample_i * samp_size_bytes
        enc = window[sample_i].to_bytes(
                2, byteorder=sys.byteorder, signed=True
        )
        buffer[byte_i] = enc[0]
        buffer[byte_i+1] = enc[1]
    return theta


channels = 1
fs = 44100  # Record at 44100 samples per second
fft_size_samps = 256
chunk_samps = fft_size_samps * 10  # Record in chunks that are multiples of fft windows.

# print(f"fft_size_samps={fft_size_samps}\nchunk_samps={chunk_samps}")

seconds = 3.0
out_filename = "testoutput.wav"

# Store data in chunks for 3 seconds
sample_limit = int(fs * seconds)
sample_len = 0
frames = []  # Initialize array to store frames

ffmpeg_codec_name = 'mp2'  # flac, mp3, or libvorbis make same error.

sample_size_bytes = 2
buffer = bytearray(int(chunk_samps*sample_size_bytes))
chunkperiod = chunk_samps / fs
total_chunks = int(math.ceil(seconds / chunkperiod))
phase = 0.0

### uncomment if you want to see the synthetic data being used as a mic input.
# with open("test.raw","wb") as raw_out:
#     for ci in range(total_chunks):
#         phase = generate_tone(2600, phase, 0.8, fs, "s16", buffer)
#         raw_out.write(buffer)
# print("finished gen test")
# sys.exit(0)
# #---- 

# Using mp2 or mkv as the container format gets the same error.
with av.open(out_filename+'.mp2', "w", format="mp2") as output_con:
    output_con.metadata["title"] = "My title"
    output_con.metadata["key"] = "value"
    channel_layout = "mono"
    sample_fmt = "s16p"

    ostream = output_con.add_stream(ffmpeg_codec_name, fs, layout=channel_layout)
    assert ostream is not None, "No stream!"
    cctx = ostream.codec_context
    cctx.sample_rate = fs
    cctx.time_base = fractions.Fraction(numerator=1,denominator=fs)
    cctx.format = sample_fmt
    cctx.channels = channels
    cctx.layout = channel_layout
    print(cctx, f"layout#{cctx.channel_layout}")
    
    # Define PyAudio-style callback for recording plus PyAV transcoding.
    def rec_callback(in_data, frame_count, time_info, status):
        global sample_len
        global ostream
        frames.append(in_data)
        nsamples = int(len(in_data) / (channels*sample_size_bytes))
        
        frame = AudioFrame(format=sample_fmt, layout=channel_layout, samples=nsamples)
        frame.sample_rate = fs
        frame.time_base = fractions.Fraction(numerator=1,denominator=fs)
        frame.pts = sample_len
        frame.planes[0].update(in_data)
        print(frame, len(in_data))
        
        for out_packet in ostream.encode(frame):
            output_con.mux(out_packet)
        for out_packet in ostream.encode(None):
            output_con.mux(out_packet)
        
        sample_len += nsamples
        retflag = pyaudio.paContinue if sample_lencode>

    


    If you uncomment the RAW output part you will find the generated data can be imported as PCM s16 Mono 44100Hz into Audacity and plays the expected tone, so the generated audio data does not seem to be the problem.

    


    The normal program console output up until the exception is :

    


    mp2 at 0x7f8e38202cf0> layout#4
Beginning
 5120
. 5120


    


    The stack trace is :

    


    Traceback (most recent call last):&#xA;&#xA;  File "Dev/multichan_recording/av_encode.py", line 147, in <module>&#xA;    ret_data, ret_flag = rec_callback(buffer, ci, {}, 1)&#xA;&#xA;  File "Dev/multichan_recording/av_encode.py", line 121, in rec_callback&#xA;    for out_packet in ostream.encode(frame):&#xA;&#xA;  File "av/stream.pyx", line 153, in av.stream.Stream.encode&#xA;&#xA;  File "av/codec/context.pyx", line 484, in av.codec.context.CodecContext.encode&#xA;&#xA;  File "av/audio/codeccontext.pyx", line 42, in av.audio.codeccontext.AudioCodecContext._prepare_frames_for_encode&#xA;&#xA;  File "av/audio/resampler.pyx", line 101, in av.audio.resampler.AudioResampler.resample&#xA;&#xA;  File "av/filter/graph.pyx", line 211, in av.filter.graph.Graph.push&#xA;&#xA;  File "av/filter/context.pyx", line 89, in av.filter.context.FilterContext.push&#xA;&#xA;  File "av/error.pyx", line 336, in av.error.err_check&#xA;&#xA;ValueError: [Errno 22] Invalid argument&#xA;&#xA;</module>

    &#xA;

    edit : It's interesting that the error happens on the 2nd AudioFrame, as apparently the first one was encoded okay, because they are given the same attribute values aside from the Presentation Time Stamp (pts), but leaving this out and letting PyAV/ffmpeg generate the PTS by itself does not fix the error, so an incorrect PTS does not seem the cause.

    &#xA;

    After a brief glance in av/filter/context.pyx the exception must come from a bad return value from res = lib.av_buffersrc_write_frame(self.ptr, frame.ptr)
    &#xA;Trying to dig into av_buffersrc_write_frame from the ffmpeg source it is not clear what could be causing this error. The only obvious one is a mismatch between channel layouts, but my code is setting the layout the same in the Stream and the Frame. That problem had been found by an old question pyav - cannot save stream as mono and their answer (that one parameter required is undocumented) is the only reason the code now has the layout='mono' argument when making the stream.

    &#xA;

    The program output shows layout #4 is being used, and from https://github.com/FFmpeg/FFmpeg/blob/release/4.2/libavutil/channel_layout.h you can see this is the value for symbol AV_CH_FRONT_CENTER which is the only channel in the MONO layout.

    &#xA;

    The mismatch is surely some other object property or an undocumented parameter requirement.

    &#xA;

    How do you encode mono audio to a compressed stream with PyAV ?

    &#xA;

  • FFMPEG error submitting a packet to the muxer

    27 juillet 2024, par Badgio10177

    I am attempting to stream video frames to a RTSP server using FFMPEG. I instantiate an ffmpeg pipeline in c++. There are times when the process works perfectly and other times I get the error Error submitting a packet to the muxer : Broken pipe. Error muxing a packet. What uis strange is that there are times when the stream works and times when it does not which leads me to believe that the FFMPEG parameters that I set are not necessarily incorrect.

    &#xA;

    I am using a mex function within MATLAB to take in a frame and stream it.

    &#xA;

    // Global variables&#xA;FILE* openPipeLine = NULL;&#xA;&#xA;void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[], int frameWidth, int frameHeight)&#xA;{&#xA;&#xA;    Ptr<mat> inputFrame = ocvMxArrayToImage_uint8(prhs[0], true);&#xA;    Mat processedFrame = *inputFrame;&#xA;&#xA;    // Check if FFMPEG process has been started&#xA;    if (!openPipeLine)&#xA;    {&#xA;        openPipeLine = _popen("ffmpeg -report -f rawvideo -r 10 -video_size 1280x720 -pixel_format bgr24 -i pipe: -vcodec libx264 -pix_fmt yuv420p -f rtsp rtsp://localhost:8554/mystream 2> log.txt", "wb");&#xA;&#xA;    }&#xA;&#xA;    // Write the frame data to the pipeline&#xA;    fwrite(processedFrame.data, 1, frameWidth * frameHeight * 3, openPipeLine);&#xA;    mexAtExit(exitFcn);&#xA;}&#xA;</mat>

    &#xA;

    Below is the full report from the ffmpeg process. Do my operating system variables change from time to time which cause the stream to work at times and break at others ? I am using Windows 10.

    &#xA;

    Log level: 48&#xA;Command line:&#xA;ffmpeg -report -f rawvideo -r 10 -video_size 1280x720 -pixel_format bgr24 -i pipe: -vcodec libx264 -pix_fmt yuv420p -f rtsp rtsp://localhost:8554/mystream&#xA;&#xA;  built with gcc 12.2.0 (Rev10, Built by MSYS2 project)&#xA;  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libaribcaption --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libjxl --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-lib  libavutil      58. 16.101 / 58. 16.101&#xA;  libavcodec     60. 23.100 / 60. 23.100&#xA;  libavformat    60. 10.100 / 60. 10.100&#xA;  libavdevice    60.  2.101 / 60.  2.101&#xA;  libavfilter     9. 11.100 /  9. 11.100&#xA;  libswscale      7.  3.100 /  7.  3.100&#xA;  libswresample   4. 11.100 /  4. 11.100&#xA;  libpostproc    57.  2.100 / 57.  2.100&#xA;Splitting the commandline.&#xA;&#xA;Successfully parsed a group of options.&#xA;Opening an input file: pipe:.&#xA;[rawvideo @ 00000182dba5efc0] Opening &#x27;pipe:&#x27; for reading&#xA;[pipe @ 00000182dba611c0] Setting default whitelist &#x27;crypto,data&#x27;&#xA;[rawvideo @ 00000182dba5efc0] Before avformat_find_stream_info() pos: 0 bytes read:65536 seeks:0 nb_streams:1&#xA;[rawvideo @ 00000182dba5efc0] All info found&#xA;[rawvideo @ 00000182dba5efc0] After avformat_find_stream_info() pos: 2764800 bytes read:2764800 seeks:0 frames:1&#xA;Input #0, rawvideo, from &#x27;pipe:&#x27;:&#xA;  Duration: N/A, start: 0.000000, bitrate: 221184 kb/s&#xA;  Stream #0:0, 1, 1/10: Video: rawvideo (BGR[24] / 0x18524742), bgr24, 1280x720, 221184 kb/s, 10 tbr, 10 tbn&#xA;Successfully opened the file.&#xA;Parsing a group of options: output url rtsp://192.168.0.2:8554/mystream.&#xA;Applying option vcodec (force video codec (&#x27;copy&#x27; to copy stream)) with argument libx264.&#xA;Applying option pix_fmt (set pixel format) with argument yuv420p.&#xA;Applying option f (force format) with argument rtsp.&#xA;Successfully parsed a group of options.&#xA;Opening an output file: rtsp://192.168.0.2:8554/mystream.&#xA;[out#0/rtsp @ 00000182dba72c00] No explicit maps, mapping streams automatically...&#xA;[vost#0:0/libx264 @ 00000182dba75cc0] Created video stream from input stream 0:0&#xA;Successfully opened the file.&#xA;Stream mapping:&#xA;  Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))&#xA;[rawvideo @ 00000182dba72700] PACKET SIZE: 2764800, STRIDE: 3840&#xA;detected 16 logical cores&#xA;[graph 0 input from stream 0:0 @ 00000182dba86180] Setting &#x27;video_size&#x27; to value &#x27;1280x720&#x27;&#xA;[graph 0 input from stream 0:0 @ 00000182dba86180] Setting &#x27;pix_fmt&#x27; to value &#x27;3&#x27;&#xA;[graph 0 input from stream 0:0 @ 00000182dba86180] Setting &#x27;time_base&#x27; to value &#x27;1/10&#x27;&#xA;[graph 0 input from stream 0:0 @ 00000182dba86180] Setting &#x27;pixel_aspect&#x27; to value &#x27;0/1&#x27;&#xA;[graph 0 input from stream 0:0 @ 00000182dba86180] Setting &#x27;frame_rate&#x27; to value &#x27;10/1&#x27;&#xA;[graph 0 input from stream 0:0 @ 00000182dba86180] w:1280 h:720 pixfmt:bgr24 tb:1/10 fr:10/1 sar:0/1&#xA;[format @ 00000182dba86540] Setting &#x27;pix_fmts&#x27; to value &#x27;yuv420p&#x27;&#xA;[auto_scale_0 @ 00000182dba869c0] w:iw h:ih flags:&#x27;&#x27; interl:0&#xA;[format @ 00000182dba86540] auto-inserting filter &#x27;auto_scale_0&#x27; between the filter &#x27;Parsed_null_0&#x27; and the filter &#x27;format&#x27;&#xA;[AVFilterGraph @ 00000182dba49040] query_formats: 4 queried, 2 merged, 1 already done, 0 delayed&#xA;[auto_scale_0 @ 00000182dba869c0] w:1280 h:720 fmt:bgr24 sar:0/1 -> w:1280 h:720 fmt:yuv420p sar:0/1 flags:0x00000004&#xA;[libx264 @ 00000182dba76080] using mv_range_thread = 24&#xA;[libx264 @ 00000182dba76080] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2 AVX512&#xA;[libx264 @ 00000182dba76080] profile High, level 3.1, 4:2:0, 8-bit&#xA;[libx264 @ 00000182dba76080] 264 - core 164 r3107 a8b68eb - H.264/MPEG-4 AVC codec - Copyleft 2003-2023 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=22 lookahead_threads=3 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=10 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00&#xA;[tcp @ 00000182dc5ce480] No default whitelist set&#xA;[tcp @ 00000182dc5ce480] Original list of addresses:&#xA;[tcp @ 00000182dc5ce480] Address 192.168.0.2 port 8554&#xA;[tcp @ 00000182dc5ce480] Interleaved list of addresses:&#xA;[tcp @ 00000182dc5ce480] Address 192.168.0.2 port 8554&#xA;[tcp @ 00000182dc5ce480] Starting connection attempt to 192.168.0.2 port 8554&#xA;[tcp @ 00000182dc5ce480] Successfully connected to 192.168.0.2 port 8554&#xA;[rtsp @ 00000182dba72d00] SDP:&#xA;v=0&#xA;&#xA;o=- 0 0 IN IP4 127.0.0.1&#xA;&#xA;s=No Name&#xA;&#xA;c=IN IP4 192.168.0.2&#xA;&#xA;t=0 0&#xA;&#xA;a=tool:libavformat 60.10.100&#xA;&#xA;m=video 0 RTP/AVP 96&#xA;&#xA;a=rtpmap:96 H264/90000&#xA;&#xA;a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAH6zZQFAFuhAAAAMAEAAAAwFA8YMZYA==,aOvjyyLA; profile-level-id=64001F&#xA;&#xA;a=control:streamid=0&#xA;&#xA;&#xA;[rtp @ 00000182dc5cd040] No default whitelist set&#xA;[udp @ 00000182dba4b140] No default whitelist set&#xA;[udp @ 00000182dba4b140] end receive buffer size reported is 393216&#xA;[udp @ 00000182dc9bf040] No default whitelist set&#xA;[udp @ 00000182dc9bf040] end receive buffer size reported is 393216&#xA;Output #0, rtsp, to &#x27;rtsp://192.168.0.2:8554/mystream&#x27;:&#xA;  Metadata:&#xA;    encoder         : Lavf60.10.100&#xA;  Stream #0:0, 0, 1/90000: Video: h264, yuv420p(tv, progressive), 1280x720, q=2-31, 10 fps, 90k tbn&#xA;    Metadata:&#xA;      encoder         : Lavc60.23.100 libx264&#xA;    Side data:&#xA;      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A&#xA;frame=    0 fps=0.0 q=0.0 size=       0kB time=N/A bitrate=N/A speed=N/A    &#xA;[rawvideo @ 00000182dba72700] PACKET SIZE: 2764800, STRIDE: 3840&#xA;[rawvideo @ 00000182dba72700] PACKET SIZE: 2764800, STRIDE: 3840&#xA;frame=    0 fps=0.0 q=0.0 size=       0kB time=N/A bitrate=N/A speed=N/A    &#xA;[rawvideo @ 00000182dba72700] PACKET SIZE: 2764800, STRIDE: 3840&#xA;[rawvideo @ 00000182dba72700] PACKET SIZE: 2764800, STRIDE: 3840&#xA;frame=    0 fps=0.0 q=0.0 size=       0kB time=N/A bitrate=N/A speed=N/A    &#xA;[rawvideo @ 00000182dba72700] PACKET SIZE: 2764800, STRIDE: 3840   &#xA;[rawvideo @ 00000182dba72700] PACKET SIZE: 2764800, STRIDE: 3840&#xA;[libx264 @ 00000182dba76080] frame=   0 QP=21.34 NAL=3 Slice:I Poc:0   I:3600 P:0    SKIP:0    size=135901 bytes&#xA;frame=    0 fps=0.0 q=25.0 size=       0kB time=-00:00:00.20 bitrate=  -0.0kbits/s speed=N/A    &#xA;[vost#0:0/libx264 @ 00000182dba75cc0] Error submitting a packet to the muxer: Broken pipe&#xA;[out#0/rtsp @ 00000182dba72c00] Error muxing a packet&#xA;[out#0/rtsp @ 00000182dba72c00] Terminating muxer thread&#xA;[rawvideo @ 00000182dba72700] PACKET SIZE: 2764800, STRIDE: 3840&#xA;[libx264 @ 00000182dba76080] frame=   1 QP=18.29 NAL=2 Slice:P Poc:2   I:2662 P:866  SKIP:72   size=54835 bytes&#xA;frame=    1 fps=0.0 q=25.0 size=N/A time=-00:00:00.10 bitrate=N/A speed=N/A    &#xA;No more output streams to write to, finishing.&#xA;&#xA;Conversion failed!&#xA;&#xA;

    &#xA;

  • iOS 17’s Impact on Marketing : Navigating Privacy Changes

    22 septembre 2023, par Erin — Analytics Tips, Marketing

    In the ever-evolving landscape of digital marketing, staying up-to-date with the latest changes is paramount. One such significant change came on 18 September 2023, in the form of iOS 17, Apple’s latest operating system update. With iOS 17, Apple has introduced new privacy features that are set to have a profound impact on marketers and how they track and analyse user behaviour. 

    In this blog, we will explore what iOS 17 is, how it affects tracking, which tracking parameters are impacted, what remains unaffected, and most importantly, how marketers can future-proof their campaign tracking URLs.

    What is iOS 17 ?

    iOS 17 is the latest update to Apple’s mobile operating system, used on millions of iPhones worldwide. While iOS updates often bring new features and improvements, iOS 17 has made waves in the digital marketing community due to its emphasis on user privacy.

    How does iOS 17 affect tracking ?

    One of the key features of iOS 17 that concerns marketers is its impact on tracking. Apple’s new update aims to enhance user privacy by limiting the information that can be tracked and collected by third-party entities, particularly through query parameters in URLs. This means that certain tracking mechanisms that marketers have relied on for years are now rendered ineffective on iOS 17 devices.

    Campaign tracking URLs, also known as tracking parameters or UTM parameters, are special codes added to the end of URLs. They are used by marketers to track various aspects of a user’s interaction with a digital marketing campaign. These parameters provide valuable data, such as the source of traffic, the medium through which users arrived and specific campaign details.

    For example, with Matomo (mtm) tracking parameters, a campaign tracking URL might look like this :

    https://www.example.com/products/example_product?mtm_campaign=summer-sale

    Generated Campaign URL

    Understanding the impact of iOS 17 on campaign tracking URLs is essential for marketers who rely on this data to measure the effectiveness of their marketing campaigns.

    Which campaign tracking parameters are affected by iOS 17 ?

    Several tracking parameters commonly used by marketers will no longer work as expected on iOS 17. Some of these include :

    • Facebook (fbclid) : Employed for tracking Facebook advertising campaigns. 
    • Instagram (igshid) : Used to track user interactions with Instagram ads.
    • Google Ads (gclid) : Used to track Google Ads campaigns. 
    • Twitter (twclid) : Used to track user interactions with Twitter ads. 
    • Microsoft Ads (msclkid) : Employed for tracking Microsoft Ads campaigns. 
    • Mailchimp (mc_eid) : Used by Mailchimp for email campaign tracking. 

    These changes are significant, as they disrupt many of the common tracking methods that marketers rely on to measure the effectiveness of their campaigns.

    Which campaign tracking parameters are not affected by iOS 17 ?

    While many tracking parameters have been impacted, there are still some that remain unaffected on iOS 17. However, it’s important to note that the status of these parameters might change in the future as Apple continues to prioritise user privacy. Some of the tracking parameters that are still working as of now include :

    • Matomo (mtm) : Matomo campaign tracking parameters. 
    • Google Analytics (UTMs) : Google Analytics campaign tracking parameters.
    • Pinterest (epik) : Used for tracking Pinterest campaigns. 
    • Klaviyo (_kx) : Klaviyo for email marketing tracking. 
    • TikTok (tt-) : Used for tracking TikTok ad interactions. 
    • Hubspot (hsa) : Used for tracking Hubspot campaigns. 

    While these parameters offer some reprieve for marketers, it’s essential to keep a close eye on any potential changes in their functionality as Apple continues to roll out privacy-friendly features.

    How are Matomo users impacted ?

    Fortunately, Matomo, as a leading privacy-friendly web analytics solution, remains unaffected by the changes introduced by iOS 17. Specifically :

    For Matomo users who rely on mtm or UTMs

    If you’re using Matomo or GA tracking parameters, you can rest assured that iOS 17’s changes won’t affect your tracking capabilities in Matomo.

    Attention to gclids (Google Ads) and msclkid (Bing Ads)

    If you use Google Ads or Bing Ads tracking parameters with Matomo’s Advertising Conversion Export feature for tracking, iOS 17 presents a challenge. Your gclids and msclkids may not provide the same level of tracking accuracy on Apple mobile devices. This is a critical consideration, especially if your ad campaigns target mobile users.

    To stay informed about changes in the digital marketing landscape, including updates related to iOS 17, sign up for our newsletter where we regularly provide updates and insights on adapting your tracking and marketing strategies to ensure compliance and respect user privacy.

    How to future-proof your campaign tracking

    Given the impact of iOS 17 on tracking, it’s crucial for marketers to adapt and future-proof their campaign tracking strategies. Here are some steps you can take to mitigate the affects of iOS 17 on your marketing campaigns :

    Monitor platform updates

    Expect updates from advertising and analytics platforms in response to Apple’s privacy changes. These platforms are likely to develop alternative tracking methods or adapt existing ones to comply with iOS 17’s restrictions. Stay informed about these updates and incorporate them into your tracking strategy.

    Prioritise privacy-friendly tech stacks

    In the ever-evolving digital marketing landscape, it’s crucial to prioritise privacy-friendly tech stacks. Privacy-friendly tracking tools like Matomo are essential for maintaining trust and respecting user privacy.

    Matomo ensures the privacy of your users and analytics data. When using Matomo, you retain control of your data ; nobody else does. This commitment to user privacy aligns with the changing digital marketing landscape, where privacy is taking centre stage.

    Transition from affected campaign tracking parameters

    If you’ve been using tools like Mailchimp, whose campaign tracking URLs have been affected by iOS 17, consider transitioning to the campaign tracking URL parameters of your analytics solution. Whether you choose Matomo or Google Analytics, these solutions can help you understand how your email marketing campaigns are performing.

    Focus on data privacy compliance

    Embrace data privacy compliance practices. As privacy regulations evolve, it’s essential to prioritise transparency in data collection. Ensure that your tracking methods align with privacy standards to maintain trust with your audience.

    Regularly review and adapt

    The digital marketing landscape is dynamic, and iOS 17 is just one example of how quickly things can change. Regularly review your tracking methods and adapt to new developments in the industry. Staying agile and informed is key to long-term success.

    Marketers’ path forward

    iOS 17 has reshaped mobile user privacy, challenging marketers to adapt. While some tracking parameters are affected, savvy marketers can still thrive by embracing unique tracking solutions, staying informed about platform updates, and prioritising data privacy. 

    Explore Matomo for privacy-friendly analytics and navigate this evolving landscape successfully with our 21-day free trial – no credit card required.