Android:如何将MediaMuxer与videomp4v-es一起使用,而不是videoavc?

Android:如何将MediaMuxer与videomp4v-es一起使用,而不是videoavc?,第1张

概述我希望能够在某些设备上使用mp4v-es而不是avc.编码器可以使用avc正常运行,但是当我将其替换为mp4v-es时,复用器报告:E/MPEG4Writer(12517):Missingcodecspecificdata如MediaMuxererror“Failedtostopthemuxer”,则无法播放视频.区别在于,我向复用器添加了正确的轨道/

我希望能够在某些设备上使用mp4v-es而不是avc.编码器可以使用avc正常运行,但是当我将其替换为mp4v-es时,复用器报告:

E/MPEG4Writer(12517): Missing codec specific data

如MediaMuxer error “Failed to stop the muxer”,则无法播放视频.区别在于,我向复用器添加了正确的轨道/格式,而没有收到任何错误:

...else if (encoderStatus == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {           MediaFormat newFormat = encoder.getoutputFormat();           mTrackIndex[encID] = mmuxer.addTrack(newFormat);

与avc相比,处理mp4v-es有什么区别吗?一提,我只是跳过了“ bufferInfo.flags& MediaCodec.BUFFER_FLAG_CODEC_CONfig”,因为对于avc来说它是不需要的.谢谢.

解决方法:

正如Ganesh指出的那样,不幸的是,如果不修改平台源代码,这似乎是不可能的.

可以将编解码器特定的数据传递到内部MPEG4Writer类的方法有两种,但实际上,这两种方法都无需修改就可以正常工作.

正如Ganesh所发现的那样,将MediaFormat密钥重新映射为内部格式的逻辑似乎缺少对除H264以外的任何其他视频编解码器的编解码器特定数据的处理.解决此问题的经过测试的修改如下:

diff --git a/media/libstagefright/Utils.cpp b/media/libstagefright/Utils.cppindex 25afc5b..304fe59 100644--- a/media/libstagefright/Utils.cpp+++ b/media/libstagefright/Utils.cpp@@ -549,14 +549,14 @@ voID convertMessagetoMetaData(const sp<AMessage> &msg, sp<MetaData> &Meta) {     // reassemble the csd data into its original form     sp<ABuffer> csd0;     if (msg->findBuffer("csd-0", &csd0)) {-        if (mime.startsWith("vIDeo/")) { // do we need to be stricter than this?+        if (mime == MEDIA_MIMETYPE_VIDEO_AVC) {             sp<ABuffer> csd1;             if (msg->findBuffer("csd-1", &csd1)) {                 char avcc[1024]; // that oughta be enough, right?                 size_t outsize = reassembleAVCC(csd0, csd1, avcc);                 Meta->setData(kKeyAVCC, kKeyAVCC, avcc, outsize);             }-        } else if (mime.startsWith("audio/")) {+        } else if (mime == MEDIA_MIMETYPE_AUdio_AAC || mime == MEDIA_MIMETYPE_VIDEO_MPEG4) {             int csd0size = csd0->size();             char esds[csd0size + 31];             reassembleESDS(csd0, esds);

其次,您可以在原理上将相同的缓冲区(设置了MediaCodec.BUFFER_FLAG_CODEC_CONfig标志)传递给Mediamuxer.writeSampleData,而不是像MediaFormat中那样将编解码器特定的数据作为csd-0传递.该方法目前不起作用,因为该方法根本不检查编解码器配置标志-可以通过以下修改来解决:

diff --git a/media/libstagefright/Mediamuxer.cpp b/media/libstagefright/Mediamuxer.cppindex c7c6f34..d612e01 100644--- a/media/libstagefright/Mediamuxer.cpp+++ b/media/libstagefright/Mediamuxer.cpp@@ -193,6 +193,9 @@ status_t Mediamuxer::writeSampleData(const sp<ABuffer> &buffer, size_t trackInde     if (flags & MediaCodec::BUFFER_FLAG_SYNCFRAME) {         sampleMetaData->setInt32(kKeyIsSyncFrame, true);     }+    if (flags & MediaCodec::BUFFER_FLAG_CODECCONfig) {+        sampleMetaData->setInt32(kKeyIsCodecConfig, true);+    }     sp<MediaAdapter> currentTrack = mTrackList[trackIndex];     // This pushBuffer will wait until the mediaBuffer is consumed.

据我所知,在使用公共API的同时,如果不修改平台源代码,就无法使用Mediamuxer来复用MPEG4视频.鉴于上述Utils.cpp中的问题,您无法混合任何需要编解码器特定数据的视频格式,但H264除外.如果可以选择VP8,则可以将其混合到webm文件中(与vorbis音频一起使用),但是VP8的硬件编码器可能比MPEG4的硬件编码器少得多.

总结

以上是内存溢出为你收集整理的Android:如何将MediaMuxer与video / mp4v-es一起使用,而不是video / avc?全部内容,希望文章能够帮你解决Android:如何将MediaMuxer与video / mp4v-es一起使用,而不是video / avc?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1089213.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存