Ich versuche, den Bildschirm mit MediaProjection API aufzuzeichnen. Ich möchte das Video schneiden, das von der Medienprojektion aufgenommen wurde. Gibt es eine Möglichkeit, dies zu tun, ohne eine Abhängigkeit von Dritten zu verwenden?So trimmen Sie Video mit MediaCodec
0
A
Antwort
1
Nach vielen Graben, fand ich diesen Schnipsel
/**
* @param srcPath the path of source video file.
* @param dstPath the path of destination video file.
* @param startMs starting time in milliseconds for trimming. Set to
* negative if starting from beginning.
* @param endMs end time for trimming in milliseconds. Set to negative if
* no trimming at the end.
* @param useAudio true if keep the audio track from the source.
* @param useVideo true if keep the video track from the source.
* @throws IOException
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static void genVideoUsingMuxer(String srcPath, String dstPath,
int startMs, int endMs, boolean useAudio, boolean
useVideo)
throws IOException {
// Set up MediaExtractor to read from the source.
MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource(srcPath);
int trackCount = extractor.getTrackCount();
// Set up MediaMuxer for the destination.
MediaMuxer muxer;
muxer = new MediaMuxer(dstPath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
// Set up the tracks and retrieve the max buffer size for selected
// tracks.
HashMap<Integer, Integer> indexMap = new HashMap<>(trackCount);
int bufferSize = -1;
for (int i = 0; i < trackCount; i++) {
MediaFormat format = extractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
boolean selectCurrentTrack = false;
if (mime.startsWith("audio/") && useAudio) {
selectCurrentTrack = true;
} else if (mime.startsWith("video/") && useVideo) {
selectCurrentTrack = true;
}
if (selectCurrentTrack) {
extractor.selectTrack(i);
int dstIndex = muxer.addTrack(format);
indexMap.put(i, dstIndex);
if (format.containsKey(MediaFormat.KEY_MAX_INPUT_SIZE)) {
int newSize = format.getInteger(MediaFormat.KEY_MAX_INPUT_SIZE);
bufferSize = newSize > bufferSize ? newSize : bufferSize;
}
}
}
if (bufferSize < 0) {
bufferSize = DEFAULT_BUFFER_SIZE;
}
// Set up the orientation and starting time for extractor.
MediaMetadataRetriever retrieverSrc = new MediaMetadataRetriever();
retrieverSrc.setDataSource(srcPath);
String degreesString = retrieverSrc.extractMetadata(
MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION);
if (degreesString != null) {
int degrees = Integer.parseInt(degreesString);
if (degrees >= 0) {
muxer.setOrientationHint(degrees);
}
}
if (startMs > 0) {
extractor.seekTo(startMs * 1000, MediaExtractor.SEEK_TO_CLOSEST_SYNC);
}
// Copy the samples from MediaExtractor to MediaMuxer. We will loop
// for copying each sample and stop when we get to the end of the source
// file or exceed the end time of the trimming.
int offset = 0;
int trackIndex = -1;
ByteBuffer dstBuf = ByteBuffer.allocate(bufferSize);
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
try {
muxer.start();
while (true) {
bufferInfo.offset = offset;
bufferInfo.size = extractor.readSampleData(dstBuf, offset);
if (bufferInfo.size < 0) {
InstabugSDKLogger.d(TAG, "Saw input EOS.");
bufferInfo.size = 0;
break;
} else {
bufferInfo.presentationTimeUs = extractor.getSampleTime();
if (endMs > 0 && bufferInfo.presentationTimeUs > (endMs * 1000)) {
InstabugSDKLogger.d(TAG, "The current sample is over the trim end time.");
break;
} else {
bufferInfo.flags = extractor.getSampleFlags();
trackIndex = extractor.getSampleTrackIndex();
muxer.writeSampleData(indexMap.get(trackIndex), dstBuf,
bufferInfo);
extractor.advance();
}
}
}
muxer.stop();
//deleting the old file
File file = new File(srcPath);
file.delete();
} catch (IllegalStateException e) {
// Swallow the exception due to malformed source.
InstabugSDKLogger.w(TAG, "The source video file is malformed");
} finally {
muxer.release();
}
return;
}
+0
Basiert auf diesem Schnipsel, trimmt es nur zum Schlüsselrahmen, nicht wahr? Können wir dem Muxer irgendwelche Beispieldaten nach dem Schlüsselbild geben, damit er von jedem B-Bild starten kann? –
Verwandte Themen
- 1. Kürzen Video mit MediaCodec
- 2. UIImagePickerController mit Kameraquelle: Video-Trimmen funktioniert nicht
- 3. So transcodieren Sie ein Video mit dem MediaCodec api für Android 4.3+
- 4. Android MediaCodec API Video spielt zu schnell
- 5. Android: Beschneiden Video während der Aufnahme mit MediaCodec und MediaMuxer
- 6. Wie bearbeiten (trimmen) Sie ein Video im Browser?
- 7. So trimmen Sie ein Bild in Javascript
- 8. So extrahieren Sie PCM-Samples vom Ausgang des MediaCodec-Decoders
- 9. MediaCodec createInputSurface
- 10. FFmpeg: Video trimmen und Wasserzeichen mit mehreren Text hinzufügen
- 11. MediaCodec gleichzeitige Codierung und Decodierung
- 12. DirectShow - So überlagern Sie Video mit Text
- 13. So kürzen Sie das Video mit AVFoundation
- 14. So erstellen Sie Video-Streaming mit C#
- 15. So drehen Sie ein Video mit OpenCV
- 16. Transcode h264 Video von MediaCodec direkt ohne Textur Render
- 17. Wie Trimmen mit Entity Framework zu trimmen?
- 18. Trimmen Sie alle Datenbankfelder
- 19. Mehrere MediaCodec-Instanzen
- 20. MediaCodec Dekodierzeitberechnung
- 21. android mediacodec kodieren drop frame
- 22. MediaCodec mit Oberflächeneingabe: Aufnahme im Hintergrund
- 23. Videokomprimierung auf Android mit neuer MediaCodec-Bibliothek
- 24. Android MediaCodec AAC Encoder
- 25. mediacodec vs mediaplayer und mediarecorder
- 26. Crop Video vor dem Kodieren mit MediaCodec für Grafika's "Continuous Capture" -Aktivität
- 27. Swift 3: So exportieren Sie Video mit Text mit AVVideoComposition
- 28. So kombinieren Sie Text mit Video mit AVFoundation.framework
- 29. So speichern Sie Video in einer Video-Webanwendung
- 30. ffmpeg - mux Video und Audio und Trimmen des Audios
haben Sie eine Lösung zu finden? –
Nicht sicher, was die Ausgabe einer MediaProjection-Sitzung ist, aber MediaCodec ist der Weg zu gehen. Die Reise beginnt hier: https://stackoverflow.com/questions/20468211/use-mediacodec-and-mediaextract-to-decode-and-code-video –
@martynmlostekk ja, ich fand eine. Ich poste es als Antwort – vezikon