在 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 中创建带有编码帧的视频的主要内容,如果未能解决你的问题,请参考以下文章

确定 H.264 帧的持续时间

在 Java 中创建音频(麦克风)和视频(桌面)流

在java中将yuv帧编码为视频文件

如何在我的 C++ 代码中创建 QML 画布并在其上附加视频?比如Java Canvas我可以

如何在 Django 中创建添加到队列选项?

视频的一些名词概念