Media playback is actually happening in media server process, to enable the
communication between your client process and media server via binder
driver, you should add below code in your main function:
sp<ProcessState> proc = ProcessState::self();
proc->startThreadPool();
Otherwise it can't receive prepared message from media server.
Below is a simple implemetation I wrote some time before:
=================================================
int main(int argc, char** argv)
{
sp<ProcessState> proc = ProcessState::self();
proc->startThreadPool();
MediaPlayer mediaplayer;
if(argc > 1)
{
LOGI("set datasource: %s", argv[1]);
mediaplayer.setDataSource(argv[1]);
}
else
{
LOGI("set default datasource: /data/test.mp4");
mediaplayer.setDataSource("/data/test.mp4");
}
sp<SurfaceComposerClient> client = new SurfaceComposerClient;
int pid = getpid();
sp<Surface> surface(client->createSurface(pid, 0, 176, 144,
PIXEL_FORMAT_OPAQUE,
ISurfaceComposer::eFXSurfaceNormal|ISurfaceComposer::ePushBuffers));
mediaplayer.setVideoSurface(surface);
mediaplayer.prepare();
mediaplayer.start();
for(int i=0; i<10; i++)
{
sleep(1);
LOGI("playing, %d seconds\n", i);
}
mediaplayer.stop();
LOGI("quiting...");
}
On Thu, Feb 12, 2009 at 12:56 PM, andy_fw <[email protected]> wrote:
>
> I wrote a very simple console C++ application that attempts to mimic
> part of the functionality of android_media_MediaPlayer JNI layer. I
> have added it to the toolbox by modifying the toolbox Android.mk file.
> The idea is to have a command line utility which supports a
> rudimentary media player. The appl uses PV framework for the playback
> engine (just as JNI does). It's based on Android 1.0.
>
> The following C++ code snippet shows that the MediaPlayer class is
> used to create an instance, setDataSource, prepare, and start based on
> a URL (i.e. local file). I've trimmed it to what I think is the
> minimum to achieve my desired result of playing a media file for a
> short period of time. I can run the Android APIDemo appl to playback a
> local audio file and the log traces show that these methods are all
> that's needed to hear a clip play (ignore cleanup and such for now -
> I'm only trying to hear the clip play). In fact, I have compared the
> log traces of both the console appl and the java appl (which always
> successfully plays the clip), and they are very nearly the same. The
> key difference is during the notify callbacks when executing the
> console appl. The remote()->transact() method doesn't appear to behave
> the same. The onTransact() method is not invoked in the console
> environment. Please see the log snippet of the java appl included
> below. I indicated the primary differences between the java and
> console logs with "<===missing" tokens.
>
> Do the framework experts have any insight as to what's wrong/missing?
> Am I incorrect to think that a console appl can use the PV framework
> in such a simple form?
>
> playmedia.cpp:
> #include <media/mediaplayer.h>
>
> using namespace android;
>
> static int do_it(const char * url)
> {
> MediaPlayer * mp = new MediaPlayer();
>
> mp->setDataSource(url);
> mp->prepare();
> mp->start();
>
> sleep(30);
>
> return 0;
> }
>
> extern "C" int playmedia_main(int argc, char *argv[])
> {
> if(argc > 1) return do_it(argv[1]);
>
> return do_it("/data/test_aud.mp3");
> }
>
> Logcat from java API Demo.media_Audio (I've added some extra LOGI
> entries into the code):
>
> I/MediaPlayer-JNI( 170): native_setup <===missing from console (not
> an issue - included for completeness)
> I/MediaPlayer( 170): constructor
> I/MediaPlayer( 170): setDataSource(/data/test_aud.mp3)
> I/MediaPlayer( 170): creating service w/url=/data/test_aud.mp3
> I/MediaPlayerService( 35): Client(1) constructor pid=170
> I/MediaPlayerService( 35): Create new client(1) from pid 170, url=/
> data/test_aud.mp3, connId=1
> I/MediaPlayerService( 35): Client::setDataSource(/data/test_aud.mp3)
> I/MediaPlayerService( 35): create PVPlayer
> I/PlayerDriver( 35): constructor
> I/PlayerDriver( 35): start player thread
> I/MediaPlayerService( 35): Setting Notify callback 0xe200
> I/MediaPlayerService( 35): setDataSource
> I/MediaPlayerService( 35): create(url) out
> I/MediaPlayer-JNI( 170): Calling mp->prepare
> I/MediaPlayer( 170): prepare
> I/MediaPlayer( 170): prepareAsync_l
> I/MediaPlayerService( 35): prepareAsync(1)
> I/MediaPlayerService( 35): prepareAsync out
> I/MediaPlayer( 170): prepare wait for done
> I/PlayerDriver( 35): handlePrepare
> I/PVPlayerEng( 35): PVPlayerEngine::DoPrepare() In
> I/PVPlayerEng( 35): PVPlayerEngine::DoPrepare() Out
> E/QC_OMX_CORE( 35): Dynamically Loading the library : libmm-adec-
> omxmp3.so.1.0.0
> E/QC_OMX_CORE( 35): Dynamically Loading the library : libmm-adec-
> omxmp3.so.1.0.0
> I/PlayerDriver( 35): PLAYER_PREPARE complete
> mDownloadContextData=0x0, mDataReadyReceived=0
> I/MediaPlayerService( 35): (1) notify (0xe200, 1, 0, 0)
> I/IMediaPlayerClient( 35): Client::notify()
> I/IPCThreadState( 35): transact start 2
> I/IPCThreadState( 170): >>>> TRANSACT from pid 0 uid 1013
> I/IMediaPlayerClient( 170): onTransact
> <==========missing from console appl start
> I/MediaPlayer( 170): notify() message received msg=1, ext1=0, ext2=0
> I/MediaPlayer( 170): prepared
> I/MediaPlayer( 170): signal application thread
> I/MediaPlayer( 170): prepare complete - status=0
> <===========missing end
> I/MediaPlayerService( 35): done calling client->notify callback
>
> >
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"android-framework" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-framework?hl=en
-~----------~----~----~----~------~----~------~--~---