ffmpeg支持mpeg4,openh264,x264编码器实践

参考 Ubuntu20.04 编译安装 FFmpeg 详细教程_ffmpeg --enable-sdl-CSDN博客

1,更新Ubuntu环境

更新清华源,中科大源

2,下载FFMPEG代码

3,安装yasm nasm

sudo apt install yasm 

sudo apt intall nasm

4,安装依赖库

sudo apt-get install libgmp3-dev
sudo apt install pkg-config
sudo apt install gnutls-bin
sudo aptitude install libaom-dev
sudo aptitude install libass-dev
sudo aptitude install libbluray-dev
sudo aptitude install libfdk-aac-dev
sudo aptitude install libmp3lame-dev
sudo aptitude install libopencore-amrnb-dev
sudo aptitude install libopencore-amrwb-dev
sudo aptitude install libopenmpt-dev
sudo aptitude install libopus-dev
sudo aptitude install libshine-dev
sudo aptitude install libsnappy-dev
sudo aptitude install libsoxr-dev
sudo aptitude install libspeex-dev
sudo aptitude install libtheora-dev
sudo aptitude install libtwolame-dev
sudo aptitude install libvo-amrwbenc-dev
sudo aptitude install llibvpx-dev
sudo aptitude install libwavpack-dev
sudo aptitude install libwebp-dev
sudo aptitude install libx264-dev
sudo aptitude install libx265-dev
sudo aptitude install libxvidcore-dev
sudo aptitude install liblzma-dev

5,安装gcc g++

sudo aptitude install build-essential

6,下载SDL2

有些朋友肯定好奇,我们明明在编译安装 FFmpeg,这里为什么要下载 SDL2。这是因为,SDL是编译 ffplayer 所必须的外部库,而 Ubuntu 环境并不会对其默认安装,故而需要用户手动安装。而 SDL1 有些过时,目前使用广泛的是 SDL2,因此这里推荐安装SDL2

SDL 下载地址:http://www.libsdl.org/download-2.0.php
下载后,同样解压,然后进入加压目录
S1执行命令:./configure --prefix=/usr/local
S2执行命令:sudo make
S3执行命令:sudo make install
 

7,编译 FFMPEG

./configure --enable-gpl  --enable-libass  --enable-libfdk-aac  --enable-libfreetype  --enable-libmp3lame   --enable-libopus  --enable-libvorbis  --enable-libvpx  --enable-libx264  --enable-libx265  --enable-nonfree

8,opencv编译

cmake \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=ON \
-D BUILD_DOCS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_PACKAGE=OFF \
-D BUILD_EXAMPLES=OFF \
-D WITH_TBB=ON \
-D ENABLE_FAST_MATH=1 \
-D CUDA_FAST_MATH=1 \
-D WITH_CUDA=ON \
-D WITH_CUBLAS=ON \
-D WITH_CUFFT=ON \
-D WITH_NVCUVID=ON \
-D WITH_IPP=OFF \
-D WITH_V4L=ON \
-D WITH_1394=OFF \
-D WITH_GTK=ON \
-D WITH_QT=OFF \
-D WITH_OPENGL=ON \
-D WITH_EIGEN=ON \
-D WITH_FFMPEG=ON \
-D WITH_GSTREAMER=ON \
-D BUILD_JAVA=OFF \
-D BUILD_opencv_python3=ON \
-D BUILD_opencv_python2=OFF \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D OPENCV_SKIP_PYTHON_LOADER=ON \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_ENABLE_NONFREE=ON \
-D OPENCV_EXTRA_MODULES_PATH=~/github/opencv_contrib-4.8.1/modules \
-D WITH_CUDNN=ON \
-D OPENCV_DNN_CUDA=ON \
-D CUDA_ARCH_BIN=8.6 \
-D CUDA_ARCH_PTX=8.6 \
-D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-11.7/ \
-D PYTHON_DEFAULT_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)") \
-D PYTHON3_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)") \
-D PYTHON3_NUMPY_INCLUDE_DIRS=$(python3 -c "import numpy; print (numpy.get_include())") \
-D PYTHON3_PACKAGES_PATH=$(python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")  ..

opencv 编译:

make -j"$(nproc)"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用FFmpeg进行OpenH264解码,你需要按照以下步骤进行操作: 1. 确保你已经安装了OpenH264编解码器库。你可以从OpenH264官方网站下载并安装OpenH264库。 2. 在你的代码中,添加FFmpeg的头文件和链接FFmpeg库。头文件包括`<libavcodec/avcodec.h>`,`<libavformat/avformat.h>`,`<libavutil/avutil.h>`和`<libswscale/swscale.h>`。 3. 创建一个AVFormatContext对象,并使用avformat_open_input函数打开你的输入视频文件。 ```c AVFormatContext *format_ctx = avformat_alloc_context(); if (avformat_open_input(&format_ctx, input_file, NULL, NULL) != 0) { // 处理打开输入文件失败的情况 return -1; } ``` 4. 使用avformat_find_stream_info函数查找视频流的相关信息。 ```c if (avformat_find_stream_info(format_ctx, NULL) < 0) { // 处理查找流信息失败的情况 return -1; } ``` 5. 找到视频流的索引。 ```c int video_stream_index = -1; for (int i = 0; i < format_ctx->nb_streams; i++) { if (format_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { video_stream_index = i; break; } } if (video_stream_index == -1) { // 处理找不到视频流的情况 return -1; } ``` 6. 获取视频解码器参数。 ```c AVCodecParameters *codec_params = format_ctx->streams[video_stream_index]->codecpar; ``` 7. 查找OpenH264解码器。 ```c AVCodec *codec = avcodec_find_decoder_by_name("libopenh264"); if (!codec) { // 处理找不到解码器的情况 return -1; } ``` 8. 创建解码器上下文并将解码器参数复制到上下文。 ```c AVCodecContext *codec_ctx = avcodec_alloc_context3(codec); if (!codec_ctx) { // 处理创建解码器上下文失败的情况 return -1; } if (avcodec_parameters_to_context(codec_ctx, codec_params) < 0) { // 处理复制解码器参数到上下文失败的情况 return -1; } ``` 9. 打开解码器。 ```c if (avcodec_open2(codec_ctx, codec, NULL) < 0) { // 处理打开解码器失败的情况 return -1; } ``` 10. 创建AVFrame对象用于存储解码后的帧数据。 ```c AVFrame *frame = av_frame_alloc(); if (!frame) { // 处理创建帧失败的情况 return -1; } ``` 11. 创建AVPacket对象用于存储压缩数据。 ```c AVPacket packet; av_init_packet(&packet); packet.data = NULL; packet.size = 0; ``` 12. 读取并解码每一帧数据。 ```c while (av_read_frame(format_ctx, &packet) >= 0) { if (packet.stream_index == video_stream_index) { // 解码视频帧 if (avcodec_send_packet(codec_ctx, &packet) == 0) { while (avcodec_receive_frame(codec_ctx, frame) == 0) { // 处理解码后的帧数据 // frame->data[0], frame->data[1], frame->data[2]分别为YUV420格式的Y、U、V平面数据 } } } av_packet_unref(&packet); } ``` 13. 清理资源。 ```c av_frame_free(&frame); avcodec_free_context(&codec_ctx); avformat_close_input(&format_ctx); ``` 这些步骤描述了使用FFmpeg进行OpenH264解码的基本流程。你可以根据自己的需求进行进一步的处理和操作。请注意,上述示例代码仅供参考,具体的实现可能需要根据实际情况进行调整和修改。 希望这能对你有所帮助!如有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值