Ganesh が指摘したように、残念ながら現在のところ、プラットフォーム ソースを変更しない限り、これは不可能のようです。
コーデック固有のデータを内部の MPEG4Writer クラスに渡すには、実際には 2 つの方法がありますが、どちらも実際には変更なしでは機能しません。
Ganesh が発見したように、MediaFormat キーを内部フォーマットに再マッピングするロジックには、H264 以外のビデオ コーデックのコーデック固有のデータの処理が欠けているようです。この問題を修正するテスト済みの変更は次のとおりです。
diff --git a/media/libstagefright/Utils.cpp b/media/libstagefright/Utils.cpp
index 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);
csd-0
第 2 に、 MediaFormat のようにコーデック固有のデータを渡す代わりに、原則として同じバッファを (MediaCodec.BUFFER_FLAG_CODEC_CONFIG
フラグを設定して) に渡すことができますMediaMuxer.writeSampleData
。このメソッドはコーデック設定フラグをまったくチェックしないため、このアプローチは現在機能しません。次の変更で修正できます。
diff --git a/media/libstagefright/MediaMuxer.cpp b/media/libstagefright/MediaMuxer.cpp
index 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 のハードウェア エンコーダーよりも一般的ではありません。