Я использую медиа-код c для декодирования видео в формате .mp4. Он хорошо работает на эмуляторе и моем android телефоне.
, но когда я пытаюсь перенести его на ht c vive focus plus (Android 7.1), кажется, что AMediaCodec_dequeueInputBuffer () всегда возвращает действительный индекс буфера от 0 до 3. У меня закрыт выходной поток, поэтому он должен быть заблокирован, когда я вызываю dequeueinputbuffer несколько раз. Но регистрируется следующим образом:
2020-01-08 17:28:41.601 25109-25177/Queue timestamp 111 and buffer index is 2 flags is 1 buffer size is 105222
2020-01-08 17:28:41.708 25109-25177/Queue timestamp 40000 and buffer index is 3 flags is 0 buffer size is 1554
2020-01-08 17:28:41.813 25109-25177/Queue timestamp 80000 and buffer index is 0 flags is 0 buffer size is 2153
2020-01-08 17:28:41.918 25109-25177/Queue timestamp 120000 and buffer index is 1 flags is 0 buffer size is 2208
2020-01-08 17:28:42.020 25109-25177/Queue timestamp 160000 and buffer index is 2 flags is 0 buffer size is 2523
2020-01-08 17:28:42.123 25109-25177/Queue timestamp 200000 and buffer index is 3 flags is 0 buffer size is 3088
2020-01-08 17:28:42.227 25109-25177/Queue timestamp 240000 and buffer index is 0 flags is 0 buffer size is 4188
2020-01-08 17:28:42.335 25109-25177/Queue timestamp 280000 and buffer index is 1 flags is 0 buffer size is 365
2020-01-08 17:28:42.439 25109-25177/Queue timestamp 320000 and buffer index is 2 flags is 0 buffer size is 3571
2020-01-08 17:28:42.543 25109-25177/Queue timestamp 360000 and buffer index is 3 flags is 0 buffer size is 3966
2020-01-08 17:28:42.646 25109-25177/Queue timestamp 400000 and buffer index is 0 flags is 0 buffer size is 4081
2020-01-08 17:28:42.749 25109-25177/Queue timestamp 440000 and buffer index is 1 flags is 0 buffer size is 4631
2020-01-08 17:28:42.853 25109-25177/Queue timestamp 480000 and buffer index is 2 flags is 0 buffer size is 4996
2020-01-08 17:28:42.956 25109-25177/Queue timestamp 520000 and buffer index is 3 flags is 0 buffer size is 5909
2020-01-08 17:28:43.059 25109-25177/Queue timestamp 560000 and buffer index is 0 flags is 0 buffer size is 5995
2020-01-08 17:28:43.163 25109-25177/Queue timestamp 600000 and buffer index is 1 flags is 0 buffer size is 6419
2020-01-08 17:28:43.266 25109-25177/Queue timestamp 640000 and buffer index is 2 flags is 0 buffer size is 6212
2020-01-08 17:28:43.370 25109-25177/Queue timestamp 680000 and buffer index is 3 flags is 0 buffer size is 6762
2020-01-08 17:28:43.473 25109-25177/Queue timestamp 720000 and buffer index is 0 flags is 0 buffer size is 6291
2020-01-08 17:28:43.576 25109-25177/Queue timestamp 760000 and buffer index is 1 flags is 0 buffer size is 6902
2020-01-08 17:28:43.684 25109-25177/Queue timestamp 800000 and buffer index is 2 flags is 0 buffer size is 6916
2020-01-08 17:28:43.789 25109-25177/Queue timestamp 840000 and buffer index is 3 flags is 0 buffer size is 7469
2020-01-08 17:28:43.893 25109-25177/Queue timestamp 880000 and buffer index is 0 flags is 0 buffer size is 7152
2020-01-08 17:28:43.998 25109-25177/Queue timestamp 920000 and buffer index is 1 flags is 0 buffer size is 7607
2020-01-08 17:28:44.101 25109-25177/Queue timestamp 960000 and buffer index is 2 flags is 0 buffer size is 7663
2020-01-08 17:28:44.205 25109-25177/Queue timestamp 1000000 and buffer index is 3 flags is 0 buffer size is 7637
2020-01-08 17:28:44.308 25109-25177/Queue timestamp 1040000 and buffer index is 0 flags is 0 buffer size is 7241
2020-01-08 17:28:44.413 25109-25177/Queue timestamp 1080000 and buffer index is 1 flags is 0 buffer size is 7520
В результате, если я включаю выходной поток, я могу получить только часть выходных кадров (1 кадр на каждые 6). Очевидно, это из-за покрытия входного буфера. Также записывается следующее:
2020-01-08 17:13:22.810 25109-25179/release output buffer, presentTime=111
2020-01-08 17:13:23.389 25109-25179/release output buffer, presentTime=240000
2020-01-08 17:13:24.011 25109-25179/release output buffer, presentTime=480000
2020-01-08 17:13:24.636 25109-25179/release output buffer, presentTime=720000
2020-01-08 17:13:25.262 25109-25179/release output buffer, presentTime=960000
2020-01-08 17:13:25.891 25109-25179/release output buffer, presentTime=1200000
2020-01-08 17:13:26.513 25109-25179/release output buffer, presentTime=1440000
2020-01-08 17:13:27.135 25109-25179/release output buffer, presentTime=1680000
2020-01-08 17:13:27.764 25109-25179/release output buffer, presentTime=1920000
2020-01-08 17:13:28.383 25109-25179/release output buffer, presentTime=2160000
2020-01-08 17:13:29.012 25109-25179/release output buffer, presentTime=2400000
код ввода:
mediaCodec = AMediaCodec_createDecoderByType(mime);
AMediaCodec_configure(mediaCodec, format, nullptr, nullptr, 0);
AMediaCodec_start(mediaCodec);
while (!shutDown) {
const int trackIndex = AMediaExtractor_getSampleTrackIndex(theExtractor);
if (trackIndex == -1) {
LOG("track input EOS");
AMediaExtractor_seekTo(theExtractor, 0, AMEDIAEXTRACTOR_SEEK_PREVIOUS_SYNC);
}
//input buffer
ExtractedBuffer eb;
ssize_t sampleSize = AMediaExtractor_readSampleData(theExtractor, maxExtractorBuffer.data(),
maxExtractorBuffer.size());
if (sampleSize < 0) {
LOG("Read sample data failed ,the sample size is <0");
shutDown = true;
break;
}
eb.PresentationTimeUs = std::max(111, (int) AMediaExtractor_getSampleTime(theExtractor));
eb.Flags = AMediaExtractor_getSampleFlags(theExtractor);
eb.Buffer.resize(sampleSize);
memmove(eb.Buffer.data(), maxExtractorBuffer.data(), sampleSize);
AMediaExtractor_advance(theExtractor);
if (trackIndex == audioTrack) {
continue;
}
if (trackIndex == videoTrack) {
//now we get the sample data and can push into media codec
while (!shutDown) {
const ssize_t bufidx = AMediaCodec_dequeueInputBuffer(mediaCodec, -1);
if (bufidx < 0) {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
continue;
}
size_t bufsize;
uint8_t *buf = AMediaCodec_getInputBuffer(mediaCodec, bufidx, &bufsize);
size_t copy = std::min(bufsize, eb.Buffer.size());
memcpy(buf, eb.Buffer.data(), copy);
AMediaCodec_queueInputBuffer(mediaCodec, bufidx, 0, copy, eb.PresentationTimeUs,
eb.Flags);
LOG("Queue timestamp %lli and buffer index is %d flags is %d buffer size is %d", eb.PresentationTimeUs,bufidx,eb.Flags,copy);
break;
}
}
}
Так что, если что-то, что я не заметил, может привести к этому? Это беспокоило меня в течение недели. Если кто-нибудь может сказать мне, что это что-то связано с медиа-кодом c или просто ht c vive? Спасибо!