【问题标题】:I want to attach Pre-Rolls to videos taken on android devices我想将 Pre-Rolls 附加到在 Android 设备上拍摄的视频中
【发布时间】:2018-10-25 17:39:58
【问题描述】:

我正在使用 mp4parser,视频需要是同一类型的。 我正在考虑使用 android 的媒体编解码器对预卷视频进行解码和编码,以适应相机的相同编码输出(正面和背面) 关于如何做到这一点的任何建议(如何获得特定的设备编码参数)?

【问题讨论】:

  • 您想了解编解码器的功能吗?
  • 好吧,我想要一个神奇的 android 库,它可以检测 android 的相机默认视频编码(帧率、比特率、编解码器等)解码我的自定义前贴片视频并使用设备的编解码器功能对其进行编码,以便我可以合并它使用m4parser(你只能合并相同类型的文件)。

标签: android video android-mediacodec mp4parser


【解决方案1】:

如果您想了解您的 Android 相机使用的是什么编码,请尝试使用以下代码:https://developer.android.com/reference/android/media/CamcorderProfile

这应该足以回答您检测视频编码的问题,包括:文件输出格式、视频编解码器格式、视频比特率(以比特/秒为单位)、视频帧速率(以帧/秒为单位)、视频帧宽度和高度、音频编解码器格式,音频比特率(比特/秒),音频采样率 用于录制的音频通道数。

也从这里提取了很多上述信息:https://developer.android.com/guide/topics/media/camera#capture-video

至于转码已经在用户目录中的视频,我发现了这个有用的转码器,它是使用 Android MediaCodec API 用纯 java 编写的,可以在这里找到:https://github.com/ypresto/android-transcoder

此外,正如下面提到的 rupps,您可以使用 ffmeg,它已被证明可以在 Android 上运行无数次。但是,我首先链接另一个转码器的原因是,正如作者所说,“FFmpeg 是最著名的转码解决方案。但在 Android 上使用 FFmpeg 二进制文件可能会导致 GPL 和/或专利问题。同时使用 Android 的本机代码由于交叉编译、架构兼容性、构建时间和二进制大小,开发可能会很麻烦。”因此,请使用您认为更适合您的任何一个。这是适用于 Android 的 ffmeg 的链接: https://github.com/WritingMinds/ffmpeg-android

如果您不想使用其他人制作的转码器,那么我建议您使用可以在此处找到的 MediaCodec API 制作您自己的转码器:https://developer.android.com/reference/android/media/MediaCodec

【讨论】:

  • 也看看Android ffmpeg。 github.com/WritingMinds/ffmpeg-androidgithub.com/WritingMinds/ffmpeg-android-java ... ffmpeg 是一个命令行 Unix 实用程序,可以转码为几乎任何格式。您可以从您的应用中启动它。
  • @rupps 是的! ffmpeg 是一个非常受欢迎的选择。我刚刚决定添加这个人的转码器,因为正如他在自述文件中所说,“FFmpeg 是最著名的转码解决方案。但是在 Android 上使用 FFmpeg 二进制文件可能会导致 GPL 和/或专利问题。也可以使用原生代码进行 Android 开发由于交叉编译、架构兼容性、构建时间和二进制大小而很麻烦。”所以我只是添加了另一个选项。感谢您的意见!
  • 哦,对不起,我没看……非常正确,二进制文件太大了,我还在决定是否要包括这额外的 25Mb 来进行转码。
  • @rupps 好点,它可能有点重。不过,我不会花太多时间来寻找更好的解决方案,只是将您的大小从 25Mb 减小。我想如果你自己尝试一下,你会遇到很多麻烦,因为转码绝对是一种痛苦。
  • @MKVimalan 这正是我推荐 ypresto 编写的使用 MediaCodec API 的 Android 转码器的原因
【解决方案2】:

如果你想要魔法,试试这个库。

https://github.com/INDExOS/media-for-mobile/

看看 MediaComposer 类。

这里还有一段代码 sn-p 说明它是如何完成的。

org.m4m.MediaComposer mediaComposer = new org.m4m.MediaComposer(factory, progressListener);

mediaComposer.addSourceFile(mediaUri1);
int orientation = mediaFileInfo.getRotation();

mediaComposer.setTargetFile(dstMediaPath, orientation);

// set video encoder
VideoFormatAndroid videoFormat = new VideoFormatAndroid(videoMimeType, width, height);
videoFormat.setVideoBitRateInKBytes(videoBitRateInKBytes);
videoFormat.setVideoFrameRate(videoFrameRate);
videoFormat.setVideoIFrameInterval(videoIFrameInterval);
mediaComposer.setTargetVideoFormat(videoFormat);

// set audio encoder
AudioFormatAndroid aFormat = new AudioFormatAndroid(audioMimeType, audioFormat.getAudioSampleRateInHz(), audioFormat.getAudioChannelCount());
aFormat.setAudioBitrateInBytes(audioBitRate);
aFormat.setAudioProfile(MediaCodecInfo.CodecProfileLevel.AACObjectLC);
mediaComposer.setTargetAudioFormat(aFormat);

mediaComposer.setTargetFile(dstMediaPath, orientation);
mediaComposer.start();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    相关资源
    最近更新 更多