Come posso creare un file video da una serie di immagini/foto su Android? Questo può essere fatto con l'attuale SDK? o ho bisogno di una libreria di codec?Codifica una serie di immagini in un video
risposta
Sono d'accordo con Mark. Tra le librerie C/C++ ci sono ffmpeg here o X264 here. Devo dire che non li ho trovati o che l'NDK di Android è facile da usare, ma probabilmente è perché non so molto di C/C++ e JNI. Se sei interessato a questa rotta, l'app gratuita di RockPlayer per Android include le librerie condivise predefinite di ffmpeg, pronte per l'uso su Android. Sostengono che queste librerie usano solo componenti LGPL ma dovresti accontentarti di questo, immagino. Riguardo a Java, c'è una porta (di sorta) di ffmpeg chiamata, non sorprendentemente, jffmpeg che è possibile accedere a here ma continua a richiamare gran parte del framework ffmpeg esistente, quindi si torna in NDK land. È possibile convertire una serie di immagini in video con Java Media Framework (JMF) ma presenta i seguenti inconvenienti:
- Numero limitato di formati video.
- Non produce video che possono essere riprodotti sulla maggior parte (se non tutti) i telefoni Android, ad es. H264 o MPEG4.
- Il codice JMF ora è piuttosto vecchio, non ha progredito da molto tempo, è gonfio e non ben strutturato, quindi potrebbero esserci ulteriori dipendenze Java che non sono pacchettizzate in Android.
Un'altra opzione che ho visto è Adobe Air, ma è un carico utile di 17 Mb che alcuni utenti si lamentano.
Ci sono molte altre domande qui su Stack Overflow riguardanti ffmpeg e Android NDK.
Buona fortuna con il progetto.
Come posso fare questo con Adobe Air? –
@Ilya_Gazman Spiacente, non ho esperienza con Adobe Air. Ho semplicemente trovato alcuni riferimenti ad esso mentre stavo ricercando questo argomento. –
Capisco. Non faccio niente che sia possibile con loro. Non ho familiarità con nessuna libreria aerea in grado di farlo. –
Non esiste un supporto integrato per questo. Dovresti trovare un codice sorgente Java che faccia ciò che ti serve, o un codice C/C++ che puoi trasformare in una libreria e utilizzare tramite NDK. Oppure, se l'obiettivo finale è che il video sia su un server, caricare le immagini/foto e fare in modo che il server crei il video.
ffmpeg
è il tuo ranger di soccorso. Puoi scaricare la porta FFMPEG per Android. Fare riferimento alla domanda FFmpeg on Android per ulteriori dettagli.
La porta supporta quasi tutto ciò di cui avrete mai bisogno, inclusi i formati: i formati di immagine di input sono GIF, JPG, PNG, BMP ecc. E i formati di output video sono AVI, MP4 (contenitori) con molti codec.
In tutta la mia ricerca non sono riuscito a trovare una porta ffmpeg per Android. Mi è sembrato che dovessi scaricare ffmpeg, eseguire .config su di esso (per il sistema operativo di destinazione e includendo qualsiasi codec che volevi) e poi costruirlo in una libreria condivisa che dovevi poi scrivere un wrapper JNI per effettuare chiamate in esso - Supponendo che tu non abbia avuto errori lungo la strada. Forse saresti abbastanza bravo da condividere un link per il download di questa porta ffmpeg? –
È possibile utilizzare una libreria open source gratuita denominata JCodec (http://jcodec.org) che contiene pure implementazioni java di alcuni formati e codec video popolari, tra cui: H.264 (AVC), MPEG 1/2, Apple ProRes, JPEG, MP4 (ISO BMF), MPEG PS, MPEG TS, Matroska.
È possibile utilizzare la CORRETTO classe inferiore a quello utilizza JCodec basso livello API:
public class SequenceEncoder {
private SeekableByteChannel ch;
private Picture toEncode;
private RgbToYuv420 transform;
private H264Encoder encoder;
private ArrayList<ByteBuffer> spsList;
private ArrayList<ByteBuffer> ppsList;
private CompressedTrack outTrack;
private ByteBuffer _out;
private int frameNo;
private MP4Muxer muxer;
public SequenceEncoder(File out) throws IOException {
this.ch = NIOUtils.writableFileChannel(out);
// Transform to convert between RGB and YUV
transform = new RgbToYuv420(0, 0);
// Muxer that will store the encoded frames
muxer = new MP4Muxer(ch, Brand.MP4);
// Add video track to muxer
outTrack = muxer.addTrackForCompressed(TrackType.VIDEO, 25);
// Allocate a buffer big enough to hold output frames
_out = ByteBuffer.allocate(1920 * 1080 * 6);
// Create an instance of encoder
encoder = new H264Encoder();
// Encoder extra data (SPS, PPS) to be stored in a special place of
// MP4
spsList = new ArrayList<ByteBuffer>();
ppsList = new ArrayList<ByteBuffer>();
}
public void encodeImage(BufferedImage bi) throws IOException {
if (toEncode == null) {
toEncode = Picture.create(bi.getWidth(), bi.getHeight(), ColorSpace.YUV420);
}
// Perform conversion
for (int i = 0; i < 3; i++)
Arrays.fill(toEncode.getData()[i], 0);
transform.transform(AWTUtil.fromBufferedImage(bi), toEncode);
// Encode image into H.264 frame, the result is stored in '_out' buffer
_out.clear();
ByteBuffer result = encoder.encodeFrame(_out, toEncode);
// Based on the frame above form correct MP4 packet
spsList.clear();
ppsList.clear();
H264Utils.encodeMOVPacket(result, spsList, ppsList);
// Add packet to video track
outTrack.addFrame(new MP4Packet(result, frameNo, 25, 1, frameNo, true, null, frameNo, 0));
frameNo++;
}
public void finish() throws IOException {
// Push saved SPS/PPS to a special storage in MP4
outTrack.addSampleEntry(H264Utils.createMOVSampleEntry(spsList, ppsList));
// Write MP4 header and finalize recording
muxer.writeHeader();
NIOUtils.closeQuietly(ch);
}
public static void main(String[] args) throws IOException {
SequenceEncoder encoder = new SequenceEncoder(new File("video.mp4"));
for (int i = 1; i < 100; i++) {
BufferedImage bi = ImageIO.read(new File(String.format("folder/img%08d.png", i)));
encoder.encodeImage(bi);
}
encoder.finish();
}
}
- 1. Creazione video da serie di immagini?
- 2. codifica video al contrario?
- 3. Come si codifica una serie di immagini in H264 usando l'API C x264?
- 4. Crea video da immagini
- 5. Esporta pagine PDF in una serie di immagini in Java
- 6. opzioni di elaborazione immagini/video
- 7. Creazione di gif animate da una serie di immagini jpeg
- 8. Codifica video usando AVAssetWriter - CRASHES
- 9. Come posso creare un film con codifica H.264 da un insieme di immagini in C#?
- 10. Librerie di codifica video per iOS
- 11. Come posso convertire una serie di immagini in un PDF dalla riga di comando su linux?
- 12. Come estrarre le immagini da un video?
- 13. Immagini sfocate su browser Android di serie
- 14. Python: crea un video usando diverse immagini .png
- 15. Librerie di codifica/decodifica video java purissime
- 16. Miscelazione di immagini e video utilizzando AVFoundation
- 17. Java: come posso creare un film da una serie di immagini?
- 18. Come elaborare le immagini di un video, fotogramma per fotogramma in streaming video usando Opencv python
- 19. Trasforma sequenza di immagini in video con trasparenza
- 20. C# Creazione di video MP4 da immagini e file mp3
- 21. Archivia immagini/video in Hadoop HDFS
- 22. Codifica video distribuita - Gearman vs Beanstalkd
- 23. Archiviare le immagini in un database MongoDB
- 24. Come posso convertire un file video (mpeg, ad esempio) in una raccolta di immagini?
- 25. avconv: fare un video da un sottoinsieme sulle immagini
- 26. lento ffmpeg's immagini al secondo durante la creazione di video da immagini
- 27. Come aggiungere una serie di immagini alla vista UIImage in modo programmatico in ios4?
- 28. HTML5 video - riproduzione solo di una parte di un video
- 29. Alternative per la generazione di un feed video da screenshot
- 30. Conversione di un elenco in un dett ad una serie
suggerisco di fare questa domanda in [StackOverflow per Sistemi Multimediali] (http://area51.stackexchange.com/proposals/91149/sistemi multimediali) – Hamed