2012-12-13 41 views
8

Tôi đang cố gắng chạy một máy chủ phát trực tiếp HTTP trên iPhone, máy chủ này sẽ ghi luồng video từ máy ảnh và cấp dữ liệu cho máy khách HTML5 (hỗ trợ phát trực tiếp HTTP).Máy chủ phát trực tuyến HTTP trên iPhone

Cho đến giờ, tôi đã làm việc sau đây.

  1. server HTTP Live streaming trên iOS (viết bằng Node.js), trong đó động cập nhật các tập tin chỉ mục từ danh sách các Transport Stream (video/MP2T) tập tin được tạo bởi module quay video.
  2. Mô-đun quay video, sử dụng AVCaptureMovieFileOutput để tạo ra một loạt các tập tin QuickTime 10 giây liên tục (có khoảng cách nhỏ giữa chúng, nhưng nó đủ nhỏ cho ứng dụng của tôi).

Điều tôi cần là trình chuyển đổi trực tuyến chuyển đổi từng tệp QuickTime thành tệp Transport Stream (không cần phải thay đổi mã hóa, tôi chỉ cần một vùng chứa khác).

Tôi đang sử dụng phương pháp này vì đây là cách duy nhất để tận dụng bộ mã hóa video phần cứng của iPhone theo như tôi biết (tôi đã thực hiện một nghiên cứu về chủ đề này ở đây và chắc chắn là 99%) Vui lòng cho tôi biết nếu tôi sai).

Một vài người đề nghị ffmpeg, nhưng tôi muốn sử dụng mã nhỏ hơn nhiều với giấy phép MIT (nếu có) hoặc viết thứ gì đó từ đầu (và mã nguồn mở với giấy phép MIT).

Tôi khá mới đối với nội dung phương tiện này, và tôi thực sự đánh giá cao nếu ai đó có thể chỉ cho tôi đúng hướng (mẫu mã, nguồn mở, tài liệu, ...).

+0

Bạn có thể xem mã ffmpeg để xem cách thực hiện. – vipw

+0

ffmpeg là giải pháp rẻ tiền duy nhất, có bộ mã hóa thương mại nhưng chúng tốn rất nhiều tiền. HLS tạo ra trên điện thoại sẽ có một chút vấn đề, đã xem xét có thể rtmp, vì có vẻ như bạn có rất nhiều các mảnh tại chỗ. Tôi giả định những khoảng trống là bởi vì bạn cần phải đọc lại các tập tin mov hoàn chỉnh bạn đang tạo ra từ avassetwriter. –

Trả lời

6

Tôi đăng bài này trên diễn đàn nhà phát triển táo, chúng tôi thực hiện một cuộc thảo luận sôi nổi (lý do chơi chữ). Đây là câu trả lời cho người đã đưa ra một khái niệm tương tự.

Tôi nghĩ đúng nếu tôi sai, và cho chúng tôi một ví dụ làm thế nào nếu bạn không đồng ý rằng tạo ra một mpeg ts từ h264 thô mà bạn nhận được từ AVCaptureVideoDataOutput không phải là một nhiệm vụ dễ dàng trừ khi bạn chuyển mã bằng x264 hoặc một cái gì đó tương tự . giả sử cho một phút mà bạn có thể dễ dàng có được các tập tin mpeg ts, sau đó nó sẽ là một vấn đề đơn giản của biên dịch chúng trong một container m3u8, tung ra một máy chủ web nhỏ và phục vụ chúng. Theo như tôi biết và có rất nhiều ứng dụng thực hiện việc đó, sử dụng đường hầm cục bộ từ thiết bị không phải là vấn đề từ chối. Vì vậy, có lẽ bằng cách nào đó bạn có thể tạo ra hls từ thiết bị tôi đặt câu hỏi về hiệu suất bạn sẽ nhận được.

Vì vậy, vào kỹ thuật số 2 Vẫn sử dụng AvCaptureVideoDataOutput, bạn nắm bắt được khung, bọc chúng trong một số giao thức nhỏ gọn, json hoặc có lẽ một cái gì đó bí ẩn khác như bencode mở một socket và gửi chúng lên máy chủ của bạn. Ahh ... chúc may mắn tốt hơn có một mạng lưới mạnh mẽ tốt đẹp bởi vì gửi khung không nén thậm chí qua wifi sẽ yêu cầu băng thông.

Vì vậy, vào số kỹ thuật 3.

Bạn viết một bộ phim mới sử dụng avassetwriter và đọc lại từ các tập tin tạm thời sử dụng các hàm c tiêu chuẩn, điều này là tốt nhưng những gì bạn có là h264 thô, mp4 là chưa hoàn chỉnh do đó nó không có bất kỳ nguyên tử moov nào, bây giờ đến phần thú vị tái tạo tiêu đề này. chúc may mắn.

Vì vậy, vào tecnique 4 mà dường như thực sự có một số bằng khen

Chúng tôi tạo ra không chỉ một mà 2 avassetwriters, chúng tôi quản lý chúng bằng dispatch_queue UCLN, kể từ sau khi avassetwriters instantiation chỉ có thể được sử dụng một lần, chúng tôi bắt đầu đầu tiên trên một bộ đếm thời gian, sau một khoảng thời gian xác định trước nói rằng 10 giây chúng tôi bắt đầu thứ hai trong khi rách đầu tiên xuống. Bây giờ chúng tôi có một loạt tệp .mov với các nguyên tử moov hoàn chỉnh, mỗi nguyên tử này chứa video h264 được nén. Bây giờ chúng tôi có thể gửi chúng đến máy chủ và lắp ráp chúng thành một luồng video hoàn chỉnh. Cách khác, chúng tôi có thể sử dụng một streamer đơn giản mà có các tập tin mov và kết thúc tốt đẹp chúng trong giao thức rtmp bằng cách sử dụng librtmp và gửi chúng đến một máy chủ phương tiện truyền thông.

Có thể chúng tôi chỉ gửi từng tệp mov đến thiết bị apple khác, do đó, thiết bị được truyền đến thiết bị, câu hỏi đó đã bị hiểu sai nhiều lần, định vị thiết bị iPhone khác trên cùng mạng con qua wifi khá dễ dàng và có thể thực hiện được. Định vị một thiết bị khác trên tcp trên kết nối celluar gần như là phép thuật, nếu nó có thể được thực hiện chỉ trên các mạng di động sử dụng địa chỉ IP và không phải tất cả các mạng di động đều làm.

Giả sử bạn có thể, sau đó bạn gặp phải vấn đề khác vì không có trình phát video giới thiệu nào có thể xử lý chuyển đổi giữa nhiều tệp phim riêng biệt khác nhau. Bạn sẽ phải viết trình phát trực tuyến của riêng mình có thể dựa trên giải mã ffmpeg. (điều đó hoạt động khá tốt)

+0

Cảm ơn bạn đã có một bản tóm tắt tuyệt vời, Michelle. Tôi đã chọn một cơ chế rất gần với "kỹ thuật 4". Video giờ đây khá mượt mà trên các ranh giới phân đoạn đó. Tôi vẫn nghe thấy một khoảng trống nhỏ trong âm thanh trên những ranh giới đó, và tôi đang cố gắng tìm ra cách để loại bỏ nó. –

+0

Nhưng làm thế nào để bạn sử dụng AVAssetWriter với camera iPhone? Tôi chỉ nghe nói về việc sử dụng máy ảnh với một AVCaptureSession, và bạn không thể sử dụng nó với một AVAssetWriter. – sudo

+0

có bạn có thể thực tế, bạn vẫn thiết lập một phiên chụp mặc dù –

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