日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

gif android. 耗资源,Android MP4转GIF

發(fā)布時(shí)間:2025/4/5 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gif android. 耗资源,Android MP4转GIF 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

[Java] 純文本查看 復(fù)制代碼/**

* [url=home.php?mod=space&uid=952169]@Param[/url] gifPath gif圖片的存儲(chǔ)路徑

* @param begin 開始時(shí)間

* @param end 結(jié)束時(shí)間

* @param fps

* @param speed

* @param gifWidth gif的導(dǎo)出寬度

* @param gifHeight gif的導(dǎo)出長(zhǎng)度

* @param videoState 視頻是橫屏還是豎屏的

* @param needRoate 是否需要旋轉(zhuǎn)

* @param rotateAngle 旋轉(zhuǎn)角度

*/

public void encoder(final String gifPath, final long begin, final long end, final int fps,

final int speed, final int gifWidth, final int gifHeight, final int videoState, final boolean needRoate, final int rotateAngle) {

if (begin > duration) {

// throw new RuntimeException("開始時(shí)間不能大于視頻時(shí)長(zhǎng)");

callBack.erroCallBack("開始時(shí)間不能大于視頻時(shí)長(zhǎng)");

return;

}

if (end <= begin) {

// throw new RuntimeException("開始時(shí)間大于結(jié)束時(shí)間");

callBack.erroCallBack("開始時(shí)間大于結(jié)束時(shí)間");

return;

}

Thread thread = new Thread() {

@Override

public void run() {

super.run();

long endTime = duration;

if (end < duration) {

endTime = end;

}

long time1 = System.currentTimeMillis();

videoExtractor.seekTo(begin * 1000, trackIndex); // 精確定位到指定幀(定位到指定開始時(shí)間幀)

FastYUVtoRGB fastYUVtoRGB = new FastYUVtoRGB(context);

String mime = format.getString(MediaFormat.KEY_MIME);

MediaCodec videoDecoder = null;

try {

videoDecoder = MediaCodec.createDecoderByType(mime);

} catch (IOException e) {

e.printStackTrace();

}

format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible);

int width = format.getInteger(MediaFormat.KEY_WIDTH);

int height = format.getInteger(MediaFormat.KEY_HEIGHT);

videoDecoder.configure(format, null, null, 0);

videoDecoder.start();

GIFEncoder encoder = null;

MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();

int f = fps;

if (f <= 0) {

f = 15;

}

int s = speed;

if (s <= 0) {

s = f;

}

long frameTime = 1000 / f;

long startTime = begin;

while (true) {

int run = extractorVideoInputBuffer(videoExtractor, videoDecoder);

if (run == 1) {

int outIndex = videoDecoder.dequeueOutputBuffer(info, 500000);

if (outIndex >= 0) {

long time = info.presentationTimeUs / 1000;

if (time >= begin && time <= endTime) {

if (time >= startTime) {

Image image = videoDecoder.getOutputImage(outIndex); // 輸出

Bitmap bitmap = fastYUVtoRGB.convertYUVtoRGB(getDataFromImage(image), width, height);

int videoImageState = MImageUtil.getPicDirection(image.getHeight(), image.getWidth());

if (needRoate) { // 是否需要旋轉(zhuǎn),解決自動(dòng)旋轉(zhuǎn)錯(cuò)誤的問題

bitmap = PhotoBitmapUtils.rotateBitmap(bitmap, rotateAngle);

} else {

// LogUtil.i("視頻導(dǎo)出圖片:" + videoImageState);

// LogUtil.i("原視頻圖片:" + videoState);

if (videoImageState != videoState) { // 橫豎屏不一致,默認(rèn)自動(dòng)旋轉(zhuǎn)90°

bitmap = PhotoBitmapUtils.rotateBitmap(bitmap, 90);

}

}

if (gifWidth != -1 && gifHeight != -1) { // 創(chuàng)建新的位圖

bitmap = Bitmap.createScaledBitmap(bitmap, gifWidth, gifHeight, true);

} else {

bitmap = Bitmap.createScaledBitmap(bitmap, width / 4, height / 4, true);

}

if (encoder == null) {

encoder = new GIFEncoder();

encoder.setFrameRate(s);

encoder.init(bitmap);

encoder.start(gifPath);

} else {

encoder.addFrame(bitmap);

}

int p = (int) ((startTime - begin) * 100 / (endTime - begin));

LogUtil.d("p = " + p);//進(jìn)度

if (callBack != null) {

callBack.currentProgress(p);

}

startTime += frameTime;

}

}

videoDecoder.releaseOutputBuffer(outIndex, true /* Surface init */);

if (time >= endTime) {

break;

}

}

} else if (run == -1) {

break;

}

}

if (encoder != null) {

encoder.finish();

}

LogUtil.d("encoder->time = " + (System.currentTimeMillis() - time1));

LogUtil.d("over");

LogUtil.d("gif_path:" + gifPath);

if (callBack != null) {

callBack.onSuccess(System.currentTimeMillis() - time1, gifPath);

}

videoDecoder.stop();

videoDecoder.release();

MFileUtil.clearAllCache(context); // 清除緩存

}

};

thread.start();

}

總結(jié)

以上是生活随笔為你收集整理的gif android. 耗资源,Android MP4转GIF的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。