如何使用FFmpeg/libavcodec/libstagefright。

15

我有一个关于如何使用ffmpeg/libavcodec/libstagfright.cpp的问题:当我使用ffmpeg将codec->id设置为CODEC_ID_H264, codec->name设置为libstagefright_h264时,我尝试使用avcodec_open2(st->codec, codec)来打开AVCodec ff_libstagefright_h264_decoder

但是当Stagefright_init->OMXCodec::Create->configureCodec->initOutputFormat(meta)时,进程就会崩溃!这真是个糟糕的情况!

我知道meta是元数据,它的数据来自codec->extradata,在这里,它表示sps和pps,我的理解是否正确?

如何在ffmpeg中成功使用libstagefright?有人能给我一个例子吗?


你可能想看一下这个项目:http://gitorious.org/~olvaffe/ffmpeg/ffmpeg-android,特别是http://gitorious.org/~olvaffe/ffmpeg/ffmpeg-android/trees/android/doc。 - Pedro Lobito
看一下这个链接,可能会有帮助:<a href="http://code.metager.de/source/xref/ffmpeg/libavcodec/libstagefright.cpp">http://code.metager.de/source/xref/ffmpeg/libavcodec/libstagefright.cpp</a> - Ciasto piekarz
2个回答

1

我正在为我的Android上的ffmpeg库提供stagefright。我对来自ffmpeg/libav的原始libstagefright.cpp进行了一些更改,但它仍然不稳定。在稳定后,我将为ffmpeg/libav团队创建拉取请求。您可以在我的项目中查看:"hwaccel"分支。

它位于AndroidFFmpeg/FFmpegLibrary/jni/ffstagefright.cpp目录下。

要使用此库,您需要调用标准的ffmpeg方法并打开libstagefright_h264编解码器,而不是标准的h264编解码器:

AVCodec *codec = avcodec_find_decoder_by_name("libstagefright_h264");

1

它在ICS4.0.3、Moto XT910、FFmpeg 0.7上工作正常。

我使用extradata来存储MediaFileName,然后从代码中获取元数据:

DataSource::RegisterDefaultSniffers();
sp<MediaSource> source ;
source = createSource((char*)MeidaFileName);
if(source==NULL){
    return -1 ;
}
meta = source->getFormat();
if(!meta->findData(kKeyAVCC, &type, &data, &data_size))
{
    return -1 ;
}
meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC);

然后你可以使用OMX::create(在Android 2.3和ICS中有一些差异)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接