I want to play some animtaions (actually, gifs) which were previously encoded (with h264 codec) and downloaded from network as mp4 files (because mp4 files are much smaller than corresponding gifs). So, on a device I want to decode mp4 and get all the frames to create animations. And the question - what is the best way to decode mp4 to accomplish my task?
Related
I have found a solution for resampling an .mp4 video taken with the camera on the device to make it smaller (resizing by resolution, bitrate, and framerate). The problem is, it doesn't carry the audio over.
I have looked at several different options for trying to get the audio out of my source (large) mp4 and push it into my smaller mp4 and I can't not seem to get any of these procedures to work correctly.
I've tried the following:
1) extracting the PCM audio from the source using: How do I extractor audio to mp3 from mp4 using java in Android?
2) converting the PCM to M4A and then adding the M4A to the smaller MP4 using: https://github.com/tqnst/MP4ParserMergeAudioVideo/blob/master/Mp4ParserSample-master/src/jp/classmethod/sample/mp4parser/MainActivity.java
that's the method I got closest with but the audio was really slow and didn't match up at all with the video in the smaller mp4.
I also tried a "direct copy" from one mp4 to the other with a variation of this: Concatenate multiple mp4 audio files using android´s MediaMuxer
that made my smaller mp4 actually larger (in file size) than my source mp4 and it didn't actually move the sound over.
The android documentation for MediaMuxer is pretty terrible and I can't make heads or tails of what I need to do to get this to work. It seems like it should be a pretty trivial task....
any suggestions or advice would be greatly appreciated.
TIA
I ended up just using ffmpeg with this solution:
https://github.com/WritingMinds/ffmpeg-android-java
I have a working app that streams video to Chromecast(using nannoHttpd) and everything is working fine. Now my problem is: videos recorded using new devices are too large in size to stream, so I want to re-encode videos to some lower bitrate.
I tried ffmpeg but the results are not satisfactory and it will increase the apk size by 14 MB.
Now I am trying the MediaCodec api. It is faster than ffmpeg, but it takes the input file and writes it to the output file and I want to re-encode byte data that is to be served by nannohttpd.
Now a solution comes to my mind, that is to transcode the video and stream the output file but its has two drawbacks;
What if the file is too large and the user doesn't see the whole video? Much of CPU, battery resource is wasted.
What if the user fast forwards a long video to a time which is not re-encoded yet?
1 MediaCodec just do one thing decode encode! and you will get raw bytes of new encoded data. So it is up to the programmer to choose to either dump that into a container (.mp4 file) using a muxer. So no need here to rewrite everything back into a file.
2 Seek to the proper chunk of data and restart MediaCodec.
I am creating a video streaming app which uses a IP Camera as external device.
I can already get the image (.cgi format) from the ip url of the device(192.168.x.x/image/image.cgi). I can update the image view every several milli seconds to update its content and its working great, no issues there.
The question is, can I save this bitmaps as video (.mp4)? I tried MediaRecorder before and works, is there a way to do that on streaming bitmaps ?
thanks
The "video" is a stream of jpeg images.
See
http://thistleshrub.net/Joomla/index.php?option=com_content&view=article&id=115:displaying-streamed-mjpeg-in-java&catid=43:robotics&Itemid=64
for some java code that displays such images. You need to transcode the images to a different format. E.g. on the command line that can be done with
https://unix.stackexchange.com/questions/12193/transcoding-mjpeg-stream-to-flv-or-mp4
Doing this on android has been discussed at how to save the mjpeg stream as 3gp or mp4 format video files to the sdcard in android
googling for mjpegstream video convert gives you more results ...
I'm trying to implement a Video Compressor in android using the Media Codec API,
I've successfully decoded a file into raw format and encoded it & getting different encoded tracks (Video, and Audio's ). How to store these files into a container format? Is there any in built functions available to do the same.
How to synchronize the audio, video and subtitles files ?
Android 4.3 (API 18) added the MediaMuxer class. This allows you to convert the raw H.264 video stream to a .mp4 file, optionally merging an audio stream in.
Each frame of data is submitted with a presentation time stamp.
Is there anything that does the opposite of a MediaExtractor on android?
Take one or multiple streams from MediaCodecs (e.g. 1 video and 1 audio)
and package them in a container format for streaming or writing to files?
Looks like the answer is no.
Mostly because of the underlying API is designed for video streaming and not for video compression.
Writing encoder's output to file you'll get raw h264 file. Which can be played using mplayer or ffplay for example.
Also ffmpeg can be used to mux this raw file into some container. But first of all you need to build ffmpeg for android.