GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — GitHub - ypresto/android-transcoder: MP4 video transcode using Android MediaCodec API, pure Java (not LGPL nor patent issue!). Supports API >= 18.

BranchesTags
Open more actions menu

Latest commit

 

History

81 Commits
81 Commits

Folders and files

NameName
Last commit message
Last commit date
example
example
 
 
gradle/wrapper
gradle/wrapper
 
 
lib
lib
 
 
script
script
 
 
.gitignore
.gitignore
 
 
CHANGELOG.md
CHANGELOG.md
 
 
LICENSE
LICENSE
 
 
NOTICE
NOTICE
 
 
README.md
README.md
 
 
build.gradle
build.gradle
 
 
gradle.properties
gradle.properties
 
 
gradlew
gradlew
 
 
gradlew.bat
gradlew.bat
 
 
settings.gradle
settings.gradle
 
 

Repository files navigation

android-transcoder

Hardware accelerated transcoder for Android, written in pure Java.

Why?

Android does not offer straight forward way to transcode video.

FFmpeg is the most famous solution for transcoding. But using FFmpeg binary on Android can cause GPL and/or patent issues. Also using native code for Android development can be troublesome because of cross-compiling, architecture compatibility, build time and binary size.

To transcode without any hassle written above, I created this library to provide hardware accelerated transcoding of H.264 (mp4) video without ffmpeg by using MediaCodec.

Requirements

API Level 18 (Android 4.3, JELLY_BEAN_MR2) or later. If your app targets older Android, you should add below line to AndroidManifest.xml:

<!-- Only supports API >= 18 -->
<uses-sdk tools:overrideLibrary="net.ypresto.androidtranscoder" />

Please ensure checking Build.VERSION by your self.

Usage

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    ParcelFileDescriptor parcelFileDescriptor = resolver.openFileDescriptor(data.getData(), "r");
    FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
    MediaTranscoder.Listener listener = new MediaTranscoder.Listener() {
        @Override
        public void onTranscodeProgress(double progress) {
            ...
        }

        @Override
        public void onTranscodeCompleted() {
            startActivity(new Intent(Intent.ACTION_VIEW).setDataAndType(Uri.fromFile(file), "video/mp4"));
            ...
        }

        @Override
        public void onTranscodeFailed(Exception exception) {
            ...
        }
    };
    MediaTranscoder.getInstance().transcodeVideo(fileDescriptor, file.getAbsolutePath(),
            MediaFormatStrategyPresets.createAndroid720pStrategy(), listener); // or createAndroid720pStrategy([your bitrate here])
}

See TranscoderActivity.java in example directory for ready-made transcoder app.

Quick Setup

Gradle

Available from JCenter, which is default repo of gradle script generated by recent android studio.

repositories {
   jcenter()
}
compile 'net.ypresto.androidtranscoder:android-transcoder:0.2.0'

Note (PLEASE READ FIRST)

  • This library raises RuntimeExceptions (like IlleagalStateException) in various situations. Please catch it and provide alternate logics. I know this is bad design according to Effective Java; just is TODO.
  • Currently this library does not generate streaming-aware mp4 file. Use qtfaststart-java to place moov atom at beginning of file.
  • Android does not gurantees that all devices have bug-free codecs/accelerators for your codec parameters (especially, resolution). Refer supported media formats for parameters guaranteed by CTS.
  • This library does not support video files recorded by other device like digital cameras, iOS (mov files, including non-baseline profile h.264), etc.

More information about internals

Seungwon Lee created awesome slide which describes this (and derived) library. https://speakerdeck.com/line_devday2019/looking-for-a-silver-bullet-to-edit-videos-on-android

Also there is a blog post about this library written in Japanese. While it is Japanese, diagrams would be useful for understanding internals of this library. http://qiita.com/yuya_presto/items/d48e29c89109b746d000

References for Android Low-Level Media APIs

  • http://bigflake.com/mediacodec/
  • https://github.com/google/grafika
  • https://android.googlesource.com/platform/frameworks/av/+/lollipop-release/media/libstagefright

License

Copyright (C) 2014-2016 Yuya Tanaka

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

MP4 video transcode using Android MediaCodec API, pure Java (not LGPL nor patent issue!). Supports API >= 18.

Resources

Readme
Apache-2.0 license
Activity

Stars

855 stars

Watchers

53 watching

Forks

240 forks
Report repository

Releases

Packages

Used by

Contributors

Languages

You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.