qq76211822 2023-12-10 17:20 采纳率: 0%
浏览 6
已结题

如何将带有pcm格式的flv文件转换成mp4

ffmpeg 如何将带有pcm格式的flv文件转换成mp4.


```bash
/userdata/Bin/tools/ffmpeg -f flv  -i /tmp/tmp.flv -c:v h264  -acodec pcm_s16le  /tmp/filename.mp4


转换失败了
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-10 20:45
    关注

    【以下回答由 GPT 生成】

    答案:

    要使用C++代码将带有PCM格式的FLV文件转换成MP4,可以使用FFmpeg库来处理音视频数据。下面是一种实现的方法:

    1. 首先,按照FFmpeg的官方指南,下载并安装FFmpeg库。可以从FFmpeg的官方网站(https://www.ffmpeg.org/)获得安装指南。

    2. 确保你的C++项目设置了正确的包含路径和链接路径,以便正确地使用FFmpeg库。

    3. 在C++代码中,包含FFmpeg的头文件:

    extern "C" {
    #include <libavutil/imgutils.h>
    #include <libavformat/avformat.h>
    #include <libavcodec/avcodec.h>
    }
    
    1. 创建一个函数来进行转换:
    int convertFLVtoMP4(const char* inputFileName, const char* outputFileName) {
        av_register_all();
    
        AVFormatContext* inputFormatContext = nullptr;
        int ret = avformat_open_input(&inputFormatContext, inputFileName, nullptr, nullptr);
        if (ret < 0) {
            return ret;
        }
    
        ret = avformat_find_stream_info(inputFormatContext, nullptr);
        if (ret < 0) {
            avformat_close_input(&inputFormatContext);
            return ret;
        }
    
        AVFormatContext* outputFormatContext = nullptr;
        ret = avformat_alloc_output_context2(&outputFormatContext, nullptr, nullptr, outputFileName);
        if (ret < 0) {
            avformat_close_input(&inputFormatContext);
            return ret;
        }
    
        for (unsigned int i = 0; i < inputFormatContext->nb_streams; ++i) {
            AVStream* inputStream = inputFormatContext->streams[i];
            AVCodec* codec = avcodec_find_decoder(inputStream->codecpar->codec_id);
            AVStream* outputStream = avformat_new_stream(outputFormatContext, codec);
            if (outputStream == nullptr) {
                avformat_close_input(&inputFormatContext);
                avformat_free_context(outputFormatContext);
                return AVERROR_UNKNOWN;
            }
    
            ret = avcodec_parameters_copy(outputStream->codecpar, inputStream->codecpar);
            if (ret < 0) {
                avformat_close_input(&inputFormatContext);
                avformat_free_context(outputFormatContext);
                return ret;
            }
        }
    
        ret = avio_open(&outputFormatContext->pb, outputFileName, AVIO_FLAG_WRITE);
        if (ret < 0) {
            avformat_close_input(&inputFormatContext);
            avformat_free_context(outputFormatContext);
            return ret;
        }
    
        ret = avformat_write_header(outputFormatContext, nullptr);
        if (ret < 0) {
            avformat_close_input(&inputFormatContext);
            avformat_free_context(outputFormatContext);
            return ret;
        }
    
        AVPacket packet;
        av_init_packet(&packet);
    
        while (av_read_frame(inputFormatContext, &packet) >= 0) {
            AVStream* inputStream = inputFormatContext->streams[packet.stream_index];
            AVStream* outputStream = outputFormatContext->streams[packet.stream_index];
    
            packet.pts = av_rescale_q_rnd(packet.pts, inputStream->time_base, outputStream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
            packet.dts = av_rescale_q_rnd(packet.dts, inputStream->time_base, outputStream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
            packet.duration = av_rescale_q(packet.duration, inputStream->time_base, outputStream->time_base);
            packet.pos = -1;
    
            ret = av_interleaved_write_frame(outputFormatContext, &packet);
            if (ret < 0) {
                avformat_close_input(&inputFormatContext);
                avformat_free_context(outputFormatContext);
                return ret;
            }
    
            av_packet_unref(&packet);
        }
    
        av_write_trailer(outputFormatContext);
        avformat_close_input(&inputFormatContext);
        avformat_free_context(outputFormatContext);
    
        return 0;
    }
    
    1. 在你的主函数中调用转换函数:
    int main() {
        const char* inputFileName = "/tmp/tmp.flv";
        const char* outputFileName = "/tmp/filename.mp4";
        int ret = convertFLVtoMP4(inputFileName, outputFileName);
        if (ret == 0) {
            std::cout << "转换成功!" << std::endl;
        } else {
            std::cerr << "转换失败:" << ret << std::endl;
        }
    
        return ret;
    }
    

    以上代码会将输入的PCM格式FLV文件转换为MP4格式,并输出转换结果。你可以将inputFileName和outputFileName替换成你实际的文件路径和文件名。

    请确保在编译时链接FFmpeg库,如果你使用的是g++编译器,可以添加以下链接选项:

    -lavformat -lavcodec -lavutil
    

    希望这能帮到你!如果有任何问题,请随时询问。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月11日
  • 创建了问题 12月10日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分