Androidで一連の画像/写真からビデオファイルを作成するにはどうすればよいですか?これは現在のSDKで実行できますか?またはコーデックライブラリが必要ですか?
マークに同意します。 C/C++ライブラリには、ffmpeg here またはX264 here があります。私はそれらを見つけられなかったか、Android使いやすいNDKですが、C/C++とJNIについてよく知らないためと思われます。このルート、そしてAndroid=のRockPlayer無料アプリには、ffmpegからのビルド済み共有ライブラリがあり、Androidですぐに使用できます。これらのライブラリはLGPLコンポーネントのみを使用すると主張しますが、満足する必要があります。これについては、私は推測します。Javaに関しては、当然のことながら、ffmpegの(ある種の)ポートがあり、jffmpegにアクセスできます here にアクセスできますが、既存のffmpegフレームワークの多くを呼び出しますJava Media Framework(JMF))を使用して一連の画像をビデオに変換することは可能ですが、次の欠点があります。
私が見たもう1つのオプションはAdobe Airですが、これは17Mbのペイロードであり、一部のユーザーは不満を述べています。
Stack Overflowには、ffmpegとAndroid NDK。
プロジェクトで頑張ってください。
これに対する組み込みサポートはありません。 Java必要な機能を実行するソースコード、またはライブラリに変換してNDK経由で使用できるC/C++コードを見つける必要があります。または、最終目標がビデオをサーバーに配置するには、画像/写真をアップロードし、サーバーにビデオを作成させます。
ffmpeg
はレスキューレンジャーです。 Android用のFFMPEGポートをダウンロードできます。詳細については、質問 AndroidのFFmpeg を参照してください。
ポートは、フォーマット-入力画像フォーマットがGIF、JPG、PNG、BMPなど)と出力ビデオフォーマットがAVI、MP4(コンテナ)を含む、これまでに必要なほぼすべてのものをサポートします。多くのコーデック。
JCodec( http://jcodec.org )と呼ばれる無料のオープンソースライブラリを使用できます。これには、純粋なJavaの実装が含まれます)。 H.264(AVC)、MPEG 1/2、Apple ProRes、JPEG、MP4(ISO BMF)、MPEG PS、MPEG TS、Matroska。
JCodec低レベル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();
}
}