Извлечение аудио из видео с помощью autogen ffmpeg C# в Unity

Привет, я использую ffmpeg autogen для извлечения аудио из видео в Unity, но когда я следую этому коду, запись в файл не может быть записана, это 0Kb, поэтому в чем проблема этого или у кого-то есть примеры для извлечения аудио с использованием этой библиотеки, извиняюсь за мой английский. Это github библиотеки: https://github.com/Ruslan-B/FFmpeg.AutoGen

unsafe void TestExtractAudio()
{

    string inFile = Application.streamingAssetsPath + "/" + strFileName;
    string outFile = Application.streamingAssetsPath + "/" + strFileNameAudio;

    AVOutputFormat* outFormat = null;
    AVFormatContext* inFormatContext = null;
    AVFormatContext* outFormatContext = null;
    AVPacket packet;

    ffmpeg.av_register_all();

    inFormatContext = ffmpeg.avformat_alloc_context();
    outFormatContext = ffmpeg.avformat_alloc_context();

    if (ffmpeg.avformat_open_input(&inFormatContext, inFile, null, null) < 0)
    {
        throw new ApplicationException("Could not open input file.");
    }

    if (ffmpeg.avformat_find_stream_info(inFormatContext, null) < 0)
    {
        throw new ApplicationException("Failed to retrieve input stream info.");
    }

    ffmpeg.avformat_alloc_output_context2(&outFormatContext, null, null, outFile);
    if (outFormatContext == null)
    {
        throw new ApplicationException("Could not create output context");
    }

    outFormat = outFormatContext->oformat;

    AVStream* inStream = inFormatContext->streams[1];
    AVStream* outStream = ffmpeg.avformat_new_stream(outFormatContext, inStream->codec->codec);
    if (outStream == null)
    {
        throw new ApplicationException("Failed to allocate output stream.");
    }

    if (ffmpeg.avcodec_copy_context(outStream->codec, inStream->codec) < 0)
    {
        throw new ApplicationException("Couldn't copy input stream codec context to output stream codec context");
    }

    outFormatContext->audio_codec_id = AVCodecID.AV_CODEC_ID_MP3;

    int retcode = ffmpeg.avio_open(&outFormatContext->pb, outFile, ffmpeg.AVIO_FLAG_WRITE);
    if (retcode < 0)
    {
        throw new ApplicationException("Couldn't open output file");
    }

    int returnCode = ffmpeg.avformat_write_header(outFormatContext, null);

    if (returnCode < 0)
    {
        throw new ApplicationException("Error occurred opening output file.");
    }

    while (true)
    {
        if (ffmpeg.av_read_frame(inFormatContext, &packet) < 0)
        {
            break;
        }

        if (packet.stream_index == 1)
        {

            inStream = inFormatContext->streams[1];
            outStream = outFormatContext->streams[0];

            // TODO: Replicate log packet functionality to print out what's inside the packet.

            packet.pts = ffmpeg.av_rescale_q_rnd(packet.pts, inStream->time_base, outStream->time_base,
                AVRounding.AV_ROUND_NEAR_INF | AVRounding.AV_ROUND_PASS_MINMAX);
            packet.dts = ffmpeg.av_rescale_q_rnd(packet.dts, inStream->time_base, outStream->time_base,
                AVRounding.AV_ROUND_NEAR_INF | AVRounding.AV_ROUND_PASS_MINMAX);

            packet.duration = ffmpeg.av_rescale_q(packet.duration, inStream->time_base, outStream->time_base);

            int returncode = ffmpeg.av_interleaved_write_frame(outFormatContext, &packet);

        }

        ffmpeg.av_packet_unref(&packet);
    }

    ffmpeg.av_write_trailer(outFormatContext);


    ffmpeg.avformat_close_input(&inFormatContext);

    ffmpeg.avformat_free_context(outFormatContext);

    Console.WriteLine("Press any key to continue...");

    Console.ReadKey();
}

значение returnCode возвращает меньше 0, так что кто-то может это исправить, большое спасибо за это

0 ответов

Проблема здесь:

inStream = inFormatContext->streams[1];
outStream = outFormatContext->streams[0];

Этот код:

ffmpeg.av_interleaved_write_frame

выполняет следующую проверку

static int check_packet(AVFormatContext *s, AVPacket *pkt)
{
if (pkt->stream_index < 0 || pkt->stream_index >= s->nb_streams) {
    av_log(s, AV_LOG_ERROR, "Invalid packet stream index: %d\n"
}

вам нужно изменить packet.stream_index от 1 до 0 перед звонком int returncode = ffmpeg.av_interleaved_write_frame(outFormatContext, &packet);

Видеть:

if (type == AVMediaType.AVMEDIA_TYPE_AUDIO){

    inStream = inFormatContext->streams[1];
    outStream = outFormatContext->streams[0];

    // TODO: Replicate log packet functionality to print out what's inside the packet.

    ffmpeg.av_packet_rescale_ts(&packet, inStream->time_base, outStream->time_base);

    packet.stream_index = 0;

    int returncode = ffmpeg.av_write_frame(outFormatContext, &packet);

}
Другие вопросы по тегам