标签: mediacodec

Android MediaCodec API视频播放速度过快

我目前正在使用Android Jelly Bean MediaCodec API来开发一个简单的视频播放器.

我在单独的线程中提取曲目,播放音频和视频.问题是视频播放总是播放太快.

哪里可以隐藏问题?
音频和视频的处理方式几乎相同,但音频通过AudioTrack播放,视频呈现在表面.

android surfaceview android-mediaplayer android-4.2-jelly-bean mediacodec

6
推荐指数
1
解决办法
2086
查看次数

将MediaCodec解码视频帧绘制到屏幕的最快方法?

我正在寻找从MediaCodec解码器接收图像帧并将其绘制到Android设备屏幕的最快方法.重要的限制和解释是:

  1. 无法使用MediaPlayer.不允许使用中间应用.

  2. 必须尽快将MediaCodec解码器的输出帧绘制到屏幕上(最小化延迟).

  3. 可用的解码器输出格式如下:
    ColorFormat [0] 0x00000013 COLOR_FormatYUV420Planar
    ColorFormat [1] 0x00000015 COLOR_FormatYUV420SemiPlanar
    ColorFormat [2] 0x7F000001 OMX_SEC_COLOR_FormatNV12TPhysicalAddress
    ColorFormat [3] 0x7FC00002 OMX_SEC_COLOR_FormatNV12Tiled

  4. 视频分辨率以及每个输出帧的分辨率为960x720.

  5. 目标平台是Galaxy Note II,该方法可以特定于该平台(例如,利用可用的硬件功能).这不需要在其他平台上工作或者是通用解决方案.

一种不到66毫秒的方法会很好.不到33毫秒会很棒.我目前的方法需要80-90毫秒,这很糟糕.(我不打算去描述它,因为我不想在任何特定的方向上扭曲答案.)

android yuv decoder surfaceview mediacodec

6
推荐指数
1
解决办法
4525
查看次数

暂停/恢复MediaCodec

我正在尝试为我的应用程序实现暂停/恢复功能,该功能使用MediaCodec记录显示捕获.我已经尝试过mEncoder.stop()然后调用mEncoder.start()而不调用mEncoder.release()但是没有用.再次调用mEncoder.start()时,我得到IllegalStateException.现在我实施了一个解决方法,我在捕获完成后合并视频的和平,但合并需要很长时间.任何人都可以帮助我吗?也许有人已经实现了这个东西?

Initialazation:

    MediaCodec mEncoder;
    mEncoder = MediaCodec.createEncoderByType(Preferences.MIME_TYPE);
    mEncoder.configure(mFormat, null, null,
            MediaCodec.CONFIGURE_FLAG_ENCODE);
    mInputSurface = new InputSurface(mEncoder.createInputSurface(),
            mSavedEglContext);
    mEncoder.start();
    try {
        String fileId = String.valueOf(System.currentTimeMillis());
        mMuxer = new MediaMuxer(dir.getPath() + "/Video"
                + fileId + ".mp4",
                MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
        videoParts.add(fileId);
    } catch (IOException ioe) {
        throw new RuntimeException("MediaMuxer creation failed", ioe);
    }
    isRecording = true;
Run Code Online (Sandbox Code Playgroud)

暂停:

    public void pauseRecordPressed() {
    if (isRecording){
        isRecording = false;
        drainEncoder(false);

        if (mEncoder != null) {
            mEncoder.stop();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

取消暂停:

    public void resumeRecordPressed() {
    mEncoder.start();
    isRecording = true;
} …
Run Code Online (Sandbox Code Playgroud)

android video-capture mediacodec

6
推荐指数
1
解决办法
4438
查看次数

MediaCodec KEY_FRAME_RATE似乎被忽略了

我正在尝试修改android 4.4中的screenrecord源并降低捕获的帧速率,但无论我放入什么值:

format->setFloat("frame-rate", 5);
Run Code Online (Sandbox Code Playgroud)

结果始终相同(帧速率非常高)

编码器是否忽略此属性?如何控制帧速率?

android android-ndk android-source mediacodec

6
推荐指数
1
解决办法
5820
查看次数

在Android上解码h264 ByteStream总是从dequeueOutputBuffer()获取INFO_TRY_AGAIN_LATER

尝试使用媒体编解码器对编码数据克数据包进行解码,但在dequeueOutputBuffer()中始终获得-1.

请帮帮我 - 我做错了什么?我试图在没有成功的情况下面对这个问题.

private void decodeVideo(){

    new Thread(new Runnable() {

        @Override
        public void run() {
            int n = 0;
            MediaFormat mediaFormat = new MediaFormat();
            mediaFormat.setString(MediaFormat.KEY_MIME, "video/avc");
            mediaFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 100000);
            mediaFormat.setInteger(MediaFormat.KEY_WIDTH,
                    surfaceView.getWidth());
            mediaFormat.setInteger(MediaFormat.KEY_HEIGHT,
                    surfaceView.getHeight());
            mediaFormat.setInteger(
                    MediaFormat.KEY_PUSH_BLANK_BUFFERS_ON_STOP, 1);
            mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,
                    MediaCodecInfo.CodecCapabilities.COLOR_FormatL2);// TODO

            byte[] csd_info = { 0, 0, 0, 1, 103, 100, 0, 40, -84, 52, -59,
                    1, -32, 17, 31, 120, 11, 80, 16, 16, 31, 0, 0, 3, 3,
                    -23, 0, 0, -22, 96, -108, 0, 0, 0, 1, 104, -18, …
Run Code Online (Sandbox Code Playgroud)

android decode h.264 mediacodec

6
推荐指数
0
解决办法
1294
查看次数

如何使用MediaCodec和MediaMuxer录制视频和音频

我可以在MediaCodec和MediaMuxer的帮助下录制(编码)视频.接下来,我需要借助MediaCodec和MediaMuxer在视频上处理音频部分和多路复用音频.

我面临两个问题:

  1. 如何使用MediaCodec对音频进行编码.我需要在单独的线程中编码音频和视频吗?

  2. 如何将音频和视频数据传递给MediaMuxer(因为writeSampleData()方法一次只接收一种类型的数据)?

我提到了MediaMuxerTest,但它使用的是MediaExtractor.我需要使用MediaCodec,因为视频编码是使用MediaCodec完成的.如果我错了,请纠正我.

任何建议或建议都将非常有用,因为没有适用于这些新API的文档.

注意:

  1. 我的应用针对的是API 18+(Android 4.3+).
  2. 我已经将格拉菲卡称为视频编码.

audio video android mediacodec mediamuxer

6
推荐指数
1
解决办法
2225
查看次数

Android在MediaPlayer中显示视频流并使用MediaCodec进行编码

问题:我有来自GoPro相机的视频流,格式为.m3u8.我需要在应用程序中显示流的内容,然后流式传输视频.对于流媒体,我有与MediaCodec和ffmpeg一起使用的库.我应该能够流式传输MediaCodec的outputBuffer.

我可以在SurfaceView上使用MediaPlayer流式传输视频,没问题.真正的困难在于使用MediaCodec.我可以初始化MediaCodec,获取表面并将其添加到MediaPlayer - 蒸汽播放 - 我可以听到声音.

现在的问题是:

  1. 在SurfaceView上显示流 - 或MP和MC可以使用的任何其他视图.从Surface到SurfaceView/TextureView显示数据的最佳方法是什么?

  2. 我无法从MediaCodec获取数据.我只需要支持5.0+设备,所以我尝试使用MediaCodec.Callback.但我每次都会得到错误.我还没有找到错误的含义.我可以做些什么来配合Callback工作?

  3. 有没有"简单"的方法,或者我必须深入到谷歌Grafika的缓冲区和表面?

以下是我得到的错误:

E/ACodec? [OMX.qcom.video.encoder.avc] storeMetaDataInBuffers (output) failed w/ err -2147483648

 1877-1904/com.example.marek.goprorecorder E/ACodec? [OMX.qcom.video.encoder.avc] ERROR(0x80001009)
07-15 15:54:47.411    1877-1904/com.example.marek.goprorecorder E/ACodec? signalError(omxError 0x80001009, internalError -2147483648)
07-15 15:54:47.411    1877-1903/com.example.marek.goprorecorder E/MediaCodec? Codec reported err 0x80001009, actionCode 0, while in state 6

Errror mess: android.media.MediaCodec$CodecException: Error 0x80001009
07-15 15:54:47.454    1877-1877/com.example.marek.goprorecorder D/MediaCodecCallback? Errror diag: android.media.MediaCodec.error_neg_2147479543
07-15 15:54:47.454    1877-1877/com.example.marek.goprorecorder D/MediaCodecCallback? Errror rec: false
07-15 15:54:47.454    1877-1877/com.example.marek.goprorecorder D/MediaCodecCallback? Errror tra: false
Run Code Online (Sandbox Code Playgroud)

这是我的活动:

public class MainActivity extends ActionBarActivity implements …
Run Code Online (Sandbox Code Playgroud)

video android android-mediaplayer mediacodec

6
推荐指数
0
解决办法
2090
查看次数

如何使用AudioCodec重新采样音频?

我的PCM采样率为48000的音频数据,我想将AAC采样率44100 编码为音频?是否有可能这样做MediaCodec

audio android wav mediacodec

6
推荐指数
1
解决办法
376
查看次数

Android编码和发送的视频无法在iOS Telegram中播放

电报用于MeidaCodec对来自Android API 16的视频进行编码.它可以在API 18中正常工作.但是在API 16,17中存在错误.从Android编码和发送的视频无法在iOS中播放.
我认为问题在于在解码器编解码器的输出和编码器编解码器的输入之间转换颜色. https://github.com/DrKLO/Telegram/blob/2114024ab1d9cf209916bcdb3a4a7d44e51a3b0c/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java#L3223

我的应用程序目前用于ffmpeg编码视频.但它太慢了.MediaCodec比...快得多ffmpeg.但它只能在API 18中运行良好.
任何人都可以解决问题视频无法在iOS中播放吗?谢谢.

android mediacodec telegram

6
推荐指数
0
解决办法
1328
查看次数

RTMP自适应比特率算法

我在网上搜索但是关于这个的信息非常少.

我有一个实时广播应用程序,我通过RTMP堆栈使用Android MediaCodec SDK发送由摄像头和麦克风产生的编码H264视频帧和AAC音频块.

我的直播流是720p,我的目标是2500Kbps的高质量.这显然需要非常好的网络连接,如果您使用数据计划,这意味着4G.

问题是即使连接最大,也会出现低峰值和拥塞,因此网络将无法保持如此沉重的流量.因为我想提供高可靠性,我想在我的应用程序中包含自动自适应比特率,以便降低图像质量或有利于可靠性.

问题是 - 如何实现这种自动适应网络条件而不丢失帧?它甚至可能吗?我使用像Cerevo这样的专业编码设备,他们不会丢帧 - 但是对于我的应用程序,由于p帧在网络中丢失,我总是会受到一些可怕的拖累.

这就是我目前拥有的:

private long adaptBitrate(long idleNanos, Frame frame) {
        int bytes = frame.getSize();
        long nowNanos = System.nanoTime();
        if (nowNanos - mLastNanos > 1000L * 1000 * 1000) {
            double idle = (double) idleNanos / (double) (nowNanos - mLastNanos);
            float actualBitrate = newBitrate;

            int size = mBuffer.size();
            String s = "Bitrate: " + actualBitrate / 1000
                    + " kbps In-Flight:" + bytes
                    + " idle: " + idle;
            if …
Run Code Online (Sandbox Code Playgroud)

streaming android rtmp mediacodec

6
推荐指数
1
解决办法
853
查看次数