Pertanyaan Mendeskripsi aliran H264 Mentah di Android?


Saya memiliki proyek di mana saya diminta untuk menampilkan aliran video di android, alirannya adalah H.264 mentah dan saya terhubung ke server dan akan menerima aliran byte dari server.

Pada dasarnya saya bertanya-tanya apakah ada cara untuk mengirim byte mentah ke decoder di android dan menampilkannya di permukaan?

Saya telah berhasil mendekode H264 dalam wadah mp4 menggunakan API MediaCodec dan MediaExtractor baru di Android 4.1, sayangnya saya belum menemukan cara untuk memecahkan kode file atau aliran H264 mentah menggunakan API ini.

Saya mengerti bahwa salah satu caranya adalah mengkompilasi dan menggunakan FFmpeg tetapi saya lebih suka menggunakan metode built in yang dapat menggunakan akselerasi HW. Saya juga mengerti streaming RTSP didukung di android tetapi ini bukan pilihan. Versi Android bukan masalah.


32
2017-11-09 11:16


asal


Jawaban:


Saya tidak bisa memberikan kode apa pun untuk ini, sayangnya, tetapi saya akan melakukan yang terbaik untuk menjelaskannya berdasarkan cara saya membuatnya berfungsi.

Jadi di sini adalah ikhtisar saya tentang bagaimana saya mendapatkan video dikodekan H.264 mentah untuk bekerja menggunakan kelas MediaCodec (http://developer.android.com/reference/android/media/MediaCodec.html).

Menggunakan tautan di atas ada contoh untuk mendapatkan pengaturan dekoder dan cara menggunakannya, Anda harus mengaturnya untuk mendekode H264 AVC.

Format H.264 adalah yang terdiri dari NAL Units, masing-masing dimulai dengan awalan awalan tiga byte dengan nilai 0x00, 0x00, 0x01 dan setiap unit memiliki tipe yang berbeda tergantung pada nilai byte ke-4 tepat setelah ini 3 memulai byte. Satu Unit NAL TIDAK satu frame dalam video, setiap frame terdiri dari sejumlah NAL Units.

Pada dasarnya saya menulis sebuah metode yang menemukan masing-masing unit dan mengirimkannya ke decoder (satu Unit NAL menjadi awalan awal dan setiap byte di sana setelah itu sampai awalan awal berikutnya).

Sekarang jika Anda memiliki pengaturan decoder untuk decoding H.264 AVC dan memiliki InputBuffer dari decoder maka Anda siap untuk pergi. Anda perlu mengisi InputBuffer ini dengan Unit NAL dan mengembalikannya ke decoder dan terus melakukan hal ini untuk panjang aliran. Tapi, untuk membuat karya ini saya harus melewati decoder sebuah SPS (Sequence Parameter Set) NAL Unit terlebih dahulu. Unit ini memiliki nilai byte 0x67 setelah awalan awal (byte ke-4), pada beberapa perangkat decoder akan crash kecuali menerima Unit ini terlebih dahulu. Pada dasarnya sampai Anda menemukan unit ini, abaikan semua Unit NAL lainnya dan terus parsing aliran sampai Anda mendapatkan unit ini, lalu Anda dapat meneruskan semua unit lain ke decoder.

Beberapa perangkat tidak memerlukan SPS terlebih dahulu dan yang lainnya melakukannya, tetapi Anda lebih baik menyampaikannya terlebih dahulu.

Sekarang jika Anda memiliki permukaan yang Anda lewati ke decoder ketika Anda mengkonfigurasinya maka setelah mendapat cukup unit NAL untuk frame, ia harus menampilkannya di permukaan.


29
2017-09-05 13:55



Anda dapat mengunduh H.264 mentah dari server, kemudian menawarkannya melalui server HTTP lokal yang berjalan di ponsel dan kemudian membiarkan VLC untuk Android melakukan pemutaran dari server HTTP tersebut. Anda harus menggunakan skema http / h264: // VLC untuk memaksa demuxer ke H.264 mentah (jika Anda tidak memaksa demuxer VLC mungkin tidak dapat mengenali aliran, bahkan ketika jenis MIME dikembalikan oleh server HTTP adalah diatur dengan benar). Lihat

https://github.com/rauljim/tgs-android/blob/integrate_record/src/com/tudelft/triblerdroid/first/VideoPlayerActivity.java#L211 

untuk contoh tentang cara membuat Intent yang akan meluncurkan VLC.

Catatan: H.264 mentah ternyata tidak memiliki info waktu, jadi VLC akan bermain secepat mungkin. Pertama menanamkannya di MPEGTS akan lebih baik. Belum menemukan lib Android yang akan melakukannya.


0
2017-11-29 14:48



Berikut adalah sumber daya yang saya temukan bermanfaat dalam proyek serupa:

  1. Video ini telah sangat mendalam dalam memahami bagaimana MediaCodec menangani aliran h.264 mentah pada level yang tinggi.
  2. Utas ini masuk ke sedikit lebih detail untuk menangani SPS / PPS NALUs secara khusus. Seperti yang disebutkan di atas, Anda perlu memisahkan Unit NAL individu menggunakan awalan awalan, dan kemudian menyerahkan data yang tersisa ke MediaCodec.
  3. Repo ini (libstreaming) adalah contoh yang bagus untuk membuat decoding aliran H264 di Android menggunakan RTSP / RTP untuk transmisi.

0
2017-09-13 18:49