Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
22272f61
F
Ffmpeg
项目概览
小白菜888
/
Ffmpeg
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
Ffmpeg
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
22272f61
编写于
1月 21, 2011
作者:
A
Anton Khirnov
提交者:
Janne Grunau
1月 22, 2011
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
mp3enc: support for id3v2.3 tags using a per-muxer AVOption
fixes issue2562. Signed-off-by:
N
Janne Grunau
<
janne-ffmpeg@jannau.net
>
上级
cb6bc576
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
36 addition
and
11 deletion
+36
-11
libavformat/mp3enc.c
libavformat/mp3enc.c
+36
-11
未找到文件。
libavformat/mp3enc.c
浏览文件 @
22272f61
...
...
@@ -24,6 +24,7 @@
#include "id3v1.h"
#include "id3v2.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/opt.h"
static
int
id3v1_set_string
(
AVFormatContext
*
s
,
const
char
*
key
,
uint8_t
*
buf
,
int
buf_size
)
...
...
@@ -148,7 +149,26 @@ AVOutputFormat mp2_muxer = {
#endif
#if CONFIG_MP3_MUXER
static
int
id3v2_check_write_tag
(
AVFormatContext
*
s
,
AVMetadataTag
*
t
,
const
char
table
[][
4
])
typedef
struct
MP3Context
{
const
AVClass
*
class
;
int
id3v2_version
;
}
MP3Context
;
static
const
AVOption
options
[]
=
{
{
"id3v2_version"
,
"Select ID3v2 version to write. Currently 3 and 4 are supported."
,
offsetof
(
MP3Context
,
id3v2_version
),
FF_OPT_TYPE_INT
,
4
,
3
,
4
,
AV_OPT_FLAG_ENCODING_PARAM
},
{
NULL
},
};
static
const
AVClass
mp3_muxer_class
=
{
"MP3 muxer"
,
av_default_item_name
,
options
,
LIBAVUTIL_VERSION_INT
,
};
static
int
id3v2_check_write_tag
(
AVFormatContext
*
s
,
AVMetadataTag
*
t
,
const
char
table
[][
4
],
enum
ID3v2Encoding
enc
)
{
uint32_t
tag
;
int
i
;
...
...
@@ -158,21 +178,23 @@ static int id3v2_check_write_tag(AVFormatContext *s, AVMetadataTag *t, const cha
tag
=
AV_RB32
(
t
->
key
);
for
(
i
=
0
;
*
table
[
i
];
i
++
)
if
(
tag
==
AV_RB32
(
table
[
i
]))
return
id3v2_put_ttag
(
s
,
t
->
value
,
NULL
,
tag
,
ID3v2_ENCODING_UTF8
);
return
id3v2_put_ttag
(
s
,
t
->
value
,
NULL
,
tag
,
enc
);
return
-
1
;
}
/**
* Write an ID3v2
.4
header at beginning of stream
* Write an ID3v2 header at beginning of stream
*/
static
int
mp3_write_header
(
struct
AVFormatContext
*
s
)
{
MP3Context
*
mp3
=
s
->
priv_data
;
AVMetadataTag
*
t
=
NULL
;
int
totlen
=
0
;
int
totlen
=
0
,
enc
=
mp3
->
id3v2_version
==
3
?
ID3v2_ENCODING_UTF16BOM
:
ID3v2_ENCODING_UTF8
;
int64_t
size_pos
,
cur_pos
;
put_be32
(
s
->
pb
,
MKBETAG
(
'I'
,
'D'
,
'3'
,
0x04
));
/* ID3v2.4 */
put_be32
(
s
->
pb
,
MKBETAG
(
'I'
,
'D'
,
'3'
,
mp3
->
id3v2_version
));
put_byte
(
s
->
pb
,
0
);
put_byte
(
s
->
pb
,
0
);
/* flags */
...
...
@@ -181,22 +203,24 @@ static int mp3_write_header(struct AVFormatContext *s)
put_be32
(
s
->
pb
,
0
);
ff_metadata_conv
(
&
s
->
metadata
,
ff_id3v2_34_metadata_conv
,
NULL
);
ff_metadata_conv
(
&
s
->
metadata
,
ff_id3v2_4_metadata_conv
,
NULL
);
if
(
mp3
->
id3v2_version
==
4
)
ff_metadata_conv
(
&
s
->
metadata
,
ff_id3v2_4_metadata_conv
,
NULL
);
while
((
t
=
av_metadata_get
(
s
->
metadata
,
""
,
t
,
AV_METADATA_IGNORE_SUFFIX
)))
{
int
ret
;
if
((
ret
=
id3v2_check_write_tag
(
s
,
t
,
ff_id3v2_tags
))
>
0
)
{
if
((
ret
=
id3v2_check_write_tag
(
s
,
t
,
ff_id3v2_tags
,
enc
))
>
0
)
{
totlen
+=
ret
;
continue
;
}
if
((
ret
=
id3v2_check_write_tag
(
s
,
t
,
ff_id3v2_4_tags
))
>
0
)
{
if
((
ret
=
id3v2_check_write_tag
(
s
,
t
,
mp3
->
id3v2_version
==
3
?
ff_id3v2_3_tags
:
ff_id3v2_4_tags
,
enc
))
>
0
)
{
totlen
+=
ret
;
continue
;
}
/* unknown tag, write as TXXX frame */
if
((
ret
=
id3v2_put_ttag
(
s
,
t
->
key
,
t
->
value
,
MKBETAG
(
'T'
,
'X'
,
'X'
,
'X'
),
ID3v2_ENCODING_UTF8
))
<
0
)
if
((
ret
=
id3v2_put_ttag
(
s
,
t
->
key
,
t
->
value
,
MKBETAG
(
'T'
,
'X'
,
'X'
,
'X'
),
enc
))
<
0
)
return
ret
;
totlen
+=
ret
;
}
...
...
@@ -214,12 +238,13 @@ AVOutputFormat mp3_muxer = {
NULL_IF_CONFIG_SMALL
(
"MPEG audio layer 3"
),
"audio/x-mpeg"
,
"mp3"
,
0
,
sizeof
(
MP3Context
)
,
CODEC_ID_MP3
,
CODEC_ID_NONE
,
mp3_write_header
,
mp3_write_packet
,
mp3_write_trailer
,
AVFMT_NOTIMESTAMPS
,
.
priv_class
=
&
mp3_muxer_class
,
};
#endif
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录