Làm cách nào để có được Raspivid để bỏ qua mã hóa h264? (loại bỏ video phát trực tuyến độ trễ 5 giây)


11

Có rất nhiều diễn đàn và chủ đề về việc loại bỏ độ trễ 5 giây khi sử dụng Pi cùng với PI-Cam làm camera giám sát. Nhiều hướng dẫn cho thấy cách sử dụng vlc để mã hóa và truyền phát hình ảnh bằng giao thức RTP dẫn đến độ trễ ~ 5 giây.

Theo tôi, lý do là raspivid đang mã hóa luồng thành H264, trong khi VLC phải giải mã lại và mã hóa lại thành bất kỳ RTP nào. Dòng lệnh trông như thế này:

raspivid -w 640 -h 480 -o - -t 0 |cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

Phần đầu tiên cho raspivid để truyền phát video đến đầu ra tiêu chuẩn:

raspivid -w 640 -h 480 -o - -t 0 

Phần sau đường ống, báo cho VLC chọn nó và giải mã nó bằng h264:

cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

Mux-ing và demux-ing này là một nguồn tài nguyên!

Tôi đã tìm thấy các nguồn của raspicam tại github và tôi nghĩ rằng có thể thực hiện được điều gì đó trong phương thức encoder_buffer_callback (hiện tại dòng 848) để bỏ qua mã hóa. Tuy nhiên tôi không giỏi c, và không quen thuộc với mã hóa video, vì vậy tôi không biết phải bắt đầu từ đâu.

Trên Github tôi có thể thấy 330 dĩa, nhưng dường như chúng không dành riêng cho raspicam (thay vì cho toàn bộ dự án người dùng). Tôi đã bị mất khi cố gắng tìm một ngã ba loại bỏ mã hóa hoặc thực hiện một cái gì đó đơn giản hơn như mjpeg.

Ai đó có kiến ​​thức về codec và video c có thể giúp tôi và những người dùng mê mẩn khác thoát khỏi độ trễ không? Có lẽ giải pháp đã có sẵn ở một trong những nhánh đó, nhưng tôi đã dành hàng giờ để tìm kiếm nó mà không gặp may mắn.

ps Tôi không tìm kiếm một giải pháp trình duyệt , nhưng cuối cùng tôi muốn truyền nó đến Synology, tốt nhất là sử dụng mjpeg streaming (nhưng không phải qua một trang web, thay vào đó là một luồng mjpeg tiêu chuẩn được tích hợp trong hầu hết các ip-cam thương mại). Bước đầu tiên là gettig thoát khỏi h264.


Đó là một cuộc điều tra rất kỹ lưỡng. Sử dụng MJPEG là không cần thiết bởi vì (tại thời điểm tôi đang tìm kiếm) bộ mã hóa JPEG tích hợp không có thư viện và phần mềm là rác rưởi. Tôi đã quản lý để có được độ trễ khoảng 1 giây bằng cách sử dụng nginx-rtmp (đóng gói FLV), bản dựng tùy chỉnh, ở chế độ HD! Pi đã sử dụng khoảng 30% CPU nhưng VLC đã phải vật lộn để giải mã nó vì các khung thời gian bị thiếu và vì nó là FLV :( Ngoài ra phần mềm camera quan sát của tôi đã sử dụng VLC chìm và 1 luồng 720p sử dụng CPU 40% khi cuối cùng tôi cũng hoạt động nhưng rất không ổn định.
Piotr Kula

@ppumkin Tôi không tin MJPEG là vấn đề. Khi H264 không còn nữa, chúng ta có thể mã hóa bất cứ thứ gì chúng ta muốn mà không cần phải giải mã và mã hóa lại. Thật ra có H264 là một điều khá xa xỉ! Chỉ có chúng tôi sẽ có thể tắt nó. Nó giống như một tấm đệm pluche sang trọng và kim cương được đặt ngai vàng trong một buồng vệ sinh chật chội để không có gì khác vừa vặn trong phòng (ngoại trừ một số khoảng trống nơi chúng ta có thể nhảy lên xuống một chút) ... khi bạn mở cửa, bạn phải leo lên trên một tay vịn cao, và khi bạn ngồi không có chỗ cho đôi chân của bạn ...
Louis Somalia

Vâng, tôi hiểu ý của bạn. Tôi đã dành nhiều ngày cố gắng để có được MJPEG với chất lượng tốt cho máy chủ IP CCTV của mình. Nhiều thứ đã thay đổi nhưng mã hóa phần cứng JPEG trực tiếp và đường ống đến một luồng là không tồn tại, vì API không có sẵn. Cách duy nhất tôi biết là phần mềm và giải pháp tốt nhất tôi tìm thấy là nginx-rtmp JPEG chìm. HLS cho iPhone hoạt động thực sự tuyệt vời nhưng nó có độ trễ 5s-10s :(
Piotr Kula

1
Bạn có thể thử đưa ra câu hỏi này như một câu hỏi trong dự án Github cho phần mềm máy ảnh. Bạn có thể sẽ nhận được một lời giải thích về lý do tại sao nó khó thực hiện, nhưng nếu những người khác thấy đó là một tính năng hữu ích, ai đó có thể thực hiện nó.
TomG

demux không giống như giải mã ... vui lòng kiểm tra điều này
Flash Thunder

Câu trả lời:


5

Đó có thể không phải là những gì bạn muốn từ câu trả lời, nhưng tôi không khuyên bạn nên phát trực tuyến VLC ..

Đối với một dự án trường học, tôi đã thử một số tùy chọn phát trực tuyến (trên RPi nữa!):

  • VLC
  • MJPEG
  • GStreamer

Sử dụng VLC và MJPEG (và một số khác ít được biết đến), tôi có độ trễ từ 3 đến 5 giây ..
Sử dụng GStreamer, KHÔNG LATENCY và với độ phân giải tốt nhất (và nhiều tùy chọn khác)!
Nếu bạn quan tâm, bạn có thể kiểm tra nó ở đây .

Và nếu bạn sẽ sử dụng nó, đây là đường ống dẫn của tôi:

raspivid -t 0 -w 640 -h 480 -fps 25 -b 1200000 -p 0,0,640,480 -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=YOUR_IP port=YOUR_PORT

1
Có, tôi đã dùng thử Gstreamer và nó hoạt động rất tốt khi phát trực tiếp lên PC, nhưng nó không hoạt động tốt với phần mềm của bên thứ 3 như SynStation DiskStation. Có vẻ như GStreamer chỉ sử dụng lại luồng h264 và kết thúc một giao thức truyền phát xung quanh nó mà không giải mã nó, đây là một giải pháp tuyệt vời nhưng không may cho một số ít trường hợp sử dụng. Nếu tôi muốn xem luồng trên thiết bị Android, tôi phải phát triển ứng dụng của riêng mình cho nó. MJPEG được hỗ trợ rộng rãi hơn nhiều và tôi chắc chắn Raspivid có thể được thay đổi để bỏ qua mã hóa không cần thiết để lại cho VLC hoặc hơn thế. Cảm ơn vì tiền boa bằng mọi cách
Louis Somalia

1
Tôi cũng có Synology nhưng chưa thử GStreamer trên đó (tôi nghĩ nó không đủ mạnh). Btw, về Android, bạn cũng có thể sử dụng GStreamer! Tôi đang sử dụng nó cho dự án của tôi và nó đang hoạt động tốt :)!
Val

Vấn đề với trình điều khiển, nó không bao gồm khung thời gian vào dữ liệu khung và nó không thể sử dụng được như một phần chìm (ngay cả với tùy chọn được thêm vào !!) :( Có các kịch bản mod có sẵn để chuyển qua nhưng tôi thấy thường xuyên nhận được bộ chuyển đổi từ bom VLC. 6 tháng trước khi tôi đang tìm cách làm camera quan sát an toàn .. nhưng nó không bao giờ hoạt động đáng tin cậy :(
Piotr Kula

@Val đúng, có một SDK cho Android, nhưng không có nhiều người chơi ngoài luồng trong cửa hàng chơi hỗ trợ các đường ống như gst-launch-1.0 -v tcpclentsrc host = 11,22.33.44 port = 1234! gdpdepay! rtph264 ngày! avdec_h264! cầu truyền hình! autovideosink đồng bộ = sai. Đối với iOS thậm chí còn ít hơn. Synology là một trung tâm tuyệt vời hỗ trợ hầu hết các thiết bị chính, có thể thực hiện phát hiện chuyển động, ghi âm và thông báo, tất cả đều nằm ngoài hộp (và không cần thắt thẻ SD).
Louis Somalia

Bạn vẫn đang sử dụng như thế này? Có trình điều khiển U4VL mới, nhưng vẫn có vấn đề về độ trễ tương tự với việc truyền h264 sang VLC
Piotr Kula

0

Một số người đã làm việc chăm chỉ về vấn đề này kể từ lần đầu tiên tôi hỏi câu hỏi này và đến lúc này có một vài lựa chọn (lạ là chưa có ai trả lời câu hỏi này). Tôi đã thử RaspberrIPCam và đã có một số thành công, tuy nhiên có vẻ như các gói rtsp có một đoạn cực ngắn hoặc một cái gì đó. Có Pi được nối trực tiếp với bộ định tuyến bên cạnh PC của tôi, nó sẽ hoạt động hoàn hảo. Nhưng ngay khi tôi cài đặt cam nơi tôi muốn và cố gắng truy cập luồng có hai bộ định tuyến ở giữa, sẽ không có hình ảnh nào xuất hiện. Tôi đã kiểm tra mã nguồn và thấy bộ TTL được đặt ở mức tối đa. Tôi không bao giờ tìm ra nó hoàn toàn.

Hiện tại tôi muốn giới thiệu RaspberryIPCamera có giao diện người dùng đẹp (xem ảnh chụp màn hình ) và thậm chí còn có hình ảnh thẻ SD làm sẵn cho nó. Tôi đã thử thẻ SD, nhưng đã hoàn nguyên cài đặt thủ công như được mô tả ở đây rất thành công (thiết lập hiện tại của tôi). Các hướng dẫn để kết nối nó với SynStation DiskStation cũng có sẵn và đang hoạt động hoàn hảo trên hệ thống của tôi. Vấn đề với hình ảnh thẻ SD là tôi không thể mở rộng hệ thống tập tin đến toàn bộ phạm vi của thẻ SD (Tôi cũng muốn chạy một số nội dung khác trên đó để điều khiển một số rơle thông qua các chân GPIO).

Giải pháp trên sử dụng các thành phần của dự án UV4L. Các tài liệu của dự án UV4L về vấn đề này Trang cũng đề cập đến:

Ngoài ra, nó còn cung cấp giao diện Web từ đó có thể xem luồng video theo nhiều cách khác nhau và Trang điều khiển cho phép kiểm soát hoàn toàn các cài đặt camera trong khi phát trực tuyến với bất kỳ ứng dụng Video4Linux nào.

Mặc dù vậy, tôi vẫn chưa thử nó (vì tôi không muốn làm hỏng thiết lập hiện tại của mình).


1
Không chắc đây có phải là sự cố của bạn không, nhưng nếu bạn đang gửi lưu lượng truy cập RTSP đa tuyến qua bộ định tuyến, hãy đảm bảo rằng nó đã bật IGMP snooping và đảm bảo PC của bạn không chặn các truy vấn IGMP từ bộ định tuyến. Nếu không, bộ định tuyến sẽ không nhận ra PC của bạn đang cố nhận các gói, vì vậy nó sẽ không bao giờ chuyển tiếp chúng.
Malvineous
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.