【问题标题】:Live encode H.264 stream on Android在 Android 上实时编码 H.264 流
【发布时间】:2014-03-18 18:37:40
【问题描述】:

我正在编写一个 Android 应用程序,我计划在其中将多张图像编码为可以在任何浏览器上回放的实时 h.264 视频流。我使用 MediaCodec API 进行编码,然后使用 MediaMuxer 将其写入文件,如http://bigflake.com/mediacodec/ 中的示例所示。

我坚持的是如何告诉编码器/复用器对其进行编码,以便可以逐步播放。从示例中,仅当进行编码器/muxer.stop()/encoder/muxer.release() 调用时,视频文件才会获得正确的元标题等。

谢谢

【问题讨论】:

  • 您需要将 MPEG4 元信息从文件末尾移动到开头,请参阅mithunme.wordpress.com/2009/11/04/streaming-mp4-via-http
  • MediaMuxer 类确实想将 .mp4 文件写入磁盘。它不适合流式传输。如果您想要将经过编辑的视频源从您的应用程序实时流式传输到主机浏览器,则需要整理网络视频流协议。但我不相信我完全理解你在追求什么。

标签: android encoding h.264 android-mediacodec


【解决方案1】:

我猜你正在考虑显示每一帧的时间。

您需要为 MediaMuxer 和帧一起提供正确的“MediaCodec.BufferInfo”,其“presentationTimeUs”已相应设置。

例如,有 3 帧,每帧在视频中显示 1 秒:

sec 0---------1---------2-----------
    frame1    frame2    frame3 


int[] timestampSec = {0, 1, 2};
for (int i = 0; i < 3; i++) {
    muxer.writeSampleData(trackId, 
                          frame[i], 
                          timeStampSec[i] * 1000000); 
}

关于MediaMuxer的初始化和结束:

  1. addTrack:当您调用 MediaCodec.dequeueOutputBuffer() 时获得 index == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED,将格式发送到 MediaMuxer 以初始化新轨道对于这种格式(在这种情况下是“vidio/avc”)。

  2. mediamuxer.start()

  3. 如上开始放置帧

  4. mediamuxer.stop(), release()

【讨论】:

    猜你喜欢
    • 2011-08-18
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多