- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我试图在不使用 MediaExtractor API 的情况下使用 MediaCodec API 进行解码。相反,我使用 mp4parser 从 mp4 文件中获取样本。目前,我只使用 h.264/avc 编码的视频内容。
MediaCodec API的官方文档状态:
buffers do not start and end on arbitrary byte boundaries, this is not a stream of bytes, it's a stream of access units.
意思是,我必须将访问单元提供给解码器。但是,我错过了此信息中的一些细节:
对于 h.264,在一个 mp4 样本中,可以有多个 NAL 单元,每个单元前面有 4 个(默认)字节指定 NAL 单元长度。
现在我的问题:
可以有 mp4 样本,其中编解码器配置 NAL 单元(sps、pps)与包含编码(部分)帧的 NAL 单元混合。在这种情况下,我是否应该在调用 queueInputBuffers()
时传递标志 BUFFER_FLAG_CODEC_CONFIG
?
mp4 样本中还可以有其他(附加的)NAL 单元,例如 SEI 或访问单元定界符 NAL 单元。那些呢?没问题?
我尝试了各种可能性,但我从 Android 得到的所有反馈是 dequeueOutputBuffer()
的调用超时(或者不返回,如果我通过 -1
作为超时参数)。因此,我似乎没有办法解决这个问题。
当然也非常欢迎任何建议做什么或去哪里看。
最佳答案
指定 NAL 单元长度的 NAL 长度前缀在传递给 MediaCodec 进行解码之前需要转换为 Annex-B 起始码(字节 0x00、0x00、0x00、0x01)。 (有些解码器实际上可能会直接接受 MP4 格式,但这并不常见。)
存储在文件中avcC原子中的SPS/PPS也需要转换为使用Annex-B startcodes。请注意,avcC 原子包含一些您不需要传递给解码器的其他字段。您可以在发送任何实际帧之前通过设置 BUFFER_FLAG_CODEC_CONFIG 标志来传递打包在一个缓冲区中的 SPS 和 PPS(在每个缓冲区之前都有启动代码),或者在您用于配置解码器的 MediaFormat 中传递它们(使用 Annex-B 启动代码) (在一个带有键“csd-0”的 ByteBuffer 中,或者在两个单独的键“csd-0”和“csd-1”中)。
如果你的文件在每个帧中有更多的 SPS/PPS,你应该能够将它们作为帧的一部分传递,并且大多数解码器应该能够处理它(特别是如果它与相同的 SPS/PPS之前而不是配置更改)。
因此:将属于一个样本的所有 NAL 单元传递到一个缓冲区中,但将所有 NAL 单元长度 header 重写为起始码。并处理流本身内部没有 SPS/PPS 的 MP4 文件,解析 avcC 原子(我不知道 mp4parser 以哪种格式返回它)并将带有起始码的 SPS 和 PPS 传递给解码器(通过 MediaFormat 作为“csd-0”或作为第一个缓冲区,设置 BUFFER_FLAG_CODEC_CONFIG)。
关于android - 使用不带 MediaExtractor 的 MediaCodec 解码 mp4/h.264,预期访问单元格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25160710/
我正在尝试构建一个播放器,使用 MediaCodec 播放带有 2 个音轨的 mpeg2-ts 流和 MediaExtractor .当我将 URL 设置为提取器时:extractor.setData
我正在尝试使用 MediaExtractor 和 MediaCodec 从电影中获取特定时间的特定帧作为图像。如果满足以下条件,我可以成功完成: 我使用 extractor.seekTo(time,
我正在尝试开发一个应用程序,通过 RTSP(实时流协议(protocol))从安全摄像头下载实时视频流。 我已成功连接到相机并可以在 VideoView 中查看视频。但是,我想要对数据流进行低级访问,
使用 MediaExtractor 类,我可以从保存的 mp4 视频中获取编码的音频样本数据,如下所示: ByteBuffer byteBuffer = ByteBuffer.allocate(102
什么意思: SAMPLE_FLAG_SYNC SAMPLE_FLAG_ENCRYPTED 我很难理解音频文件的“同步样本”概念。 此外,请随时提出任何技术引用以了解“整个场景”。 最佳答案 SAMPL
我是新来的,刚接触 Android 开发。这是我的第一个问题。 我正在使用 MediaExtractor 和 MediaCodec 播放带有视频和音频的 mp4 文件。现在我得到一对视频提取器/编解码
MediaExtractor 类的 advance() 方法比预期更早(在文件结束之前)发出流结束信号,我遇到了问题。根据谷歌引用 advance()使用本地文件时方法可能会出错(这是我的情况 - f
我试着回答这个问题 Concatenate multiple mp4 audio files using android´s MediaMuxer并连接视频文件。 但由于某些原因,当我调用 readS
我使用 MediaCodec 和 MediaExtractor 创建了一个视频播放器,但是当我尝试使用 MediaExtractor seekTo< 更改媒体位置时 方法它真的很慢(寻找 1080P
我正在尝试使用 MediaExtract 提取 avi 文件的轨道 0(视频轨道)并使用 MediaCodec 编码为 h264 格式。这是我配置 mediaCodec 的方式 public Medi
我正在尝试使用 MediaExtractor/MediaCodec 播放 mp3 流。由于延迟和长缓冲区大小,MediaPlayer 是不可能的。 我找到的唯一示例代码是:http://dpsm.wo
我正在使用 MediaCode、MediaExtractor 和 AudioTrack 创建我自己的媒体播放器实现。我需要对从本地存储的音频文件中读取的解码 mp3 样本执行失真 - 因此需要自定义实
我正在尝试使用 ExoPlayer 播放 AAC 流。我遇到了与使用内置 MediaPlayer 时遇到的相同问题:在 KitCat 上启动需要 15 - 20 秒(其他版本可能也会发生同样的情况,但
我在两台 Android 设备上检查了 MediaExtractor 的输出,它似乎在它们上产生了略有不同的样本,假设相同视频文件。 对于一个设备,非 VCL NAL 单元连接到下一个 VCL 单元以
我正在使用 MediaExtractor/MediaCodec 解码视频并将其渲染到 TextureView。作为模板,我使用了以下代码:https://github.com/vecio/MediaC
我正在尝试流式传输传入的 AMR_NB。我不能直接使用 MediaPlayer,因为它需要一个可搜索的文件。我想使用 MediaCodec,但要使用 MediaCodec,我需要(我想……请纠正我!)
我正在像这样使用 Android MediaExtractor: MediaExtractor extractor = new MediaExtractor(); extractor.setDataS
我需要将视频解码为一系列位图,以便我能够修改它们,然后将它们压缩回 android 中的视频文件。 我计划通过使用 getFrameAtTime 并将其保存到图像序列中来管理它。然后我可以修改序列中的
我尝试读取 raw/assets 文件夹中的视频文件,我尝试了以下方法,但均无效。我正在测试 API 16。每种方法,我都尝试使用和不使用 mp4 扩展。我真的很感激有人可以帮助我 所有方法都不会崩溃
我正在尝试使用 MediaCodec 播放视频。视频正在播放但音频静音。我想取消静音。经过研究我发现我们需要单独解码音频和视频。我想只使用一个 Mediacodec 和 MediaExtractor
我是一名优秀的程序员,十分优秀!