You can't go guessing arguments. Look at the headers. That function takes a dispatch queue (which you forgot to call the function to get the queue) and an ObjCBlock, which takes ine argument, a dictionary that has the info you want.
Here is a simple bit to get the dictionary. note the values are usually objc types, so you may need to convert to more useful values. Explore the now_playing_dict.keys to see what you have accessible.
from objc_util import *
from ctypes import *
import ctypes
MRMediaRemoteGetNowPlayingInfo = c.MRMediaRemoteGetNowPlayingInfo
MRMediaRemoteGetNowPlayingInfo.restype = None
MRMediaRemoteGetNowPlayingInfo.argtypes = [c_void_p, ObjCBlock]
now_playing_dict={}
from threading import Event
e=Event()
def info_cb(_blk,info):
now_playing_dict.clear()
if info:
infodict=ObjCInstance(info)
for k in infodict.allKeys():
now_playing_dict[str(k)]= infodict[k]
e.set()
cb=ObjCBlock(info_cb,argtypes=[c_void_p,c_void_p], restype=None)
q=ObjCInstance(c.dispatch_get_current_queue())
MRMediaRemoteGetNowPlayingInfo(q, cb)
#since the callback happens in another thread, we wait for the event to be set
e.wait()
print(now_playing_dict['kMRMediaRemoteNowPlayingInfoTitle'])