在 Java 中创建带有编码帧的视频
Posted
技术标签:
【中文标题】在 Java 中创建带有编码帧的视频【英文标题】:Create video with encoded frames in Java 【发布时间】:2013-06-13 19:18:54 【问题描述】:我在 android (Java) 中有一个应用程序,它对来自相机的帧进行编码。
每一帧都是一个字节数组,在被捕获后,使用 API MediaCodec 进行编码。
如果我直接在视频文件上写入帧,我可以用 ffplay 打开它(而不是用另一个视频播放器作为 VLC),但它说例如:
Input #0, h263, from 'example.avi':
Duration: N/A, bitrate: N/A
Stream #0.0: Video: h263, yuv420p, 640x480 [PAR 12:11 DAR 16:11], 25 fps, 25 tbr, 1200k tbn, 29.97 tbc
5.58 A-V: 0.000 s:0.0 aq= 0KB vq= 0KB sq= 0B f=0/0 0/0
换句话说,它不识别持续时间,也不识别比特率。
我想我必须将元数据写入文件,但我不知道该怎么做。
正如我在帖子中所说,该应用程序是使用 Java(使用 Android API)实现的,所以我想知道如何添加使视频播放器能够识别我的视频的元数据。
【问题讨论】:
【参考方案1】:MediaCodec
的输出是原始 H.264 流。从 Android 4.3 (API 18) 开始,您可以通过 MediaMuxer 类运行此流并将其转换为 .mp4 文件。
您可能感兴趣的一个相关项目是,您现在可以将相机的 Surface 预览提供给 MediaCodec
,而不是通过 ByteBuffer 传递 YUV 数据。这种方法需要较少的数据复制,并且不需要颜色平面交换。
请参阅 CameraToMpegTest 示例 here。
【讨论】:
【参考方案2】:它不是 avi 容器,它只是 h264 流。尝试重命名为“*.h264”并与一些播放器(vlc,mplayer)一起玩。
【讨论】:
ffplay 是否显示视频?.. 你确定你写入缓冲区正确吗?您能否提供将缓冲区写入文件的方式的来源?...以上是关于在 Java 中创建带有编码帧的视频的主要内容,如果未能解决你的问题,请参考以下文章