ffmeg移植到arm linux,Arm-Linux 移植 FFMPEG库 + x264

cd ../ffmpeg3.4.1

编写以下脚本

##

# mk_ffmpeg3.4.1.sh

# SCHIPS

# schips@dingtalk.com

# https://gitee.com/schips/

# Mon Sep :: PM HKT

##

#!/bin/sh

OUTPUT=/home/schips/arm/ffmpeg/install/ffmpeg

X264_DIR=/home/schips/arm/ffmpeg/install/x264/

MYGCC=arm-none-linux-gnueabi

mkdir $OUTPUT -p && rm $OUTPUT/* -rf

./configure \

--cross-prefix=$MYGCC- \

--enable-cross-compile \

--target-os=linux \

--cc=$MYGCC-gcc \

--arch=arm \

--prefix=$OUTPUT \

--enable-shared \

--enable-static \

--enable-gpl \

--enable-nonfree \

--enable-ffmpeg \

--disable-ffplay \

--enable-ffserver \

--enable-swscale \

--enable-pthreads \

--disable-armv5te \

--disable-armv6 \

--disable-armv6t2 \

--disable-yasm \

--disable-stripping \

--enable-libx264 \

--extra-cflags=-I$X264_DIR/include \

--extra-ldflags=-L$X264_DIR/lib

make clean && make && make install

exit

配置完成以后可能会有这个警告,但是不影响后续的结果

ac1bf563549e844d7d01db5fb0a4da61.png

开发板准备:

拷贝 x264中的make install 以后生成的lib下的所有文件到板子上的/usr/lib 中

9794a67d634ff86a2fa2615d309b362b.png

同样地,拷贝ffmpeg中的lib到板子上

ea9e7b3d312024e68150af99e8c9cf27.png

测试:

ffmpeg -f video4linux2 -s 320x240 -i /dev/video0 /mnt/tmp/test.avi

video4linux2 代表Linux下

/dev/video0代表摄像头设备

/mnt/tmp/test.avi代表输出路径

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ffmpeg硬件解码demo主要是通过调用ffmpeg中的接口来实现硬件加速解码功能。下面是一个简单的示例代码: ```c++ #include <stdio.h> #include <stdbool.h> #include <SDL2/SDL.h> #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libavutil/imgutils.h> int main(int argc, char* argv[]) { // 初始化FFmpeg av_register_all(); avformat_network_init(); // 打开视频文件 AVFormatContext* formatCtx = avformat_alloc_context(); if (avformat_open_input(&formatCtx, argv[1], NULL, NULL) != 0) { printf("无法打开输入文件\n"); return -1; } if (avformat_find_stream_info(formatCtx, NULL) < 0) { printf("无法获取流信息\n"); return -1; } // 查找视频流 int videoStreamIndex = -1; for (int i = 0; i < formatCtx->nb_streams; i++) { if (formatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) { videoStreamIndex = i; break; } } if (videoStreamIndex == -1) { printf("无法找到视频流\n"); return -1; } // 获取解码器 AVCodec* codec = avcodec_find_decoder(formatCtx->streams[videoStreamIndex]->codecpar->codec_id); if (codec == NULL) { printf("找不到解码器\n"); return -1; } // 打开解码器 AVCodecContext* codecCtx = avcodec_alloc_context3(codec); if (avcodec_parameters_to_context(codecCtx, formatCtx->streams[videoStreamIndex]->codecpar) != 0) { printf("无法打开解码器\n"); return -1; } if (avcodec_open2(codecCtx, codec, NULL) < 0) { printf("无法打开解码器\n"); return -1; } // 创建SDL窗口 SDL_Window* window = SDL_CreateWindow("FFmpeg硬件解码Demo", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, codecCtx->width, codecCtx->height, SDL_WINDOW_OPENGL); if (window == NULL) { printf("无法创建窗口\n"); return -1; } // 创建SDL渲染器 SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0); AVFrame* frame = av_frame_alloc(); AVPacket packet; // 读取视频帧并渲染 bool quit = false; while (!quit) { if (av_read_frame(formatCtx, &packet) < 0) { break; } if (packet.stream_index == videoStreamIndex) { avcodec_send_packet(codecCtx, &packet); while (avcodec_receive_frame(codecCtx, frame) == 0) { SDL_RenderClear(renderer); // 将帧数据复制到纹理 SDL_Texture* texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_YV12, SDL_TEXTUREACCESS_STREAMING, codecCtx->width, codecCtx->height); SDL_UpdateYUVTexture(texture, NULL, frame->data[0], frame->linesize[0], frame->data[1], frame->linesize[1], frame->data[2], frame->linesize[2]); SDL_RenderCopy(renderer, texture, NULL, NULL); SDL_RenderPresent(renderer); SDL_DestroyTexture(texture); SDL_Event event; SDL_PollEvent(&event); if (event.type == SDL_QUIT) { quit = true; break; } } } av_packet_unref(&packet); } // 释放资源 av_frame_free(&frame); avcodec_close(codecCtx); avformat_close_input(&formatCtx); return 0; } ``` 这个示例代码使用了SDL来进行窗口和渲染器的创建,通过SDL播放解码后的视频帧。其中,ffmpeg提供了相关的接口方法来实现视频文件的打开、流信息的获取、解码器的查找和打开、帧的解码等功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值