Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Periksa kodenya
Di bagian ini, Anda memeriksa pustaka Java dan kode uji, dan mempelajari cara menggunakan alat dari perpustakaan dalam kode Anda sendiri.
Pustaka parser aliran video Kinesis berisi alat berikut:
StreamingMkvReader
Kelas ini membaca elemen MKV tertentu dari aliran dengan cara non-pemblokiran.
Contoh kode berikut (dariFragmentMetadataVisitorTest) menunjukkan cara membuat dan menggunakan a Streaming MkvReader untuk mengambil MkvElement objek dari aliran input yang disebutinputStream:
StreamingMkvReader mkvStreamReader = StreamingMkvReader.createDefault(new InputStreamParserByteSource(inputStream)); while (mkvStreamReader.mightHaveNext()) { Optional<MkvElement> mkvElement = mkvStreamReader.nextIfAvailable(); if (mkvElement.isPresent()) { mkvElement.get().accept(fragmentVisitor); ... } } }
FragmentMetadataVisitor
Kelas ini mengambil metadata untuk fragmen (elemen media) dan melacak aliran data individual yang berisi informasi media, seperti data pribadi codec, lebar piksel, atau tinggi piksel.
Contoh kode berikut (dari FragmentMetadataVisitorTest file) menunjukkan cara menggunakan FragmentMetadataVisitor untuk mengambil data dari MkvElement objek:
FragmentMetadataVisitor fragmentVisitor = FragmentMetadataVisitor.create(); StreamingMkvReader mkvStreamReader = StreamingMkvReader.createDefault(new InputStreamParserByteSource(in)); int segmentCount = 0; while(mkvStreamReader.mightHaveNext()) { Optional<MkvElement> mkvElement = mkvStreamReader.nextIfAvailable(); if (mkvElement.isPresent()) { mkvElement.get().accept(fragmentVisitor); if (MkvTypeInfos.SIMPLEBLOCK.equals(mkvElement.get().getElementMetaData().getTypeInfo())) { MkvDataElement dataElement = (MkvDataElement) mkvElement.get(); Frame frame = ((MkvValue<Frame>)dataElement.getValueCopy()).getVal(); MkvTrackMetadata trackMetadata = fragmentVisitor.getMkvTrackMetadata(frame.getTrackNumber()); assertTrackAndFragmentInfo(fragmentVisitor, frame, trackMetadata); } if (MkvTypeInfos.SEGMENT.equals(mkvElement.get().getElementMetaData().getTypeInfo())) { if (mkvElement.get() instanceof MkvEndMasterElement) { if (segmentCount < continuationTokens.size()) { Optional<String> continuationToken = fragmentVisitor.getContinuationToken(); Assert.assertTrue(continuationToken.isPresent()); Assert.assertEquals(continuationTokens.get(segmentCount), continuationToken.get()); } segmentCount++; } } } }
Contoh sebelumnya menunjukkan pola pengkodean berikut:
-
Buat a
FragmentMetadataVisitoruntuk mengurai data, dan a StreamingMkvReader untuk menyediakan data. -
Untuk masing-masing
MkvElementdalam aliran, uji apakah metadatanya bertipeSIMPLEBLOCK. -
Jika ya, ambil
MkvDataElementdariMkvElement. -
Ambil
Frame(data media) dariMkvDataElement. -
Ambil
MkvTrackMetadatauntukFramedariFragmentMetadataVisitor. -
Ambil dan verifikasi data berikut dari
MkvTrackMetadataobjekFramedan:-
Nomor trek.
-
Tinggi piksel bingkai.
-
Lebar piksel bingkai.
-
ID codec untuk codec yang digunakan untuk menyandikan bingkai.
-
Bahwa bingkai ini tiba secara berurutan. Verifikasi bahwa nomor trek dari frame sebelumnya, jika ada, kurang dari frame saat ini.
-
Untuk digunakan FragmentMetadataVisitor dalam proyek Anda, berikan MkvElement objek ke pengunjung menggunakan accept metode mereka:
mkvElement.get().accept(fragmentVisitor);
OutputSegmentMerger
Kelas ini menggabungkan metadata dari trek yang berbeda dalam aliran ke dalam aliran dengan satu segmen.
Contoh kode berikut (dari FragmentMetadataVisitorTest file) menunjukkan cara menggunakan OutputSegmentMerger untuk menggabungkan metadata trek dari array byte yang disebutinputBytes:
FragmentMetadataVisitor fragmentVisitor = FragmentMetadataVisitor.create(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); OutputSegmentMerger outputSegmentMerger = OutputSegmentMerger.createDefault(outputStream); CompositeMkvElementVisitor compositeVisitor = new TestCompositeVisitor(fragmentVisitor, outputSegmentMerger); final InputStream in = TestResourceUtil.getTestInputStream("output_get_media.mkv"); StreamingMkvReader mkvStreamReader = StreamingMkvReader.createDefault(new InputStreamParserByteSource(in)); while (mkvStreamReader.mightHaveNext()) { Optional<MkvElement> mkvElement = mkvStreamReader.nextIfAvailable(); if (mkvElement.isPresent()) { mkvElement.get().accept(compositeVisitor); if (MkvTypeInfos.SIMPLEBLOCK.equals(mkvElement.get().getElementMetaData().getTypeInfo())) { MkvDataElement dataElement = (MkvDataElement) mkvElement.get(); Frame frame = ((MkvValue<Frame>) dataElement.getValueCopy()).getVal(); Assert.assertTrue(frame.getFrameData().limit() > 0); MkvTrackMetadata trackMetadata = fragmentVisitor.getMkvTrackMetadata(frame.getTrackNumber()); assertTrackAndFragmentInfo(fragmentVisitor, frame, trackMetadata); } }
Contoh sebelumnya menunjukkan pola pengkodean berikut:
-
Buat FragmentMetadataVisitor untuk mengambil metadata dari aliran.
-
Buat aliran keluaran untuk menerima metadata gabungan.
-
Buat
OutputSegmentMerger, meneruskanByteArrayOutputStream. -
Buat
CompositeMkvElementVisitoryang berisi dua pengunjung. -
Buat
InputStreamyang menunjuk ke file yang ditentukan. -
Gabungkan setiap elemen dalam data input ke aliran keluaran.
KinesisVideoExample
Ini adalah contoh aplikasi yang menunjukkan cara menggunakan perpustakaan parser aliran video Kinesis.
Kelas ini melakukan operasi berikut:
-
Membuat aliran video Kinesis. Jika aliran dengan nama yang diberikan sudah ada, aliran dihapus dan dibuat ulang.
-
Panggilan PutMedia untuk mengalirkan fragmen video ke aliran video Kinesis.
-
Panggilan GetMedia untuk mengalirkan fragmen video keluar dari aliran video Kinesis.
-
Menggunakan a StreamingMkvReader untuk mengurai fragmen yang dikembalikan pada aliran, dan menggunakan a FragmentMetadataVisitor untuk mencatat fragmen.
Hapus dan buat ulang aliran
Contoh kode berikut (dari StreamOps.java file) menghapus aliran video Kinesis yang diberikan:
//Delete the stream amazonKinesisVideo.deleteStream(new DeleteStreamRequest().withStreamARN(streamInfo.get().getStreamARN()));
Contoh kode berikut (dari StreamOps.java file) membuat aliran video Kinesis dengan nama yang ditentukan:
amazonKinesisVideo.createStream(new CreateStreamRequest().withStreamName(streamName) .withDataRetentionInHours(DATA_RETENTION_IN_HOURS) .withMediaType("video/h264"));
Panggilan PutMedia
Contoh kode berikut (dari PutMediaWorker.java file) memang PutMedia gil aliran:
putMedia.putMedia(new PutMediaRequest().withStreamName(streamName) .withFragmentTimecodeType(FragmentTimecodeType.RELATIVE) .withProducerStartTimestamp(new Date()) .withPayload(inputStream), new PutMediaAckResponseHandler() { ... });
Panggilan GetMedia
Contoh kode berikut (dari GetMediaWorker.java file) memang GetMedia gil aliran:
GetMediaResult result = videoMedia.getMedia(new GetMediaRequest().withStreamName(streamName).withStartSelector(startSelector));
Parsis hasilnya GetMedia
Bagian ini menjelaskan cara menggunakanStreamingMkvReader, FragmentMetadataVisitor dan mengur CompositeMkvElementVisitor ai, menyimpan ke file, dan mencatat data yang dikembalikan. GetMedia
Baca output dari GetMedia dengan StreamingMkvReader
Contoh kode berikut (dari GetMediaWorker.java file) membuat a StreamingMkvReader dan menggunakannya untuk mengurai hasil dari GetMedia operasi:
StreamingMkvReader mkvStreamReader = StreamingMkvReader.createDefault(new InputStreamParserByteSource(result.getPayload())); log.info("StreamingMkvReader created for stream {} ", streamName); try { mkvStreamReader.apply(this.elementVisitor); } catch (MkvElementVisitException e) { log.error("Exception while accepting visitor {}", e); }
Dalam contoh kode sebelumnya, StreamingMkvReader mengambil MKVElement objek dari payload hasil. GetMedia Pada bagian selanjutnya, elemen-elemen diteruskan ke aFragmentMetadataVisitor.
Ambil fragmen dengan FragmentMetadataVisitor
Contoh kode berikut (dari StreamingMkvReader.java file KinesisVideoExample.java dan) membuat aFragmentMetadataVisitor. Ob MkvElement jek yang diiterasi StreamingMkvReader oleh kemudian diteruskan ke pengunjung menggunakan accept metode.
dariKinesisVideoExample.java:
FragmentMetadataVisitor fragmentMetadataVisitor = FragmentMetadataVisitor.create();
dariStreamingMkvReader.java:
if (mkvElementOptional.isPresent()) { //Apply the MkvElement to the visitor mkvElementOptional.get().accept(elementVisitor); }
Catat elemen-elemen dan tulis ke file
Contoh kode berikut (dari KinesisVideoExample.java file) membuat objek berikut dan mengembalikannya sebagai bagian dari nilai pengembalian GetMediaProcessingArguments fungsi:
-
A
LogVisitor(perpanjangan dariMkvElementVisitor) yang menulis ke log sistem. -
Sebuah
OutputStreamyang menulis data yang masuk ke file MKV. -
A
BufferedOutputStreamyang menyangga data yang terikat untuk.OutputStream -
Sebuah OutputSegmentMerger yang menggabungkan elemen berurutan dalam
GetMediahasil dengan trek dan data EBML yang sama. -
A
CompositeMkvElementVisitoryang menyusunFragmentMetadataVisitor,OutputSegmentMerger, danLogVisitormenjadi satu elemen pengunjung.
//A visitor used to log as the GetMedia stream is processed. LogVisitor logVisitor = new LogVisitor(fragmentMetadataVisitor); //An OutputSegmentMerger to combine multiple segments that share track and ebml metadata into one //mkv segment. OutputStream fileOutputStream = Files.newOutputStream(Paths.get("kinesis_video_example_merged_output2.mkv"), StandardOpenOption.WRITE, StandardOpenOption.CREATE); BufferedOutputStream outputStream = new BufferedOutputStream(fileOutputStream); OutputSegmentMerger outputSegmentMerger = OutputSegmentMerger.createDefault(outputStream); //A composite visitor to encapsulate the three visitors. CompositeMkvElementVisitor mkvElementVisitor = new CompositeMkvElementVisitor(fragmentMetadataVisitor, outputSegmentMerger, logVisitor); return new GetMediaProcessingArguments(outputStream, logVisitor, mkvElementVisitor);
Argumen pemrosesan media kemudian diteruskan keGetMediaWorker, yang pada gilirannya diteruskan keExecutorService, yang menjalankan pekerja pada utas terpisah:
GetMediaWorker getMediaWorker = GetMediaWorker.create(getRegion(), getCredentialsProvider(), getStreamName(), new StartSelector().withStartSelectorType(StartSelectorType.EARLIEST), amazonKinesisVideo, getMediaProcessingArgumentsLocal.getMkvElementVisitor()); executorService.submit(getMediaWorker);