【发布时间】:2020-03-21 02:29:09
【问题描述】:
在 Android MediaCodec 上苦苦挣扎,我正在寻找一个直接的过程来更改 Android 中视频文件的分辨率。
目前我正在尝试一种单线程转码方法,它逐步完成所有工作,以便我可以很好地理解它,并且在高层次上看起来如下:
public void TranscodeVideo()
{
// Extract
MediaTrack[] tracks = ExtractTracks(InputPath);
// Decode
MediaTrack videoTrack = tracks.Where(o => o.IsVideo).FirstOrDefault();
MediaTrack rawVideoTrack = DecodeTrack(videoTrack);
// Edit?
// ResizeVideoTrack(rawVideoTrack);
// Encode
MediaFormat newFormat = MediaHelper.CreateVideoOutputFormat(videoTrack.Format);
MediaTrack encodeVideodTrack = EncodeTrack(rawVideoTrack , newFormat);
// Muxe
encodeVideodTrack.Index = videoTrack.Index;
tracks[Array.IndexOf(tracks, videoTrack)] = encodeVideodTrack;
MuxeTracks(OutputPath, tracks);
}
提取工作正常,返回仅包含音频的轨道和仅包含视频的轨道。 Muxing 再次结合之前的两个轨道可以很好地工作。解码有效,但我不知道如何检查它,轨道上的原始帧比原始帧重得多,所以我认为它是正确的。
问题
编码器输入缓冲区大小小于原始帧大小,并且还与编码配置格式有关,因此我假设我需要以某种方式调整帧大小但我没有发现任何有用的东西。这点我说得对吗?我错过了什么?调整原始视频帧大小的方法是什么?有什么帮助吗? :S
PD
- 也许您会注意到我使用 C# (Xamarin.Android) 来获得更多乐趣。但底层 API 当然是 Java。
- 我使用的是 ByteBuffers,而不是 Surfaces,因为它看起来更容易。我将是使用表面的下一步,欢迎任何建议。
- 我知道单线程进程的效率非常低,但让它变得简单。下一步是将解码器输出缓冲区连接到编码器输入缓冲区。
- 我浏览了 PhilLab、Grafika 和 Bigflake 示例,但似乎没有什么对我很有用。
- 避免在 Android 上使用 ffmpeg。
感谢大家的宝贵时间。
【问题讨论】:
-
你用过libVLC吗?我刚刚将它集成到我的 RTSP 流媒体应用程序中,它可以处理转码和 vlc 附带的所有爵士乐
-
不,看起来很酷,我会尝试,你能给出一个使用 libVLC 进行转码的快速 C# 示例吗?
标签: java android android-mediacodec