如何将一个H264视频,AAC音频,一个中文字幕,一个英文字幕,合成一个高清MP4中英双字幕的视频文件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将一个H264视频,AAC音频,一个中文字幕,一个英文字幕,合成一个高清MP4中英双字幕的视频文件?相关的知识,希望对你有一定的参考价值。

1. 用火鸟字幕合并工具,把中文字幕、英文字幕合并为一个中英双语的字幕文件(合并时可以选择中文在上或者英文在上)。
2. 用mkvtoolnix软件当中的mmg工具,把视频、音频、字幕添加上去,混流,生成一个mkv文件。
3. 把mkv文件用格式工厂进行转换,目标格式为MP4,在输出配置--附加字幕这里,不需要指定字幕文件,只要设置字幕大小,就可以了。转换完成之后,就得到高清MP4中英双字幕的视频文件了。追问

回答不准确。补充提示,我需要中英字幕的显示效果有明显区别的那种,分别处理2个字幕,而不是简单的合并。

追答

要求高可以用MeGUI,自己写脚本,分别处理视频、音频和字幕。

参考技术A 有Final cut就好办
苹果机
没有就用premiere也行
H.264放入视频轨道
音频放音频轨道
字幕放字幕轨道
生成选MP4格式就行

如何使用 FFMPEG 和 C 将音频和视频写入同一个文件?

【中文标题】如何使用 FFMPEG 和 C 将音频和视频写入同一个文件?【英文标题】:How do I write audio and video to the same file using FFMPEG and C? 【发布时间】:2018-06-29 02:08:00 【问题描述】:

我在 C 程序中使用 ffmpeg 使用音频文件和视频文件。我正在修改音频和视频数据。在处理下面的代码时,我将这些流中的每一个都写入了自己的文件。如何将两个流写入同一个文件?

#include <math.h>
#include <stdint.h>
#include <stdio.h>

// Video resolution
#define W 1280
#define H 720

// Allocate a buffer to store one video frame
unsigned char video_frame[H][W][3] = 0;

int main()

    // Audio pipes
    FILE *audio_pipein = popen("ffmpeg -i data/daft-punk.mp3 -f s16le -ac 1 -", "r");
    FILE *audio_pipeout = popen("ffmpeg -y -f s16le -ar 44100 -ac 1 -i - out/daft-punk.mp3", "w");

    // Video pipes
    FILE *video_pipein = popen("ffmpeg -i data/daft-punk.mp4 -f image2pipe -vcodec rawvideo -pix_fmt rgb24 -", "r");
    FILE *video_pipeout = popen("ffmpeg -y -f rawvideo -vcodec rawvideo -pix_fmt rgb24 -s 1280x720 -r 25 -i - -f mp4 -q:v 5 -an -vcodec mpeg4 out/daft-punk.mp4", "w");

    // Audio vars
    int16_t audio_sample;
    int audio_count;
    int audio_n = 0;

    // Video vars
    int x = 0;
    int y = 0;
    int video_count = 0;

    // Read, modify, and write one audio_sample and video_frame at a time
    while (1)
    
        // Audio
        audio_count = fread(&audio_sample, 2, 1, audio_pipein); // read one 2-byte audio_sample
        if (audio_count == 1)
        
            ++audio_n;
            audio_sample = audio_sample * sin(audio_n * 5.0 * 2 * M_PI / 44100.0);
            fwrite(&audio_sample, 2, 1, audio_pipeout);
        

        // Video
        video_count = fread(video_frame, 1, H * W * 3, video_pipein); // Read a frame from the input pipe into the buffer
        if (video_count == H * W * 3)                                 // Only modify and write if frame exists
        
            for (y = 0; y < H; ++y)     // Process this frame
                for (x = 0; x < W; ++x) // Invert each colour component in every pixel
                
                    video_frame[y][x][0] = 255 - video_frame[y][x][0]; // red
                    video_frame[y][x][1] = 255 - video_frame[y][x][1]; // green
                    video_frame[y][x][2] = 255 - video_frame[y][x][2]; // blue
                
            fwrite(video_frame, 1, H * W * 3, video_pipeout); // Write this frame to the output pipe
        

        // Break if both complete
        if (audio_count != 1 && video_count != H * W * 3)
            break;
    

    // Close audio pipes
    pclose(audio_pipein);
    pclose(audio_pipeout);

    // Close video pipes
    fflush(video_pipein);
    fflush(video_pipeout);
    pclose(video_pipein);
    pclose(video_pipeout);

    return 0;

我从this article获取了此代码的基础。

谢谢!

【问题讨论】:

【参考方案1】:

这被称为 muxing(多路复用 = 共享的花哨词)。 在这里(下面的链接),您会发现易于遵循的示例:打开和写入混合在单个流/文件中的流。您还会注意到该示例使用av_interleaved_write_frame 而不是fwrite。特别检查remuxing.c

示例:https://github.com/FFmpeg/FFmpeg/tree/master/doc/examples

API 参考:https://www.ffmpeg.org/doxygen/trunk/index.html

【讨论】:

谢谢,我通读了它,这似乎是正确的道路。我在运行示例代码时遇到问题,并在此处发布了一个问题 ***.com/questions/51139736/…

以上是关于如何将一个H264视频,AAC音频,一个中文字幕,一个英文字幕,合成一个高清MP4中英双字幕的视频文件?的主要内容,如果未能解决你的问题,请参考以下文章

将h264视频和ADTS-AAC音频转换为MPEG2 TS时的音频同步问题。

笔记- iphone手机音频AAC视频H264推流 iphone手机推流最佳方案

采集音频和摄像头视频并实时H264编码及AAC编码

FLV文件(H264 + AAC)格式超详细分析

FLV文件(H264 + AAC)格式超详细分析

FFmpeg 命令行工具ffmpeg