gpt4 book ai didi

android - [android]使用mediacodec和ffmpeg生成.ts文件,但是生成的ts文件没有图片覆盖

转载 作者:行者123 更新时间:2023-12-04 23:19:10 25 4
gpt4 key购买 nike

我遇到了如下所述的问题;
我使用android框架的Mediacodec API从opengl纹理编码相机预览流,并希望生成一个ts文件;
由于 Mediacodec 不支持生成 ts 文件,所以我使用 ffmpeg 这样做;
一切正常,ts文件生成成功,可以在我的android或pc上通过媒体播放器播放,但还有2个问题困扰着我;

  • 视频文件没有图像 co,无论 xxx.ts 显示在我的 android 手机或 PC 上;
  • 当我将 xxx.ts 移动到我的 pc(windows) 上时,右键单击该文件以检查其属性,属性 frame-rate 也是空的;

  • 有人对这些问题有想法吗?
    编码器媒体编解码器配置如下:
    mBufferInfo = new MediaCodec.BufferInfo();
    MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, width, height);
    format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
    MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
    format.setInteger(MediaFormat.KEY_BIT_RATE, 4 * 1024 * 1024);
    format.setInteger(MediaFormat.KEY_FRAME_RATE, 25);
    format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1);

    mEncoder = MediaCodec.createEncoderByType("video/avc");
    mEncoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
    mInputSurface = mEncoder.createInputSurface();
    mEncoder.start();

    mFFmpegMuxer = new FFmpegMuxer();
    mFFmpegMuxer.prepare();
    FFmepgMuxer->prepare() 也称为 ffmpeg muxer的配置如下:
    mOutputFormatCtx = avformat_alloc_context();

    AVOutputFormat * outputFormat = av_guess_format(nullptr, "xxx.ts", nullptr);
    mOutputFormatCtx->oformat = outputFormat;
    AVStream *stream = avformat_new_stream(mOutputFormatCtx, nullptr);
    stream->codecpar->codec_id = AV_CODEC_ID_H264;
    stream->codecpar->format = AV_PIX_FMT_RGBA;
    stream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
    stream->codecpar->codec_tag = av_codec_get_tag(mOutputFormatCtx->oformat->codec_tag,
    AV_CODEC_ID_H264);
    stream->codecpar->width = 1080;
    stream->codecpar->height = 1200;
    stream->codecpar->bit_rate = 4 * 1024 * 1024;
    stream->time_base.num = 1;
    stream->time_base.den = 25;
    mOutputStreamInd = stream->index;

    if (mOutputFormatCtx->oformat->flags & AVFMT_GLOBALHEADER) {
    mOutputFormatCtx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
    }
    avio_open2(&mOutputFormatCtx->pb, outputPath.c_str(), AVIO_FLAG_WRITE, nullptr, nullptr);

    av_dict_set(&opts, "movflags", "faststart", 0);
    avformat_write_header(mOutputFormatCtx, &opts);
    av_dict_free(&opts);
    每次媒体编解码器成功编码数据包时, 数据包将被排入 ffmpeg :
    void FFmpegMuxer::enqueueBuffer(uint8_t *data, int offset, int size, long pts, bool keyFrame) {
    if (mPacket == nullptr) { mPacket = av_packet_alloc(); }
    av_init_packet(mPacket);
    mPacket->stream_index = mOutputStreamInd;
    mPacket->size = size;
    mPacket->data = data + offset;
    if (mRecStartPts == 0) {
    mRecStartPts = pts;
    mPacket->pts = 0;
    mPacket->dts = 0;
    } else {
    int64_t dstPts = pts - mRecStartPts;
    dstPts = av_rescale_q(dstPts, AV_TIME_BASE_Q,
    mOutputFormatCtx->streams[mOutputStreamInd]->time_base);
    mPacket->pts = dstPts;
    mPacket->dts = dstPts;
    }
    if (keyFrame) {
    mPacket->flags = AV_PKT_FLAG_KEY;
    }
    int status = av_interleaved_write_frame(mOutputFormatCtx, mPacket);
    if (status < 0) {
    ..........
    }
    av_packet_unref(mPacket);
    }
    需要停止录制 ,代码如下:
    av_write_trailer(mOutputFormatCtx);
    代码 fragment 是我可以提供的信息,任何人都可以找出问题所在吗?

    最佳答案

    最后我发现出了什么问题;
    ts是实时比特流,所以我需要在每个i帧之前插入sps和pps;
    这就是答案。

    关于android - [android]使用mediacodec和ffmpeg生成.ts文件,但是生成的ts文件没有图片覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70486943/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com