Android:使用 OMXCodec 作为 MediaSource 时 MPEG4Writer 无法启动

2024-01-04

我正在尝试从字节数组缓冲区对视频进行编码,为此我正在使用MPEG4Writer来自本机代码的 API。

我已经创建了我的自定义MediaSource提供数据的类,我用它包装它OMXCodec给它MPEG4Writer:

sp<MediaSource> mVideoEncoder = OMXCodec::Create(client.interface(), omxEncMeta, true, mVideoOutSource);
mVideoEncoder->start();

mVideoOutSource是我的习惯MediaSource class, omxEncMeta如下:

int32_t colorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
int32_t width = 480;
int32_t height = 360;
int32_t frameRate = 24;
int32_t bitRate = 500 * 1024;
int32_t iFrameInterval = 1;

sp<MetaData> omxEncMeta = new MetaData;
omxEncMeta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC);
omxEncMeta->setInt32(kKeyColorFormat, colorFormat);
omxEncMeta->setInt32(kKeyWidth, width);
omxEncMeta->setInt32(kKeyHeight, height);
omxEncMeta->setInt32(kKeyStride, width);
omxEncMeta->setInt32(kKeySliceHeight, height);
omxEncMeta->setInt32(kKeyFrameRate, frameRate);
omxEncMeta->setInt32(kKeySampleRate, frameRate);
omxEncMeta->setInt32(kKeyBitRate, bitRate);
omxEncMeta->setInt32(kKeyIFramesInterval, iFrameInterval);

但当我打电话时start()方法返回错误代码UNKNOWN_ERROR.

相反,如果我尝试给予MPEG4Writer直接我的定制MediaSource(不用包裹它OMXCodec它成功启动,但最终会停止记录并出现错误Missing codec specific data(大约12帧后),我认为这是因为我的习惯MediaSource仅提供有关实际帧的信息,但不提供有关编解码器格式的信息。

我确定我错过了一些东西OMXCodec,但我不知道是什么......有没有人可以为我提供一个自定义的工作示例MediaSource用于编码?或者给我一些关于为什么这根本不起作用的提示?
如果您需要更多信息,请询问,谢谢!

EDIT:我正在针对 API 14 开发这个,所以请不要建议我使用MediaCodec从 API 16 开始:)

EDIT: 我就是这样开始的MPEG4Writer:

int32_t outputFormat = OUTPUT_FORMAT_MPEG_4;
int64_t startTimeUs = systemTime() / 1000;
int32_t totalBitRate = bitRate;

sp<MetaData> meta = new MetaData;
meta->setInt64(kKeyTime, startTimeUs);
meta->setInt32(kKeyFileType, outputFormat);
meta->setInt32(kKeyBitRate, totalBitRate);

sp<MPEG4Writer> mWriter = new MPEG4Writer("/sdcard/encode_manual.mp4");
mWriter->addSource(mVideoEncoder);
status_t error = mWriter->start(meta.get());
if (error != OK) {
    LOGE("Writer NOT started! %x", error);
} else {
    LOGI("Writer started!");
}

这是 logcat 的输出(adb logcat OMXClient:V OMXCodec:V *:W):

W/ResourceType(  370): Skipping entry 0x7f04002f in package table 0 because it is not complex!
E/        ( 4127): Can't open file for reading
E/        ( 4127): Can't open file for reading
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  omx_video(): Inside Constructor()
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  omx_venc(): Inside component_init()
E/OMX-VENC-720p(  155): bool venc_dev::venc_validate_profile_level(OMX_U32*, OMX_U32*): Returning with eProfile = 1Level = 4
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  bool venc_dev::venc_open(OMX_U32)(): Init Profile/Level setting success
E/OMX-VENC-720p(  155): vidc.venc.debug.sliceinfo value is 0
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  Component_init return value = 0x0
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155): WARNING: Requested i/p bufsize[40960],Driver's updated i/p bufsize = 262144
E/OMX-VENC-720p(  155): bool venc_dev::venc_validate_profile_level(OMX_U32*, OMX_U32*): Returning with eProfile = 1Level = 256
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  bool venc_dev::venc_set_param(void*, OMX_INDEXTYPE)(): Profile/Level setting success
E/OMX-VENC-720p(  155): bool venc_dev::venc_validate_profile_level(OMX_U32*, OMX_U32*): Returning with eProfile = 1Level = 64
E/OMX-VENC-720p(  155): Calling set level (Framerate) with 15
E/OMX-VENC-720p(  155): bool venc_dev::venc_validate_profile_level(OMX_U32*, OMX_U32*): Returning with eProfile = 1Level = 64
E/OMX-VENC-720p(  155): Calling set level (Bitrate) with 15
E/OMX-VENC-720p(  155): get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported for Input port returned Profile:1, Level:2048
E/OMX-VENC-720p(  155): Profile/Level set equal to 1/64
E/OMX-VENC-720p(  155): bool venc_dev::venc_validate_profile_level(OMX_U32*, OMX_U32*): Returning with eProfile = 1Level = 64
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  venc_set_intra_period: nPFrames = 25 nBFrames = 0
E/OMX-VENC-720p(  155): bool venc_dev::venc_validate_profile_level(OMX_U32*, OMX_U32*): Returning with eProfile = 1Level = 64
E/OMX-VENC-720p(  155): Calling set level (Bitrate) with 15
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  allocate_input_buffer()::
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  allocate_input_buffer()::
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  allocate_input_buffer()::
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  allocate_output_buffer()::
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  actual cnt = 5
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  allocate_output_buffer()::
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  actual cnt = 5
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  allocate_output_buffer()::
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  actual cnt = 5
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  allocate_output_buffer()::
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  actual cnt = 5
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  allocate_output_buffer()::
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  actual cnt = 5
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  unsigned int venc_dev::venc_start()(): Check Profile/Level set in driver before start
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  unsigned int venc_dev::venc_start()(): Driver Profile[3]/Level[15] successfully SET
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155): ENC_CONFIG: Codec: 2, Profile 3, level : 15
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  ENC_CONFIG: Width: 480, Height:360, Fps: 25
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155): ENC_CONFIG: Bitrate: 512000, RC: 3, I-Period: 25
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155): ENC_CONFIG: qpI: 0, qpP: 80, qpb: 0
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155): ENC_CONFIG: VOP_Resolution: 4343391, Slice-Mode: 1, Slize_Size: 0
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155): ENC_CONFIG: EntropyMode: 1, CabacModel: 0
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155): ENC_CONFIG: DB-Mode: 2, alpha: 0, Beta: 0
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155): ENC_CONFIG: IntraMB/Frame: 18, HEC: 843271745
E/OMX-VENC-720p(  155): Width 480, Height 360, w_round 480, h_round 368, yuv_size 294912 alignment 8192 count 2
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  Allocated virt:0x4432e000, FD: 145 of size 294912
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  Allocated virt:0x4432e000, FD: 145 of size 294912 at index: 0
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  Allocated virt:0x44895000, FD: 147 of size 294912
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  Allocated virt:0x44895000, FD: 147 of size 294912 at index: 1
E/TestEnc-JNI( 4127): Writer NOT started! 80000000

我刚刚弄清楚我的(dumb) 问题:我正在打电话start() on mVideoEncoder (the OMXCodec实例)调用之前start() on MPEG4Writer,这给出了UNKNOWN_ERROR.

我通过调用解决了start()仅在MPEG4Writer实例。

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

Android:使用 OMXCodec 作为 MediaSource 时 MPEG4Writer 无法启动 的相关文章

  • 加载 QPixmap 数据的更好方法

    更好的方法来做到这一点 没有QImage QImage image width height QImage Format RGB888 memcpy image bits m frameRGB gt data 0 height width
  • 大量互斥体对性能的影响

    假设我有一个包含 1 000 000 个元素的数组 以及多个工作线程 每个线程都操作该数组中的数据 工作线程可能会使用新数据更新已填充的元素 但每个操作仅限于单个数组元素 并且独立于任何其他元素的值 使用单个互斥锁来保护整个数组显然会导致高
  • 从图像创建半透明光标

    是否可以从图像创建光标并使其半透明 我目前正在拍摄自定义图像并覆盖鼠标光标图像 如果我可以将其设为半透明 那就太好了 但不是必需的 销售人员喜欢闪亮的 目前正在做这样的事情 Image cursorImage customImage Get
  • ASP.NET - Crystal Report Viewer 打印按钮在 ASP.NET 中不起作用

    我正在使用 Visual Studio 2008 但我遇到了水晶报告问题 当我单击打印按钮时 它会将我带到弹出窗口 但未找到页面 弹出的网址是 http localhost aspnet client System Web 2 0 5072
  • DateTime.ParseExact - 为什么 yy 变成 2015 而不是 1915

    为什么 NET 假定以下年份是 2015 年 而不是 1915 年 var d DateTime ParseExact 20 11 15 dd MM yy new CultureInfo en GB 我想 它会尝试接近 但其背后是否有合理的
  • 如何在 C++ 中正确使用 cin.fail()

    我正在编写一个程序 从用户那里获取整数输入cin gt gt iUserSel 如果用户输入一个字母 程序就会进入无限循环 我试图用下面的代码来阻止这种情况 但程序进入无限循环并打印出 错误 输入 我该如何修复我的程序 cin gt gt
  • 选择活动时运行时崩溃

    首先我想说我几乎没有 Android 经验 这是我在 Android 中的第一个项目 而且我的老师不太擅长教学 所以我对任何过度的无知表示歉意 在进一步讨论之前先解释一下 我的应用程序的目标本质上是能够记录您在某些活动上花费了多少时间 记录
  • RecyclerView 来自 Firebase 的部分和数据

    您好 我正在开发一个应用程序 在其中我必须使用 Firebase 填充数据回收器视图 准备就绪 现在我想做的是用 data firebase 填写一个 recyclerview 但有一些部分将成为托管 data firebase 的父级 我
  • 将 AutomationID 与 ListView 结合使用

    我正在尝试将 AutomationId 附加到列表视图中的项目 理想情况下 将项目名称绑定到显示的项目
  • 如何在VS2005中使用从.bat而不是.exe启动的外部程序进行调试?

    在我的 c 项目的调试属性中 我选择了 启动外部程序 并选择了我希望将调试器附加到的程序的 exe 但是 现在我需要从 bat 文件而不是 exe 启动程序 但 VS2005 似乎不允许这样做 这可能吗 编辑 为了澄清 我需要调试从 bat
  • 在 Android(JB 上)中,如何向自定义丰富通知添加操作?

    我一直在使用 Jelly Bean 中新的丰富通知 当我使用模板设置新通知时 一切都按预期工作Notification BigPictureStyle Notification BigTextStyle or Notification In
  • 在 Visual Studio 2012 Express 中设置 C++ 调试环境

    我需要调试的应用程序需要设置环境变量 这在 Visual Studio 2012 中似乎非常复杂 我想做类似的事情 set path c foo c bar c windows c program files application set
  • 查找数组中的多个索引

    假设我有一个像这样的数组 string fruits watermelon apple apple kiwi pear banana 是否有一个内置函数可以让我查询 apple 的所有索引 例如 fruits FindAllIndex ap
  • 使用通用存储库模式和流畅的 nHibernate

    我目前正在开发一个中型应用程序 它将访问不同站点上的 2 个或更多 SQL 数据库等 我正在考虑使用类似的东西 http mikehadlow blogspot com 2008 03 using irepository pattern w
  • StableArrayAdapter 与 ArrayAdapter

    我正在看这个ListView教程 列表视图教程 http www vogella com tutorials AndroidListView article html 我想知道创建自己的更好ArrayAdapter 而不仅仅是使用和Arra
  • 我如何知道我正在运行的 android ndk 版本

    在 GUI 中 您可以转到 设置 gt 关于手机 gt 固件版本 并获取 2 1 或其他版本 如何从命令行执行此操作 或对于需要在运行时执行此操作的本机应用程序 NDK 不在手机上运行 它只是一组工具 可让您构建将在 Android 设备上
  • 在活动之间共享菜单栏

    我的应用程序上有一个菜单栏 我需要在 5 个活动之间共享该菜单栏 我的菜单栏 5 个允许在活动之间切换的按钮 对于任何活动具有完全相同的 UI 和相同的行为 因此我想共享菜单栏 XML 视图代码和控制器代码 我已经找到了一种使用共享 XML
  • iOS:如何实现像Android的startActivityForResult这样的行为

    我是一名 Android 开发人员 正在开发我们应用程序的 iOS 版本 我需要知道如何在 Android 上实现类似于 startActivityForResult 的行为 我需要显示一个新的视图控制器 然后在新的视图控制器关闭时将控制权
  • 使用空的weak_ptr作为参数调用map::count安全吗?

    打电话安全吗map count http www cplusplus com reference map map count on an 未初始化因此为空weak ptr http en cppreference com w cpp mem
  • 将同步 zip 操作转换为异步

    我们有一个现有的库 其中一些方法需要转换为异步方法 但是我不确定如何使用以下方法执行此操作 错误处理已被删除 该方法的目的是压缩文件并将其保存到磁盘 请注意 zip 类不公开任何异步方法 public static bool ZipAndS

随机推荐

  • 将 jar 添加到 maven exec:java classpath

    我有一个批处理文件 它使用依赖于tools jar 来自JDK 的maven 运行java 类 例如 mvn f pom xml e exec java Dfile encoding UTF 8 Dexec mainClass MyClas
  • 按元素过滤 XML [重复]

    这个问题在这里已经有答案了
  • omp 的行为对嵌套并行级别至关重要

    考虑以下场景 函数A创建一层OMP并行区域 每个OMP线程调用函数B 函数B本身包含另一层OMP并行区域 那么 如果在函数 B 的并行区域内 存在一个 OMP 临界区域 那么 该区域对于函数 A 和 B 创建的所有线程来说是 全局 临界的
  • istio:VirtualService 重写为根 url

    我有一个 Istio 1 4 6 VirtualService 其匹配项和 url 重写定义如下 match authority prefix example com uri prefix foo bar rewrite uri route
  • (-) MonthBegin 的 Pandas 日期时间锚定偏移量无法按预期工作

    我需要回到月初 但如果我已经在月初 我想留在那里 Pandas 锚定偏移量 n 0 应该正是这样做的 但它不会在 MonthBegin 的锚定点之间产生预期结果 例如对于这个pd Timestamp 2017 01 06 00 00 00
  • 如何将变量中的列表附加到 R 中数据帧的特定行中的列表?

    我创建了一个 RMarkdown 来检查错误 其输出print指定错误以及需要更正哪些行号的语句 这将检查df以下 我创建了另一个数据框 df index在下面的示例中 来跟踪每列需要更正的行 即df 本质上 我需要添加一个列来存储需要为每
  • 如何从intent中获取文件名?

    这是我的清单文件 使用意图过滤器后 我从邮件附件下载 ics 文件 当我打开下载的文件时 它会启动我的应用程序 我需要获取应用程序中所选文件的文件名和数据 我应该在清单和java文件中做什么 我对 Android 很陌生 有人可以帮助我吗
  • 为什么我的 create-react-app 显示 README.md,而不是 index.html?

    为什么我的 create react app 显示 README md 而不是 index html 我已经运行 npm run build gt yarn run deploy 多次检查文件结构并阅读 gh pages 文档 找不到任何其
  • Angular 7+:将静态 html 文件注入组件视图中间

    我无法找到将文件中的静态 html 注入视图中间的最佳方法 我有一个名为 eula dialog 的组件 其中该组件尚未执行任何操作 但视图如下所示 eula dialog component html h1 Sign EULA h1
  • 持续集成、持续交付、持续部署

    这三个术语有什么区别 我的大学提供了以下定义 持续集成基本上只是意味着开发人员的工作副本每天与共享主线同步多次 持续交付被描述为持续集成的逻辑演变 始终能够将产品投入生产 持续部署被描述为持续交付后合乎逻辑的下一步 只要产品通过 QA 就自
  • 计算任意大整数的整数平方根 (isqrt) 的有效算法

    Notice 对于解决方案Erlang or C C go to Trial 4 below 维基百科文章 整数平方根 http en wikipedia org wiki Integer square root 整数平方根 的定义可以在这
  • 请求的 JSON 解析失败

    由于某种原因 下面的 ajax 代码存在解析错误 我怎样才能找出它是什么 和 或有人能看到出了什么问题吗 listElements sortable revert true update function event ui var orde
  • 我是否必须切换到 https 才能在 Chrome 92 中使用“SharedArrayBuffer”?

    我的网站不适用于 Chrome 92 使用 Chrome 91 一切都很好 问题是SharedArrayBuffer自 Chrome 92 起未启用 当我尝试通过添加标题 Cross Origin Embedder Policy requr
  • 从命令行创建新的 Visual Studio 解决方案

    有没有办法使用 devenv 从我制作的多项目模板创建新的 Visual Studio 解决方案 有很多关于使用命令行构建的资源 但我似乎找不到任何关于创建新解决方案的信息 我希望能够从我制作的代码生成器的模板中打开一个新的解决方案 以便我
  • 无法通过 USB 将计算机时间同步到 Arduino

    我想将时间从我的电脑同步到arduino 我正在使用他们的时间库 但它不起作用 如何让arduino与我的电脑上的时间相同 我目前使用的是Mac 他们的文件说 在unix系统上 可以使用shell命令设置时间 TZ adjust 8 ech
  • Ruby:转换数组中的对象后传递键/值

    给定数据 data id 14 sort 1 content 9 foo 2022 id 14 sort 4 content 5 foo 2022 id 14 sort 2 content 1 foo 2022 id 14 sort 3 c
  • 在 Google 地图中标记街道

    我想在 Google 地图上创建一个叠加层 以不同的颜色显示不同的街道 在 Google 地图 API 中 可以创建覆盖某些区域的标记和多边形 有没有办法以某种方式标记不同的街道 在我看来 您有兴趣为您的 Google 地图显示 而不是交通
  • 在Eclipse中调试时,在返回之前可以查出返回值吗?

    是否可以在该行运行之后 指令指针返回到调用函数之前查看方法的返回值 我正在调试无法修改的代码 阅读 不想重新编译第三方库 有时它会跳转到我没有源代码的代码 或者返回表达式有副作用 使我无法在Display tab 返回值通常用在复合语句中
  • Apache Commons 电子邮件和 UTF-8

    如何将 Apache Commons Email 生成的电子邮件的编码更改为 UTF 8 我想发送根据收件人的语言生成的电子邮件 并且我需要考虑日语和俄语 问题是 Email 类没有提出我可以传递给的 UTF 8 常量Email setCh
  • Android:使用 OMXCodec 作为 MediaSource 时 MPEG4Writer 无法启动

    我正在尝试从字节数组缓冲区对视频进行编码 为此我正在使用MPEG4Writer来自本机代码的 API 我已经创建了我的自定义MediaSource提供数据的类 我用它包装它OMXCodec给它MPEG4Writer sp