Android MediaCodec:编码失败,因为视频轨道没有同步帧

2023-12-27

我计划将一个视频文件转换为另一个具有不同比特率、fps 等的视频文件。

基本上我遵循中的示例http://bigflake.com/mediacodec http://bigflake.com/mediacodec

但是,日志显示视频轨道没有同步帧的错误:

submitted frame 5 to dec, size=47398
no output from encoder available
decoder output format changed: {height=1080, what=1869968451, color-format=2141391875, slice-height=1088, crop-left=0, width=1920, crop-bottom=1079, crop-top=0, mime=video/raw, stride=1920, crop-right=1919}
no output from encoder available
surface decoder given buffer 0 (size=3137536)
awaiting frame
E/MPEG4Writer(3464): There are no sync frames for video track
W/MPEG4Writer(3464): 0-duration samples found: 1
Stopping Video track

然后程序退出。

我在网上搜索了一下。法登 说“确保将所有 MediaCodec.BufferInfo 值传递到 MediaMuxer - 这就是标志所在的位置。同步帧将设置 BUFFER_FLAG_SYNC_FRAME 标志。” https://stackoverflow.com/questions/21750790/android-mediamuxer-failed-to-stop

然而,从例子来看http://bigflake.com/mediacodec http://bigflake.com/mediacodec, 它用:

outputFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL,10); 

这似乎意味着编码器将确定为哪一帧分配关键帧。

网上似乎没有太多关于这个问题的相关信息。 哦,希望 bigflake.com 有更多与开发人员感兴趣的问题相关的示例(例如更改一个现有视频文件的格式参数)

==[更新]== 这是我使用的一些代码:

MediaFormat outputFormat = MediaFormat.createVideoFormat(MIME_TYPE, mWidth, mHeight);
outputFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,
        MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
outputFormat.setInteger(MediaFormat.KEY_BIT_RATE,5000000);
outputFormat.setInteger(MediaFormat.KEY_FRAME_RATE,30);
outputFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL,5); 
encoder = MediaCodec.createEncoderByType(MIME_TYPE);
encoder.configure(outputFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
inputSurface = new InputSurface(encoder.createInputSurface());
inputSurface.makeCurrent();
encoder.start();
...
try {
    mMuxer = new MediaMuxer(ouVideoFileName, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
} catch (IOException ioe) {
    throw new RuntimeException("MediaMuxer creation failed", ioe);
}
...
// now that we have the Magic Goodies, start the muxer
mTrackIndex = mMuxer.addTrack(newFormat);
mMuxer.start();
mMuxerStarted = true;
...
mMuxer.writeSampleData(mTrackIndex, encodedData, info_encoder);

那么我在哪里错过了向 mMuxer 传递参数呢?看来我已经传递了所有必需的参数。

==[更新2]== 在:

int encoderStatus = encoder.dequeueOutputBuffer(info_encoder, TIMEOUT_USEC);

我注销了 info_encoder.flags:从帧 0 到 5,标志 = 0。它们不是关键帧的标志。输入的视频文件是设备录制的短视频文件,.mp4,并且可以正常播放。 第 5 帧之后,MPEG4Write 抱怨“视频轨道没有同步帧”。

==[更新3]== 顺便说一句,我发现 DecodeEditEncodeTest.java 和 EncodeDecodeTest.java 之间的编码部分是不同的。 EncodeDecodeTest.java中的编码部分包括encoder.dequeueInputBuffer,而DecodeEditEncodeTest.java中根本没有与encoder.dequeueInputBuffer相关的行。你认为这会是一个问题吗?但首先,为什么这两个例子有所不同?

==[更新4]== 我将代码复制到类中ExtractMpegFramesTest然后在我的主要活动中,我有一个按钮。我点击按钮后,它会调用:

// test:
ExtractMpegFramesTest mTest = new ExtractMpegFramesTest();
try {
    mTest.testExtractMpegFrames();
} catch (Throwable e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

Error:

E/ACodec(11342): [OMX.qcom.video.decoder.avc] storeMetaDataInBuffers failed w/ err -2147483648
java.lang.RuntimeException: frame wait timed out
ExtractMpegFramesTest$CodecOutputSurface.awaitNewImage(ExtractMpegFramesTest.java:496)

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android MediaCodec:编码失败,因为视频轨道没有同步帧 的相关文章

随机推荐

  • 你能为 Ruby 中的 map(&:method) 语法提供参数吗?

    您可能熟悉以下 Ruby 简写 a是一个数组 a map method 例如 在 irb 中尝试以下操作 gt gt a a a 1 1 0 gt a a 1 1 0 gt gt a map class gt Symbol String F
  • 一个输入有多个验证器

    JSF 2 0 中的一个输入是否可以有多个验证器 例如 假设我要写一个用户名 并且用户名必须有 8 个字符 如果OK 则检查数据库中是否不存在该用户名
  • Epson POS 打印机 - 自动状态返回规格

    我正在尝试解释 Epson POS 打印机的自动状态返回 ASB 数据 我已使用 UB E20 技术参考指南 www amigopos com faq faq 262 aspx 中的一些示例代码成功与打印机取得联系 不幸的是 手册只说明了我
  • iOS 报亭:推送通知不会在后台启动应用程序

    我正在应用程序中实现报刊亭功能 尽管应用程序收到推送通知 但它不会在后台模式下启动 如果我点击通知警报 应用程序将启动 我可以看到字典中存在 content available 1 并且该问题已下载 但应用程序不会自动启动 我已添加到 pl
  • 使用 twitter bootstrap typeahead 时如何禁用 google chrome 建议列表?

    使用 twitter bootstrap typeahead 我在 typeahead 列表上方得到 google chrome 建议列表 document ready function ID TextBox typeahead sourc
  • Docker 使用 gosu 与 USER

    Docker有点总是有一个USER命令以特定用户身份运行进程 但一般来说很多事情必须以 ROOT 身 份运行 我见过很多使用ENTRYPOINT with gosu取消提升进程的运行权限 我仍然对是否需要感到有点困惑gosu USER 还不
  • 在Unity中使用抽象工厂作为注入工厂?

    我有一个抽象工厂注册用于在某些控制器实例中注入 我可以注册该抽象工厂并将其用作注入工厂吗 这就是我所拥有的 public interface ILevelFactory Levels Create RegisterType
  • 紧凑框架语音识别API或库

    到目前为止 我的研究告诉我 没有免费的语音识别库 这仍然是这种情况吗 因为我发现的所有帖子都是几年前的 如果我想让我的 WinMobile C 应用程序能够 是否有示例应用程序或任何我可以开始的东西 从输入中识别语音 看一下http www
  • 获取curl php中最后一个重定向的url

    大家好 我知道这是 StackOverFlow 上一个非常常见的话题 我已经花了整整一周的时间来寻找它 我有一个网址 abc com default asp strSearch 19875379 这进一步重定向到此网址 abc com de
  • 在 AngularJS 中观察外部变量?

    我已经为 Chrome 应用程序中的串行通信编写了一个小型 JS 库 并且它本身运行良好 然而 我们在与 Angular 集成时遇到了一个问题 我没有办法从内部观察控制器外部串行对象的属性 而且我也无法找到解决方法 理想情况下 有一个计算成
  • 使用 plist 创建测验的随机整数

    我想让用户单击一个按钮以 a b c 的形式生成十个问题测验 其中 a 和 b 的值从 10 到 10 并随机分配给十个问题 此外 问题应该在加法和减法之间随机切换 如何正确填充 plist 文件 我该如何使用arc4random用随机整数
  • 如何使用 libgit2sharp 获取文件的先前版本

    我正在尝试使用libgit2sharp获取文件的先前版本 我希望工作目录保持原样 至少恢复到以前的状态 我最初的方法是尝试存储 签出我想要的文件的路径 将其保存到字符串变量 然后存储弹出 有没有办法隐藏流行音乐 我不容易找到它 这是我到目前
  • 以主题作为文件名保存邮件

    大家早上好 我希望有人可以帮助我编写一段代码 我希望将选定的电子邮件保存到特定目录 并使用电子邮件的名称 当然还有 msg 文件 这就是我今天所拥有的 但它不起作用 它保存一个文件 但名称只有前 2 个字符 看起来在分号文件名后出错 例如
  • xkcd:外部性

    所以2013年4月1日 xkcd外部性 http xkcd com 1193 网络漫画以 Skein 1024 1024 哈希破解为特色contest http almamater xkcd com 我假设这一定只是一种暴力行为 其中随机字
  • OxyPlot:如何隐藏左侧和顶部轴线

    我在 Xamarin iOS 项目中使用 Oxyplot 来绘制条形图 这就是我的情节目前的样子 这里我需要隐藏右轴和顶轴 我试过 model Axes Add new LinearAxis Position AxisPosition Ri
  • “无法识别的选择器发送到实例”UINavigationController

    我的 Xcode 应用程序收到以下异常错误消息 UINavigationController setDeals unrecognized selector sent to instance 0x8338d40 在以下上下文中抛出异常prep
  • 在发布模式下,代码行为不符合预期

    以下代码在调试模式和发布模式下产生不同的结果 使用 Visual Studio 2008 int tmain int argc TCHAR argv for int i 0 i lt 17 i int result i 16 if resu
  • Dojo:如何使用自己的onMove事件(覆盖)

    在文档中据说 onMove mover leftTop e 在每次移动通知期间调用 实际上应该移动节点 可以被覆盖 但没有示例如何覆盖它 onMove 有人可以抛出几行代码来展示它是如何工作的吗 Thanks 您没有指出哪个 dojo Ja
  • 如今何时使用定点

    对于密集的数字运算 我正在考虑使用定点而不是浮点 当然 定点类型的大小有多少字节 它将在什么 CPU 上运行 如果我可以使用 对于英特尔 MMX 或 SSE 或任何新出现的东西 这都很重要 我想知道现在浮点运行速度比以往任何时候都快 是否值
  • Android MediaCodec:编码失败,因为视频轨道没有同步帧

    我计划将一个视频文件转换为另一个具有不同比特率 fps 等的视频文件 基本上我遵循中的示例http bigflake com mediacodec http bigflake com mediacodec 但是 日志显示视频轨道没有同步帧的