ffmpeg安装说明


文章摘要: 本文主要描述了ffmpeg的安装方法。
操作系统: Debian8
软件版本: ffmpeg-4.2.1.tar.bz2, lame-3.100.tar.gz, opencore-amr-0.1.2


基于apt-get安装方法:

http://ffmpeg.org网站有相关说明的apt-get源,加入源至/etc/apt/source.list文件中

deb http://www.deb-multimedia.org stable main non-free
# apt-get update
# apt-get install ffmpeg

基于源码安装:

# git clone https://git.ffmpeg.org/ffmpeg.git
# cd ffmpeg
# ./configure
# make
# make install

添加mp3支持:

下载lame源码

# ./configure --prefix=/opt/rootfs
# make 
# make install

指定安装目录,一会编译ffmpeg进须指定位置.

重新配置ffmpeg

# ./configure --prefix=/opt/rootfs --extra-cflags='-I/opt/rootfs/include' --extra-libs='-L/opt/rootfs/lib' --enable-libmp3lame 
# make 
# make install

--extra-cflags 通过编译参数指定第三方头文件位置;
--extra-libs 指定第三方库文件位置。


添加amr支持:
首先编译arm库

# wget https://jaist.dl.sourceforge.net/project/opencore-amr/opencore-amr/0.1.2/opencore-amr-0.1.2.tar.gz
# cd amr-0.1.2
# ./configure --prefix=/opt/rootfs
# make
# make install

重新配置ffmpeg

#./configure --prefix=/opt/rootfs --extra-cflags='-I/opt/rootfs/include' --extra-libs='-L/opt/rootfs/lib' --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb 

--enable-version3
--enable-libopencore-amrnb
--enable-libopencore-amrwb


嵌入式软件交叉编译

./configure --enable-cross-compile --cross-prefix=arm-linux-gnueabihf- --cc=arm-linux-gnueabihf-gcc --arch=arm --target-os=linux 

--enable-cross-compile 使能交叉编译;
--cross-prefix 指定编译器前缀;
--cc 指定c编译器
--arch 指定CPU架构
--target-os=linux 指定操作系统

- 阅读全文 -

ffmpeg命令详细说明


文章摘要: 本文描述了ffmpeg命令的使用方法。
操作系统: Debian8
软件版本: ffmpeg-4.1.2


编码转换:

ffmpge -i infile.m4a outfile.mp3

-i 指明输出文件名称

正常情况下,可以根据扩展名自动识别编码,也可以指定编码

ffmpeg -i infile.mov -c:v libx265  outfile.avi
ffmpeg -i infile.avi -vcodec h264  outfile.mp4
ffmpeg -i infile.avi -vcodec mpeg4 outfile.mp4

-vcodec 指定视频编码方式.

查看支持格式:

ffmpeg -encoders

剪切:

ffmpeg -ss 00:03:00 -i video.mp4 -t 60 -c copy cut.mp4

ffmpeg -ss 00:03:00 -i video.mp4 -to 00:02:00 -c copy cut.mp4

ffmpeg -ss 00:03:00 -i video.mp4 -c copy cut.mp4

-ss表示起始位置,官方规定最好写在-i参数前边,以获取精确时间,小数点后单位为ms
-t 表示时间长度, -to表示结束位置,如果无此参数,则表示从指定位置一直到最后(去片头)


旋转:

ffmpeg -i input.mp4 -vf "rotate=90*PI/180" output.mp4

缩放:

ffmpeg -i input.mp4 -s 720x480 -b:v 1500k output.mp4

调整播放速度:
加速四倍:

ffmpeg -i TheOrigin.mp4 -vf  "setpts=0.25*PTS" UpTheOrigin.mp4

四倍慢速:

ffmpeg -i TheOrigin.mp4 -vf "setpts=4*PTS" DownTheOrigin.mp4

合并:
先建立一个list.txt文件,输入待合并内容列表:

file '/path/to/file1.mp4'
file '/path/to/file2.mp4'
file '/path/to/file3.mp4'
ffmpeg -f concat -i list.txt -c copy output.mp4

由于合并视频的多样性,可以先转换成同一格式,再进行合并:

ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi

去除视频声音:

ffmpeg -i rhythmofrain.mp4 -vcodec copy -an selince.mp4 

提取声音: 只需要将输出格式设置为声音格式即可

ffmpge -i input.avi output.mp3

将声音合并至视频:

ffmpeg -i movie.mp4 -i music.mp3 -vcodec copy output.mp4

视频和音频的时间长度最好设置为一致,否则会造成有图像没声音或者有声音没图像的情况。


加图片水印:

ffmpeg  -i movie.mp4 -i logo.png -filter_complex overlay=main_w-overlay_w-10:10 output.mp4

说明:
-filter_complex overlay=左边距:上边距

main_w - 视频单帧图像宽度
main_h - 视频单帧图像高度
overlay_w - 水印图片的宽度
overlay_h - 水印图片的高度

左上角: 0:0(可省略)
右上角: main_w-overlay_w:0
左下角: 0:main_h-overlay_h
右下角: main_w-overlay_w: main_h-overlay_h
中间位置:main_w/2-overlay_w/2:main_h/2-overlay_h/2


查看文件音视频属性

ffprobe -i rain.mp4

参数说明:
-r 指定帧率
-s 指定分辨率
-b 指定比特率

-acodec 指定音频编码,copy表示不解码,直接原样输出
-ab 指定音频比特率
-ac 指定声道数
-ar 指定采样率(44100Hz)
-an 表示丢弃声音数据(disable audio)

-vcodec 指定视频编码方式,copy表示不解码,直接原样输出


参考文档:
http://www.ffmpeg.org/ffmpeg.html
https://www.cnblogs.com/jasonzeng/p/8338019.html
https://blog.csdn.net/Lyman_Ye/article/details/80305904
https://jingyan.baidu.com/article/335530daf82a3b19cb41c339.html

- 阅读全文 -

C++Builder--TimeDate


TDateTime t;

// 获取当前日期及时间:
t = TDateTime::CurrentDateTime();

// 获取当前日期:
t = TDateTime::CurrentDate();
// 获取当前时间:
t = TDateTime::CurrentTime();

// 转换成年月日
unsigned short year, month, day;
t.DecodeDate(&year, &month, &day);

// 转换成时分秒
unsigned short hour, min, sec, msec;
t.DecodeTime(&year, &min, &sec, &msec);

// 通过数值设置指定日期
t = TDateTime(2019, 9, 9);
// 通过数值设置指定时间:时,分,秒,毫秒
t = TDateTime(9, 9, 9, 0); //
// 设置日期时间:年月日时分秒毫秒
t = TDateTime(2019, 9, 9, 9, 9, 9, 0);

// 通过时间戳设置,从1899年12月30日起按天计数
// 整数表示天数,小数表示时间,0.5表示12小时
t = TDateTime(0.5);

// 字符串转日期及时间
t = StrToDateTime(L"2019/09/09 09:09:09");
t = StrToDate(L"2019/09/09");
t = StrToTime(L"23:45:56");


// 获取星期几
int dow = DayOfWeek(t);

- 阅读全文 -

Linux应用程序--网络连接状态


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <stdint.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <linux/if.h>
#include <linux/sockios.h>
#include <linux/ethtool.h>

//---------------------------------------------------------------
/*
 * 功能描述: 通过MII接口,访问PHY寄存器来确认网络连接状态
 * 参数说明: if_name - 网络接口名("eth0")
 * 返 回 值: 1 - 连接正常
 *            0 - 断开连接
 *           -1 - 错误
 */
int mii_link_status(char *ifname)
{
  int skfd;
  struct ifreq ifr;
  uint16_t *pdata;
  uint16_t mii_val;
  uint16_t phy_id;

  if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) == 0)
  {
    return -1;
  }

  /* Get the vitals from the interface. */
  strncpy(ifr.ifr_name, ifname, IFNAMSIZ);

  if (ioctl(skfd, SIOCGMIIPHY, &ifr) < 0)
  {
    fprintf(stderr, "SIOCGMIIPHY on %s failed: %s\n", ifname, strerror(errno));
    close(skfd);
    return -2;
  }

  pdata    = (uint16_t *)(&ifr.ifr_data);
  phy_id   = pdata[0];
  pdata[1] = 1;
  if (ioctl(skfd, SIOCGMIIREG, &ifr) < 0)
  {
    fprintf(stderr, "SIOCGMIIREG on %s failed: %s\n", ifr.ifr_name, strerror(errno));
    return -3;
  }

  close(skfd);

  mii_val = pdata[3];
  return (((mii_val & 0x0016) == 0x0004) ? 0 : 1);
}
//---------------------------------------------------------------
/*
 * 功能描述: 通过SIOCETHTOOL命令获取网络连接状态
 * 参数说明: if_name - 网络接口名("eth0")
 * 返 回 值: 1 - 连接正常
 *            0 - 断开连接
 *           -1 - 错误
 */
int get_netlink_status(const char *if_name)
{
  int skfd;
  struct ifreq ifr;
  struct ethtool_value edata;
  edata.cmd = ETHTOOL_GLINK;
  edata.data = 0;
  memset(&ifr, 0, sizeof(ifr));
  strncpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name) - 1);
  ifr.ifr_data = (char *)&edata;
  if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) == 0)
  {
    return -1;
  }
  if (ioctl(skfd, SIOCETHTOOL, &ifr) == -1)
  {
    close(skfd);
    return -1;
  }
  close(skfd);
  return edata.data;
}
//---------------------------------------------------------------
int main(int argc, char* argv[])
{
  int ret;
  
  if (argc != 2)
  {
    fprintf(stderr, "usage: %s eth0 \r\n", argv[0]);
    return -1;
  }
  
  // 只有超级用户才有权限操作
  if (getuid() != 0)
  {
    fprintf(stderr, "only root can do it.\n");
    return 1;
  }
  while(1)
  {
    // 方法一:SIOCETHTOOL
    ret = get_netlink_status(argv[1]);
    if(ret == 1)
    {
      printf("[SIOCETHTOOL] net link up.\r\n");
    }
    else
    {
      printf("[SIOCETHTOOL] net link down.\r\n");
    }

    // 方法二:读取PHY寄存器方式
    ret = mii_link_status(argv[1]);
    if(ret == 0)
    {
      printf("[SIOCGMIIREG] net link up.\r\n"); 
    }
    else
    {
      printf("[SIOCGMIIREG] net link down.\r\n"); 
    }

    sleep(2);
  }
  return 0;
}
//---------------------------------------------------------------

- 阅读全文 -

C++Builder--INI配置文件读写


软件版本: Borland C++ Builder 6.0

#include <inifiles.hpp> 

// 读配置文件
TIniFile *ini;

// 打开配置文件,如果不存在则创建
ini  = new TIniFile(".\\configs.ini"); 
// 字段-键值-失败时默认值                      
Top  = ini->ReadInteger("Form", "Top", 100);                 //读入一个整型
Left = ini->ReadInteger("Form", "Left", 100);                //读入一个整型
Caption = ini->ReadString( "Form", "Caption", "HelloWorld"); //读入一个字符串
delete ini;

//写配置文件
TIniFile *ini;
ini = new TIniFile(".\\configs.ini");
ini->WriteInteger("Form", "Top", 10);          //写整型
ini->WriteFloat("Form","Float", 3.1415926);    //写浮点型
ini->WriteBool("Form", "Enable", true);        //写布尔型(0,1)
ini->WriteString ("Form", "Caption", Caption); //写字符串
delete ini;

配置文件: configs.ini

[From]
Top  = 10
Left = 10
Float = 3.1415926
Enable = true
Caption = Hello World

说明:
第1个参数表示字段名;
第2个参数表示小节名;
第3个参数为默认值;

- 阅读全文 -


Copyright©2025 春天花会开, All Rights Reserved. Email: webmaster@oroct.com