/usr/bin/ld: warning: libswresample.so.1, needed by /usr/lib/gcc/i686-linux-gnu/4.9/../../../../lib/

本文介绍了一个使用FFMPEG库实现的简单程序,该程序能够从指定的音视频文件中分离出音频和视频数据流,并将它们分别保存到不同的文件中。此示例代码展示了如何打开媒体文件、读取数据包并根据数据流类型进行处理。

利用FFMPEG简单分离音视频数据流

测试源码来源于:http://my.oschina.net/u/2336532/blog/399058

#include <stdio.h>

#include "libavformat/avformat.h"

 

static const char *media_file = "11.mp4";

int main(void)

{

    int i, vid_idx, aud_idx;

    FILE *fp_vides = NULL, *fp_audes = NULL;

    AVFormatContext *pFormatCtx = NULL;

    AVPacket pkt;

 

    av_register_all();

    avformat_open_input(&pFormatCtx, media_file, NULL, NULL);

    avformat_find_stream_info(pFormatCtx, NULL);

 

    fp_vides = fopen("vid_es.dat", "wb");

    fp_audes = fopen("aud_es.dat", "wb");

    // 1, handle stream info

    for (i=0; i<pFormatCtx->nb_streams; i++)

    {

        if (pFormatCtx->streams[i]->codec->codec_type ==AVMEDIA_TYPE_VIDEO)

            vid_idx = i;

        else if (pFormatCtx->streams[i]->codec->codec_type ==AVMEDIA_TYPE_AUDIO)

            aud_idx = i;

        else

            ;//such as subtitile

    }

    while (av_read_frame(pFormatCtx, &pkt) >= 0)

    {

        // 2, handle pkt data

        if (pkt.stream_index == vid_idx)

            fwrite(pkt.data, pkt.size, 1, fp_vides);

        else if (pkt.stream_index == aud_idx)

            fwrite(pkt.data, pkt.size, 1, fp_audes);

        else

            ;// such as subtitile

        av_free_packet(&pkt);

    }

    fclose(fp_vides);

    fclose(fp_audes);

    avformat_close_input(&pFormatCtx);

    return 0;

}



解决方案:

gcc -o ffmpegtest acc.c -lavformat -lavcodec -lavutil -lz -lm -lswresample

在交叉编译或本地编译过程中,链接器 `/usr/bin/ld` 报出类似 `/usr/lib/gcc/aarch64-linux-gnu/8/../../../aarch64-linux-gnu/libselinux.so` 的链接错误,通常表明链接器无法正确解析某个符号,例如缺少依赖库或版本不兼容。这类问题常见于嵌入式系统(如基于 RK3399Pro 的平台)或使用特定交叉编译工具链的场景。 以下是一些可能的解决方案: ### 1. 确保所有依赖库已正确安装 缺少某些基础库(如 `libselinux`、`libcurl`、`libcairo` 或 `zlib`)可能导致链接失败。可以通过以下命令安装相关库: ```bash sudo apt-get install libselinux1-dev libcurl4-openssl-dev libcairo2-dev zlib1g-dev ``` ### 2. 检查链接顺序与链接器标志 在链接过程中,库的顺序非常重要。应确保 `-l` 标志的顺序与依赖关系一致。例如,若某个库 A 依赖于库 B,则应在命令行中先链接 A,后链接 B。此外,确保使用 `-lz` 来链接 `zlib`,或 `-ldl` 来支持动态加载符号[^2]。 ### 3. 使用 `pkg-config` 指定依赖库 通过 `pkg-config` 工具可以自动获取编译和链接所需的标志。例如,在编译时可以使用: ```bash gcc $(pkg-config --cflags --libs libselinux libcurl libcairo) your_source.c -o your_program ``` ### 4. 静态库与动态库冲突 如果同时存在静态库(`.a`)和共享库(`.so`),链接器可能选择错误的版本。可以使用 `-Wl,-Bdynamic` 或 `-Wl,-Bstatic` 来强制链接器选择特定类型。例如: ```bash gcc your_source.c -Wl,-Bdynamic -lselinux -Wl,-Bstatic -lcurl -o your_program ``` ### 5. 检查交叉编译工具链配置 在使用交叉编译工具链(如 Linaro GCC)时,应确保所有路径正确设置,包括 `CC` 和 `CXX` 变量。例如: ```bash CC=/opt/gcc-linaro-7.5.0/bin/aarch64-linux-gnu-gcc CXX=/opt/gcc-linaro-7.5.0/bin/aarch64-linux-gnu-g++ ./configure --host=aarch64-linux-gnu --prefix=/path/to/install ``` ### 6. 更新或重新安装 `libselinux` 若 `libselinux` 本身存在问题,可尝试更新或重新安装: ```bash sudo apt update sudo apt install --reinstall libselinux1-dev ``` ### 7. 检查库版本兼容性 某些情况下,`libselinux` 的版本可能与项目所需的 API 不兼容。可以尝试从源码构建并安装最新版本的 `libselinux`。 ### 8. 使用 `ldd` 检查共享库依赖 对于已生成的可执行文件或共享库,可以使用 `ldd` 命令检查其依赖项: ```bash ldd your_program ``` 这有助于发现缺失的依赖项或路径问题。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值