I have a remuxing.c example working from ffmpeg but I need to change resolution to minimize file size, anybody can explain me how to do that? Or if there is another way to "compress" mp4 files without command line? I'm a begginer with FFmpeg and need to send video files from android to server, and I'm deploying a NDK library to make this job because FFmpeg command-line implementation have some limitations and is very slow.
Thanks
You should take a look at the filtering video and the transcoding examples. The first one goes through how you add "filters" in ffmpeg. It includes a scaling filter, which will rescale the video to a given resolution. Transcoding includes some filtering, and you can actually change the filter_spec string to be whatever you want, and the program should scale your input video.
This is probably not the best solution, I just found it myself, but it at least introduces you to the components being used.
Related
I am trying to create a video from series of images in android.
I have come across these three options MediaCodec, ffmpeg using ndk and jcodec. Can someone let me know which one of them is best and easiest. I didn't find any proper documentation so can somebody please post their working example?
If you are talking about API 4.3+ in general you need to get input surface from encoder, copy image to the texture that comes along with the surface, put correct timestamp and send it back to encoder. and do it
fps (frames per second) * resulted video duration in seconds
times. encoder bitstream after encoder should go to the muxer, so finally you will get mp4 file.
It requires rather much coding:)
I suggest you to try free Intel Media Pack: https://software.intel.com/en-us/articles/intel-inde-media-pack-for-android-tutorials
It has a sample - JpegSubstituteEffect, it allows to create videos from images. The idea is to take a dummy video (black video and quiet audio) and to substitute all black frame by coping images. It could be easily enhanced to creating a video from series of images. I know a couple of applications in Google Play making the same using Media Pack
I tried JCodec 1.7 for Android. This is very simple compared to the other two options and works. There is class SequenceEncoder in the android package that accepts Bitmap instances and encodes them in to video. I ended up cloning this class into my app to override some of the settings e.g. fps. Problem with JCodec is that performance is dismal - encoding single 720x480 pixels frame takes just about 45 seconds. I wanted to do timelapse videos possibly at fullHD and was initially thinking any encoder will do as I was not expecting encoding a frame to take more than a second (minimal interval between frames in my app is 3 seconds). As you can guess with 45 seconds per frame JCodec is not a fit.
I am monitoring your question for other answers that may be helpful.
The MediaCodec/MediaMuxer way seems ok but it is insanely complex. I need to learn quite a bit about OpenGL ES, video formats and some Android voodoo to get this going. Ohh and this only works on the latest crop of phones 4.3+. This is real shame for Google with all of their claims to fame. I found some Stackoverflow discussions on the topic. Two sub-paths exist - the OpenGL way is device independent. There is another way which involves transcoding your RGB Bitmap data to YUV. the catch with YUV is that there are 3 flavours of it depending on the device HW - planar, semi planar and semi planar compressed (I am not sure if a 4th way is not coming in the future so...).
Here are couple useful links on the OpenGL way
CTS test - https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts/ExtractDecodeEditEncodeMuxTest.java
Many CTS like tests - http://bigflake.com/mediacodec/#EncodeDecodeTest
Two of them seem to be relevant and useful
EncodeAndMuxTest - http://bigflake.com/mediacodec/EncodeAndMuxTest.java.txt
CameraToMpegTest - http://bigflake.com/mediacodec/CameraToMpegTest.java.txt (I believe this to be closest to what I need, just need to understand all the OpenGL voodoo and get my Bitmap in as texture filling up the entire frame i.e. projections, cameras and what not comes into play)
ffmpeg route does not seem direct enough too. Something in C++ accepting stuff from Java...I guess some weird conversions of the Bitmap to byte[]/ByteBuffer will be first needed - cpu intensive and slow. I actually have JPEG byte[] but am not sure this will come handy to the ffmpeg library. I am not sure if ffmpeg is taking leverage of the GPU or other HW acceleration so it may well end up at 10 seconds per frame and literally baking the phone.
FFmpeg can implement this task. You first need compile ffmpeg library in Android (refer to this article "How to use Vitamio with your own FFmpeg build")
You could refer the samples in FFmpeg to figure out how to implement your task.
In Android implement your task in C++; then use JNI to integrate the C++ code into your Android app.
I want to create live painting video as export feature for a painting application.
I can create a video with a series of images, with the use of a library ( FFMPEG or MediaCodec). But, this would require too much processing power to compare the images and encode the video.
While drawing, I know exactly which pixels are changed. So, I can save lot of processing if I can pass this info to FFMPEG, instead of having the FFMPEG figure this out from the images.
Is there away to efficiently encode the video for this purpose ?
It should not require "too much processing power" for MediaCodec. Because, for example, device is capable to write video in real time, some of them write full HD video.There's another thing : each MediaCodec's encoder requires pixel data in specific format, you should query API for supported capabilities before using the API. Also it will be tricky to make your app work on all devices with MediaCodec if your app produces only one pixel format, because probably not all of devices will support it(another words: different vendors have different MediaCodec implementation).
I want to decode and display h264 frame over my screen. Now all I wanted to do is to use omx codec to decode my frames as it decodes in hardware which helps achieve fps for high resolutions. Till now all I come to know is there are different way to access hardware decoder. I come across some names like stagefright, omxcodec, openmax. All are these are different things. I want to decode frame by frame. and upto my knowledge android libraries accept only file path or url of media. But here my requirement is different. I need to decode frame by frame. So can someone tell me where can I start digging? I come to know that in latest version of android, they have published api to decode. But I want to support all version of android. So any suggestion or guidance will be great.
Thanks.
You are right, indeed at the top level libstagefright library has a "stream" interface.
That is, you create audio- or video-source, configure codecs, and then start the process of encoding or decoding.
However, using an interface OMXCodec you can obtain access to the individual frames.
Unfortunately, I do not know any source of official OMXCodec documentations.
The only source - these are examples of the code in the Android repository.
If you want to know more about how to use OMXCodec, you can view the AwesomePlayer.cpp file
(http://gitorious.org/rowboat/frameworks-base/blobs/rowboat-ics/media/libstagefright/AwesomePlayer.cpp)
Using the library libstagefright is clear from the StagefrightRecorder.cpp (in the same repository)
Also useful information about the OMXCodec architecture is
here
P.S. Remember that the OMXCodec API not stable and may vary from version to version...
We have 100s of flash files in our site. Multiple swf files uses AS3 and xml files for flash movies .
We have converted .fla files to HTML5 using createJS.
We are getting following errors for some of flash files during export to HTML5 and not converting.
an unexpected error occurred during export. (JSK)
Converted html5 files are not working same as flash.
Our approach was
to covert the flash file in to HTML5 using tools
Editing the coverted code and use the help of java script library, try to make it as working like flash.
We are struck with this approach because we are not getting proper html5 code for the most of files.
We had chosen createJS (conversion tool) because the converted code is readable.
Below are my doubts
Is our approach correct?
We are targeting high resolution android tablets. So while doing it, do we need to take
care any import things like screen resolution , scaling etc ?
Is there is any other workaround solution to convert flash site to android tablet compatible?
Note : We have tried swiffy but swiffy does not support AS3 and converted code is not readable too!
The CreateJS tool can help you convert your flash assets and scripts to HTML5 with javascript, but you will almost always have little issues to handle on a case-by-case basis. Especially if you have lots of actionscript, complex animations within animations, or audio and video players, you will have to rewrite some of your code.
Also, CreateJS does not automatically make your animation responsive to different screen sizes or create retina assets.
CreateJS works best if you know beforehand that your flash animation will be converted to HTML5. Then you can take into account the things that work, and those that won't.
While developing an Android app what format of sound/image should i should be using so that i can control the overall size of the app after completion.
here is a link to all the media types supported by Android.
For sound I would probably use a low-bitrate .mp3 or a .midi and for images either a compressed .jpg or .gif
For supported media formats see this.
For images you'll probably end up with JPG or PNG (if you need transparency). You should also scrape the images to remove all unnecessary meta data etc. For linux, a nice tool for this is Trimage.
Take a look at Supported Media Formats.
My choice would be:
Images: go with JPG for compression or PNG for quality and transparency support.
Audio: go with MP3-VBR (variable bit rate) for compression and quality.
The size of your file will be greatly affected by compression level. At some point, if you compress too much you will see/hear artifacts. The acceptable level of compression is subjective and really depends on the input data (image or audio). You should be testing different levels of compression to see what works.