linux下视频传输测试

Posted 朝闻道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下视频传输测试相关的知识,希望对你有一定的参考价值。

本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.

在上一篇《ubuntu下基于qt+OpenCV控制摄像头》的基础上测试了视频传输.

环境:主机:PC + Ubuntu10.04 + OpenCV + Qt

      从机:s3c6410 + linux2.6.38 + Qt

主机有摄像头,捕捉摄像头,然后通过网络传输,从机接收数据后显示。

 

实现流程:

主机代码:

主要代码如下,socket编程采用Linux本身提供的方法。

widget.h

 

 

[html] view plain copy
 
 技术分享技术分享
  1. <span style="font-family:‘Arial Black‘;">#ifndef WIDGET_H  
  2. #define WIDGET_H  
  3.   
  4. #include <QWidget>  
  5. #include "public.h"  
  6.   
  7. namespace Ui {  
  8.     class Widget;  
  9. }  
  10.   
  11. class Widget : public QWidget  
  12. {  
  13.     Q_OBJECT  
  14.   
  15. public:  
  16.     explicit Widget(QWidget *parent = 0);  
  17.     ~Widget();  
  18.   
  19. private:  
  20.     Ui::Widget *ui;  
  21.   
  22.     CvCapture *capture;             //视频数据结构  
  23.     IplImage *frame;  
  24.     QTimer *timer;  
  25.     QImage *img;  
  26.   
  27. private slots:  
  28.     void slot_timer();  
  29.   
  30. protected:  
  31.     void paintEvent (QPaintEvent *);  
  32. };  
  33.   
  34. #endif // WIDGET_H  
  35. </span>  


widget.c

 

 

[html] view plain copy
 
 技术分享技术分享
  1. <span style="font-family:‘Arial Black‘;">#include "widget.h"  
  2. #include "ui_widget.h"  
  3. #include "public.h"  
  4.   
  5. Widget::Widget(QWidget *parent) :  
  6.     QWidget(parent),  
  7.     ui(new Ui::Widget)  
  8. {  
  9.     ui->setupUi(this);  
  10.   
  11.     timer = new QTimer(this);  
  12.     connect(timer,SIGNAL(timeout()),this,SLOT(slot_timer()));  
  13.     timer->start(FPS);  
  14.   
  15.     capture = cvCreateCameraCapture(0);  
  16.     //cvNamedWindow("jdh",CV_WINDOW_AUTOSIZE);  
  17.   
  18.     //初始化网络  
  19.     init_sockaddr_in(&Dst_Addr,Udp_Port,QString(DST_IP));  
  20.     //套接字初始化  
  21.     Socket_Send = socket(AF_INET,SOCK_DGRAM,0);  
  22.   
  23.     //img = new QImage("test.jpg");  
  24.     //img->save("test_save.png","PNG",0);  
  25.     //img->save("test_save.jpeg","JPEG",10);  
  26. }  
  27.   
  28. void Widget::slot_timer()  
  29. {  
  30.     frame = cvQueryFrame(capture);  
  31.     if (!frame)  
  32.     {  
  33.         return;  
  34.     }  
  35.   
  36.     //img->load("test.jpg");  
  37.     cvCvtColor(frame,frame,CV_BGR2RGB);  
  38.     img = new QImage((unsigned char*)frame->imageData,frame->width,frame->height,frame->widthStep,QImage::Format_RGB888);  
  39.     //img = new QImage((unsigned char*)frame->imageData,frame->width,frame->height,QImage::Format_RGB888);  
  40.     update();  
  41.     //cvShowImage("jdh",frame);  
  42.   
  43.     img->save("test_save.jpeg","JPEG",ZHILIANG);  
  44.     QFile file("test_save.jpeg");  
  45.     if (!file.open(QIODevice::ReadOnly))  
  46.              return;  
  47.     QByteArray buffer = file.readAll();  
  48.   
  49.     if (sendto(Socket_Send,buffer.data(),buffer.size(),0,(struct sockaddr *)(&Dst_Addr),sizeof(struct sockaddr_in)) 0)  
  50.     {  
  51.         cout << "send fail" << " " <buffer.size() <endl;  
  52.         perror("hello");  
  53.     }  
  54.     file.close();  
  55.   
  56.     //网络发送  
  57.     /*  
  58.     if (sendto(Socket_Send,img->data_ptr(),img->byteCount(),0,(struct sockaddr *)(&Dst_Addr),sizeof(struct sockaddr_in)) 0)  
  59.     {  
  60.         cout << "send fail" << " " <frame->width << " " <frame->height << " " <img->byteCount() <endl;  
  61.         perror("hello");  
  62.     }  
  63.     */  
  64. }  
  65.   
  66. void Widget::paintEvent(QPaintEvent * event)  
  67. {  
  68.     //painter->drawImage(0,0,mm);  
  69.     QPainter *pp = new QPainter(this);  
  70.     pp->drawImage(0,0,*img);  
  71. }  
  72.   
  73. Widget::~Widget()  
  74. {  
  75.     delete ui;  
  76.   
  77.     cvReleaseImage(&frame);  
  78.     //cvDestroyWindow("jdh");  
  79. }  
  80. </span>  

 

从机主要代码如下,socket编程采用qt里机制

widget.h

 

[cpp] view plain copy
 
 技术分享技术分享
  1. <span style="font-family:‘Arial Black‘;">#ifndef WIDGET_H  
  2. #define WIDGET_H  
  3.   
  4. #include <QWidget>  
  5. #include "public.h"  
  6.   
  7. namespace Ui {  
  8.     class Widget;  
  9. }  
  10.   
  11. class Widget : public QWidget  
  12. {  
  13.     Q_OBJECT  
  14.   
  15. public:  
  16.     explicit Widget(QWidget *parent = 0);  
  17.     ~Widget();  
  18.   
  19. private:  
  20.     Ui::Widget *ui;  
  21.   
  22.     QImage *img;  
  23.   
  24.     QUdpSocket *receiver;  
  25. protected:  
  26.     void paintEvent(QPaintEvent *);  
  27.   
  28. private slots:  
  29.     void processPendingDatagram();  
  30. };  
  31.   
  32. #endif // WIDGET_H  
  33. </span>  


widget.c

 

 

[cpp] view plain copy
 
 技术分享技术分享
  1. <span style="font-family:‘Arial Black‘;">#include "widget.h"  
  2. #include "ui_widget.h"  
  3.   
  4. Widget::Widget(QWidget *parent) :  
  5.     QWidget(parent),  
  6.     ui(new Ui::Widget)  
  7. {  
  8.     ui->setupUi(this);  
  9.   
  10.     receiver = new QUdpSocket(this);  
  11.     receiver->bind(Udp_Port,QUdpSocket::ShareAddress);  
  12.     connect(receiver,SIGNAL(readyRead()),this,SLOT(processPendingDatagram()));  
  13. }  
  14.   
  15. void Widget::paintEvent(QPaintEvent *)  
  16. {  
  17.     QPainter *pp = new QPainter(this);  
  18.     pp->drawImage(0,0,*img);  
  19. }  
  20.   
  21. void Widget::processPendingDatagram()  
  22. {  
  23.     qint64 num = receiver->pendingDatagramSize();  
  24.     cout << "receive size = " << num << endl;  
  25.   
  26.     QByteArray buffer;  
  27.     buffer.resize(num);  
  28.     receiver->readDatagram((char *)buffer.data(),num);  
  29.   
  30.     QFile file("test_save.jpeg");  
  31.     if (!file.open(QIODevice::WriteOnly))  
  32.              return;  
  33.     file.write(buffer);  
  34.     file.close();  
  35.     img = new QImage("test_save.jpeg");  
  36.     update();  
  37.   
  38. }  
  39.   
  40. Widget::~Widget()  
  41. {  
  42.     delete ui;  
  43. }  
  44. </span>  

 

 

从机端显示:

技术分享 

http://blog.csdn.net/jdh99/article/details/6672481

以上是关于linux下视频传输测试的主要内容,如果未能解决你的问题,请参考以下文章

用 C++ 流式传输视频? [关闭]

在linux / bash中使用非阻塞FIFO流式传输视频

通过 RTSP 流式传输 opencv 视频

从 Parse 下载后无法流式传输视频

批处理脚本 - 每天将视频传输到下一个文件夹

window下使用tcp传输视频(c++)