小编Krz*_*nsy的帖子

SurfaceTexture.getTimestamp() 在播放过程中返回 0

最近我在 Android 5.0.2 (API 21) 上遇到了一个奇怪的问题。我的应用程序使用 SurfaceTexture 来显示视频。播放机制主要基于google/grafika 的 CameraCaptureAvtivity,但视频源是解码 .mp4 电影文件而不是相机。该应用程序运行良好,直到我在带有 Android 5.0.2 的 Galaxy S6 上运行它(在那之前我成功使用了 4.4.2 和 4.4.4 的设备)。问题是,每次我尝试从 SurfaceTexture 接收时间戳时getTimestamp(),该方法都会返回 0,但播放没问题。在时间戳正确之前我提到的其他设备上。
有人可以告诉我这是否可能是Android错误?有什么办法可以解决吗?

java android grafika android-mediacodec

5
推荐指数
0
解决办法
852
查看次数

Android精确搜索视频

我正在努力使用MediaExtractor进行精确搜索seekTo().虽然我可以毫无问题地寻求同步帧,但我想寻求具体的时间.这个问题让我想到了如何做到这一点,但我不确定它们是否有效.基本上,我必须寻找最接近的前一个同步帧,然后寻求advance()提取器,直到达到目标时间.该过程中的每个帧将被馈送到解码器,即第一个I帧和其余的P帧.这是相关的代码段(基于google/grafika的MoviePlayer):

extractor.seekTo((long) seekTarget[threadNr], MediaExtractor.SEEK_TO_PREVIOUS_SYNC);

...

while (extractor.getSampleTime() < (long) seekTarget[threadNr]) {
    Log.d(TAG, "Thread " + threadNr + " advanced to timestamp " + extractor.getSampleTime());

    int inputBufIndex = decoder.dequeueInputBuffer(TIMEOUT_USEC);
    if (inputBufIndex >= 0) {
        ByteBuffer inBufer = decoderInputBuffers[inputBufIndex];
        int chunkSize = extractor.readSampleData(inBufer, 0);

        if (chunkSize < 0) {
            // End of stream -- send empty frame with EOS flag set.
            decoder.queueInputBuffer(inputBufIndex, 0, 0, 0L,
                    MediaCodec.BUFFER_FLAG_END_OF_STREAM);
            inputDone = true;
            if (VERBOSE) Log.d(TAG, "sent input …
Run Code Online (Sandbox Code Playgroud)

android seek mediacodec mediaextractor grafika

5
推荐指数
1
解决办法
1359
查看次数