2013-04-28 33 views
9

tôi đang làm việc trên một dự án mà tôi cần phảiAndroid - Tiết kiệm một rtsp (h264) dòng để file mp4

  1. đọc đầu vào H.264 mã hóa dòng từ một IPCamera - Tôi có thể lấy này trong thông qua một địa chỉ rtsp như rtsp: //192.168.1.83: 8001/

  2. hiển thị dòng IPCamera - Đây tôi có thể làm bằng cách sử dụng


final VideoView vv = (VideoView) findViewById(R.id.video_view_h264); 
     MediaController mc = new MediaController(getApplicationContext()); 
     vv.setVideoURI(video); 
     vv.setMediaController(mc); 
     vv.requestFocus(); 
     vv.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      public void onPrepared(MediaPlayer mp) { 
       vv.start(); 
      } 
     }); 

  1. Bây giờ tôi muốn ghi lại dòng này vào một tập tin MP4. Đây là nơi tôi bị kẹt và tôi đang xem xét các tùy chọn sau

a) MediaRecorder - Dựa trên tìm kiếm google của tôi Tôi tin rằng lớp này chỉ có thể nhập từ máy ảnh của thiết bị. Có cách nào để tinh chỉnh này, nơi tôi có thể cung cấp một đầu vào từ rtsp dòng?

b) API MediaCodec - 4.1 trở đi Android đã phát hành API cấp thấp này với MediaExtractor và MediaCodec. Đối với tùy chọn này, tôi nghĩ rằng không thể sử dụng luồng rtsp trong đoạn mã sau

final String STREAM_URL = "rtsp://192.168.1.83:8001/"; 
MediaExtractor mediaExtractor = new MediaExtractor(); 
mediaExtractor.setDataSource(STREAM_URL); // I get an exception 04-28 18:30:18.914: E/AndroidRuntime(8140): Caused by: java.io.IOException: Failed to instantiate extractor. 

c) Tôi có thể đọc từ url và lưu trữ nó như một tệp hay không. Làm cách nào để chuyển đổi luồng này thành tệp MP4? Bất kỳ đoạn mã nào sẽ thực sự hữu ích.

Tôi cũng đã cố gắng sử dụng FFMPEG nhưng hiệu suất quá kém nên tôi đã bỏ tùy chọn này.

Bất kỳ yếu tố đầu vào nào trên ba tùy chọn trên hoặc bất kỳ tùy chọn bổ sung nào khác mà tôi có thể xem xét sẽ được đánh giá rất nhiều.

Cảm ơn !!

+0

Bạn có muốn hiển thị và ghi vào tệp cùng lúc không? – Ganesh

+0

Có, tôi đang tìm cách hiển thị và ghi lại đồng thời. Tôi có thể quản lý phần hiển thị, nhưng phần ghi âm là nơi tôi bị kẹt. – maxkart

+0

@maxkart Bạn đã tìm thấy giải pháp nào cho vấn đề của mình, tôi có cùng một vấn đề như bạn có Nếu bạn tìm thấy giải pháp nào thì hãy trả lời chi tiết câu hỏi của bạn. Tôi đánh giá cao nếu bạn làm .. Cảm ơn bạn đã nâng cao –

Trả lời

1

Đúng là MediaRecorder không có bất kỳ hỗ trợ nào để xử lý nội dung phát trực tiếp. Từ góc độ khung công tác, có các đối tượng phân tích cú pháp như trong MediaExtractor và các đối tượng codec như MediaCodec, nhưng không phải là trừu tượng của nhà văn (chưa).

Trong AOSP, recordVideo là tiện ích dòng lệnh nhằm ghi lại tệp đơn giản. Là một phần của quá trình triển khai, bộ mã hóa được tạo và chuyển đến MPEG4Writer như được quan sát here. Bạn có khả năng tái sử dụng mã này và cố gắng ghi luồng vào vào tệp trực tiếp.

Đối với điều này, bạn có thể lập mô hình đầu vào phát trực tuyến của mình dưới dạng MediaSource và chuyển trực tiếp cho nhà văn. Bạn sẽ phải thiết lập một số cơ bản nhất định metaData từ nguồn phát trực tiếp và chuyển nó cho người viết xuống. Bạn có thể không cần phải tạo mới MediaRecorder, nếu bạn có thể trực tiếp mô hình hóa nguồn vào.

+0

Ganesh - Cảm ơn bạn đã phản hồi. Bạn có gợi ý rằng một mã JNI có thể được viết ở nơi tôi sử dụng MPEG4Writer không? Ngoài ra tôi đã tự hỏi nếu tôi có thể sử dụng tiện ích recordVideo trực tiếp bằng cách đi qua một tập tin. Bạn có thể chỉ cho tôi bất kỳ tài liệu nào khác trên recordVideo không? Cảm ơn – maxkart

+0

@maxkart .. Có, bạn có thể xem xét sửa đổi mã JNI để hỗ trợ đối tượng 'MPEG4Writer'. Tiện ích 'recordVideo' hiện tại không hỗ trợ đầu vào tệp, mà là một nguồn giả. Tuy nhiên, cùng có thể dễ dàng được mở rộng để hỗ trợ một nguồn tập tin, để đọc 'YUV' khung từ tập tin, mã hóa giống nhau và lưu trữ vào một tập tin' mp4'. – Ganesh

0

Có cùng một vấn đề chính xác ở đây. FFmpeg giải quyết vấn đề và có vẻ rất hiệu quả với tôi nhưng nó phụ thuộc phần cứng, nó cần phải được biên dịch cho phiên bản cánh tay cụ thể của mỗi cpu của thiết bị.

Cách tiếp cận khác jcodec (http://jcodec.org/) nhưng chưa tìm ra cách lưu luồng rtsp với nó. Nó là một thư viện hoàn toàn java, nhưng không có nhiều tài liệu có sẵn.

Hãy cho tôi biết nếu bạn tìm ra cách để thực hiện.

+0

Không may thay! Tôi đã không thể đạt được bit ghi âm. – maxkart

Các vấn đề liên quan