绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
基于全志A40i的FFmpeg命令行工作方式
2022-12-17 09:30:44

1. FFmpeg的安装

FFmpeg是用来记录、转换数字音频、视频的开源软件,它支持文件和网络流操作。它支持以函数库的方式使用,所以有很多软件都依赖它,比如VLC、暴风影音、腾讯会议等。它的命令行程序也非常强大,各种命令行选项学起来虽然困难,但是几乎能够满足日常对音视频的各种处理需求。今天我们就通过飞凌嵌入式OKA40i-C开发板保定飞凌嵌入式技术有限公司来介绍它的命令行工作方式。

FFmpeg提供了全部源代码,所以在网上可以找到很多教程是关于交叉编译ARM版本的。我们测试的版本使用的是FFmpeg-release-armel-static.tar.xz。解压缩以后拷贝到飞凌嵌入式OKA40i-C开发板上并设置好权限就可以使用了。

2. USB摄像头测试

OKA40i-C开发板接口丰富,它支持USB摄像头、CMOS-OV5640摄像头、模拟摄像头。把USB摄像头插入开发板,然后使用

v4l2-ctl --list-devices

可以看到/dev/video0就是我们的USB摄像头,如下图。

使用下面的命令可以看到该摄像头的全部参数:

v4l2-ctl -d  /dev/video0 --all
  1. Driver Info (not using libv4l2):
  2. Driver name : uvcvideo
  3. Card type : USB2.0 PC CAMERA
  4. Bus info : usb-sunxi-ehci-1
  5. Driver version : 3.10.65
  6. Capabilities : 0x04000001
  7. Video Capture
  8. Streaming
  9. Video input : (Camera 1: ok)
  10. Format Video Capture:
  11. Width/Height : 640/480
  12. Pixel Format : 'YUYV'
  13. Field : None
  14. Bytes per Line : 1280
  15. Size Image : 614400
  16. Colorspace : Default
  17. Transfer Function : Default
  18. YCbCr Encoding : Default
  19. Quantization : Default
  20. Crop Capability Video Capture:
  21. Bounds : Left , Top , Width 640, Height 480
  22. Default : Left , Top , Width 640, Height 480
  23. Pixel Aspect: 1/1
  24. Streaming Parameters VideoCapture:
  25. Capabilities : timeperframe
  26. Frames per second: 30.000 (30/1)
  27. Read buffers :
  28. brightness (int) : min= max=255 step=1 default=128value=128
  29. contrast (int) : min= max=255 step=1 default=135value=135
  30. saturation (int) : min= max=255 step=1 default=75 value=75
  31. hue (int) : min=-127 max=127 step=1 default= value=
  32. gamma (int) : min=1 max=8 step=1 default=4 value=4
  33. power_line_frequency (menu) : min= max=2 default=1 value=1
  34. sharpness (int) : min= max=15 step=1 default=5 value=5
  35. backlight_compensation (int) : min=1 max=5 step=1 default=1 value=1

我们使用了两种型号的USB摄像头,按照手册说明使用内置的uvccamera程序进行测试,不过都没有成功,得到的错误信息如下图所示。

我们使用FFmpeg可以抓取视频,命令行如下:

ffmpeg -f video4linux2 -s 640x480 -pix_fmt yuyv422 -i /dev/video0 out.yuv

使用Windows版本的ffplay可以正常播放抓取的视频,命令行如下:

ffplay -s 640x480 -pix_fmt yuyv422 out.yuv

上面保存的是YUV格式的原始视频,如果要保存压缩视频,可以用下面的命令行:

ffmpeg -y -t 15 -r 25 -f video4linux2  -i /dev/video0 out3.mp4-timestamps bs

其中的-r 25表示每秒采样25帧,这个参数必须有,否则FFmpeg可能会不断地采集并压缩同一视频帧。-r参数超过30没有什么意义,因为USB摄像头的大能力就是30fps。

飞凌嵌入式OKA40i-C开发板可以对于1080P的视频压缩达到45fps,所以对USB摄像头的视频压缩应该没有什么压力。

3. FFmpeg性能测试

FFmpeg有个benchmark参数可以方便进行性能测试。我们对A40i开发板自带的一个MP4视频就行解码测试,命令行如下:

ffmpeg-benchmark -i translate.mp4 -f null –

得到的测试数据如下:

  1. video:
  2. 148kB
  3. audio:
  4. 3428kB subtitle:kB other streams:kB globalheaders:kB muxing
  5. overhead:
  6. unknown
  7. bench:
  8. utime=2.820s stime=0.110s rtime=0.956s
  9. bench:
  10. maxrss=14208kB

由于我手上暂时没有其他的开发板可以对比,于是就通过我用了5年的i7-6500笔记本测试了一下,测试结果如下:

  1. video:
  2. 241kB
  3. audio:
  4. 3428kB subtitle:kB other streams:kB globalheaders:kB muxing
  5. overhead:
  6. unknown
  7. bench:
  8. utime=0.391s stime=0.000s rtime=0.228s
  9. bench:
  10. maxrss=20316kB

4.  FFmpeg产生实时视频流

FFmpeg可以支持实时视频流的发送和接收,从而可以把OKA40i-C开发板上的视频实时发送到PC上,由PC上的软件实时接收并显示。我们可以使用下面的命令将OKA40i-C开发板上的一个MP4转换为RTP码流发送的PC上:

ffmpeg -re -i test.mp4 -an -c copy -f rtp rtp://192.168.0.105:1234

使用Wireshark可以看到在PC机的1234端口收到大量来自OKA40i-C开发板的H.264视频流。

 

如果想在PC上显示视频流,需要建立一个SDP文件,它描述视频流中的端口和编码信息。

SDP是来自SIP标准中定义,目前VLC、Apple QuickTime和ffplay等很多软件都可以打开SDP文件,并按照SDP中的描述显示视频流。SDP文件并不需要手工编写,在ffmpeg运行时它会显示命令行所对应的SDP定义,如下图所示。

也可以用重定向将输出写入一个SDP文件,如:

ffmpeg -re -i test.mp4 -an -c copy -f rtp rtp://192.168.0.105:1234 > rtp.sdp

下面就是使用VLC显示的接收到的视频流。

 

5.  FFmpeg转发USB摄像头的视频流

前面演示了将MP4文件转换为视频流,我们也可以将USB摄像头采集的内容实时转发到PC上,使用下面的命令行即可。

ffmpeg -y -t 15 -r 25 -f video4linux2  -i /dev/video0 -f rtprtp://192.168.0.105:1234 > usb.sdp
分享好友

分享这个小栈给你的朋友们,一起进步吧。

飞凌嵌入式
创建时间:2022-01-10 09:52:51
飞凌嵌入式产品干货、测评、应用方案
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • ningmengzier
    栈主

小栈成员

查看更多
  • shakela
戳我,来吐槽~